Canvas学习笔记 | 图片操作

news2025/1/12 4:04:53

图片素材

本篇文章的示例采用下图进行图片操作演示。

图片原始尺寸为:640px * 640px

绘制图片

Canvas中,我们使用drawImage()方法绘制图片。drawImage()方法有如下3种调用方式:

1.drawImage(image, dx, dy)
2.drawImage(image, dx, dy, dw, dh)
3.drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh)

drawImage(image, dx, dy)

语法:

ctx.drawImage(image, dx, dy); 

说明:

  • 参数image表示页面中的图片。图片有两种获取方法:(1)由JS动态创建(2)直接获取DOM中已经存在的图片。
  • 参数dx表示图片左上角的横坐标;
  • 参数dy表示图片左上角的纵坐标;

示例:图片由JS动态创建

示例源码:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>X轴方向上的缓动动画</title><script type="text/javascript" src="ball.js"></script></head><body><canvasid="canvas"width="800"height="800"style="border: 1px dashed #333333"></canvas><script> window.onload = function () {// 1、获取 Canvas 对象var canvas = document.getElementById("canvas");// 2、获取上下文环境对象var ctx = canvas.getContext("2d");// 3、开始绘制图形var image = new Image();image.src = "flower-20221202.png";image.onload = function () {ctx.drawImage(image, 0, 0);};}; </script></body>
</html> 

效果图:

说明:

本示例中,我们通过JS创建了一个Image对象,然后通过设置该对象的src属性指定了图片的路径。最后,我们为Image对象添加了onload事件监听,只有当图片加载完成后再使用drawImage()方法将图片绘制在Canvas上。

注意:只有当图片完全加载后才能将图片绘制到Canvas上。如果图片还未加载完成就调用了drawImage()方法进行图片绘制操作的话,Canvas将不会显示任何图片。

示例:图片来自img元素

示例源码:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>图片操作简单示例</title></head><body><canvasid="canvas"width="800"height="800"style="border: 1px dashed #333333"></canvas><img src="flower-20221202.png" id="pic" style="display: none" /><script> window.onload = function () {// 1、获取 Canvas 对象var canvas = document.getElementById("canvas");// 2、获取上下文环境对象var ctx = canvas.getContext("2d");// 3、开始绘制图形var image = document.getElementById("pic");ctx.drawImage(image, 0, 0);}; </script></body>
</html> 

说明:

本示例中的图片来自于HTML的img元素。这种方式的优点在于在JS执行时图片已经加载完成,不需要使用`image.onload = function () {}'。

drawImage(image, dx, dy, dw, dh)

语法:

ctx.drawImage(image, dx, dy, dw, dh); 

说明:

参数imagedxdydrawImage(image, dx, dy)参数含义一样。

参数dw为图片宽度;参数dh为图片高度。

通过这种方式绘制图片可以先将图片进行缩放,然后再绘制到Canvas中。

示例:裁判图片示例

示例源码:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>图片操作简单示例</title></head><body><canvasid="canvas"width="400"height="400"style="border: 1px dashed #333333"></canvas><img src="flower-20221202.png" id="pic" style="display: none" /><script> window.onload = function () {// 1、获取 Canvas 对象var canvas = document.getElementById("canvas");// 2、获取上下文环境对象var ctx = canvas.getContext("2d");// 3、开始绘制图形var image = document.getElementById("pic");ctx.drawImage(image, 0, 0, 320, 320);}; </script></body>
</html> 

效果图:

说明:

可以看到,图片原始大小为640px * 640px,我们使用drawImage(image, dx, dy, dw, dh)将图片的尺寸缩放到320px * 320px,然后再绘制到Canvas上。

drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh)

语法:

ctx.drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh); 

说明:

参数imagedxdydwdh表示目标图的横坐标、纵坐标、宽度、高度。

参数sxsyswsh表示源图需要截取的范围。sx表示被截取部分的横坐标,sy表示被截取部分的纵坐标,sw表示被截取部分的宽度,sh表示被截取部分的高度。

示例:裁剪图片示例

示例源码:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>裁减图片示例</title></head><body><canvasid="canvas"width="800"height="800"style="border: 1px dashed #333333"></canvas><img src="flower-20221202.png" id="pic" style="display: none" /><script> window.onload = function () {// 1、获取 Canvas 对象var canvas = document.getElementById("canvas");// 2、获取上下文环境对象var ctx = canvas.getContext("2d");// 3、开始绘制图形var image = document.getElementById("pic");ctx.drawImage(image, 200, 200, 300, 300, 0, 0, 300, 300);}; </script><style> * {margin:0;padding:0;}body {display: flex;background: black;align-items: center;justify-content: center;} </style></body>
</html> 

效果图:

说明:

图片裁剪说明如下图:

我们将左侧图片中红色框中的部分绘制到了Canvas (0, 0)位置处。

平铺图片

Canvas中,我们使用createPattern()方法定义图片的平铺方式。

语法:

var pattern = ctx.createPattern(image, type);
ctx.fillStyle = pattern;
ctx.fillRect(); 

示例:

参数image表示被平铺的图片。

参数type表示平铺的方式,type属性取值如下表:

属性值说明
repeat默认值,在水平方向和垂直方向同时平铺
repeat-x在水平方向平铺
repeat-y在垂直方向同时平铺
no-repeat只显示一次,不平铺

平铺图片示例

示例源码:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>图片操作简单示例</title></head><body><canvasid="canvas"width="400"height="400"style="border: 1px dashed #333333"></canvas><img src="vip.svg" id="pic" style="display: none;" /><script> window.onload = function () {var canvas = document.getElementById("canvas");var ctx = canvas.getContext("2d");var image = document.getElementById("pic");var pattern = ctx.createPattern(image, 'repeat-x');ctx.fillStyle = pattern;ctx.fillRect(0, 0, 400, 400);}; </script></body>
</html> 

效果图:

切割图片

Canvas中,我们使用clip()方法切割图片。

语法:

ctx.clip(); 

说明:

使用clip()方法切割图片的步骤:

(1) 绘制基本图形; (2) 使用clip()方法; (3) 绘制图片。

示例:切割图片示例

示例源码:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>图片操作简单示例</title></head><body><canvasid="canvas"width="800"height="800"style="border: 1px dashed #333333"></canvas><img src="flower-20221202.png" id="pic" style="display: none" /><script> window.onload = function () {var canvas = document.getElementById("canvas");var ctx = canvas.getContext("2d");// 第一步:绘制基本图片ctx.beginPath();ctx.arc(400, 400, 320, 0, Math.PI, true);ctx.closePath();ctx.stroke();// 第二步:使用clip()方法ctx.clip();// 第三步,绘制图片var image = document.getElementById("pic");ctx.drawImage(image, 80, 80, 640, 640);}; </script></body>
</html> 

效果图:

说明:

我们使用半圆作为切割区域切割了图片。

最后

整理了75个JS高频面试题,并给出了答案和解析,基本上可以保证你能应付面试官关于JS的提问。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/131627.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Android】带你细看Android input系统中ANR的机制

“本文基于Android13源码&#xff0c;分析Input系统的Anr实现原理“ 在文章之前&#xff0c;先提几个问题&#xff1a; 如果在activity任意周期&#xff08;onCreate,onResume等&#xff09;&#xff0c;同步执行耗时超过5s&#xff08;ANR时间&#xff09;的任务&#xff0c;…

JavaWeb06 AJAX 黑马用Axios实现用户名已存在问题? JSON Vue Element

01-AJAX-概述-替换JSP 02-AJAX-快速入门 03-案例-验证用户是否存在 04-Axios-基本使用&请求方式别名(可读性不强) 练习:用Axios替换AJAX实现用户名是否存在功能 就把原来的.html 2.2步换成下面的响应代码即可 为啥就是不行呢????? 05-JSON-概述和基础语法 06-JSON-…

并发编程——4.共享模型之内存

目录4.共享模型之内存4.1.Java 内存模型4.2.可见性4.2.1.退不出的循环4.2.2.解决办法4.2.3.可见性 vs 原子性4.3.终止模式之两阶段终止模式4.3.1.错误思路4.3.2.两阶段终止模式4.4.同步模式之 Balking4.4.1.定义4.4.2.实现4.5.有序性4.5.1.指令级并行原理4.5.2.案例4.6.原理之 …

LVS详解

一、负载均衡&#xff1a;必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务器集群技术&#xff0c;集群即将相同服务部署在多台服务器上构成一个集群整体对外提供服务&#xff0c;这些集群可以是Web应用服务器集群&#xff0c;也可以是数据库服务…

新冠“照妖镜”,体质弱点现原形。你是啥症状?2023年,请好好善待你的身体!

新冠“照妖镜”&#xff0c;体质弱点现原形。你是啥症状&#xff1f; 阳性之后的不同症状&#xff0c;是我们身体发出的【预警信号】。 病毒进入时&#xff0c;最先攻击我们自身最薄弱的地方。 2023年&#xff0c;请好好【善待】你的身体&#xff01; 症状1 、头疼 出现头痛…

Kurganov-Tadmor二阶中心格式:理论介绍

简介 CFD的核心问题是求解双曲偏微分方程 ∂∂tu(x,t)∂∂xf(u(x,t))0\frac{\partial}{\partial t} u(x, t)\frac{\partial}{\partial x} f(u(x, t))0 ∂t∂​u(x,t)∂x∂​f(u(x,t))0在CFD中&#xff0c;双曲偏微分方程一般使用Godunov型迎风格式求解。但是这种迎风格式往往实…

2022年度学习总结

2022年有焦虑也有成长&#xff0c;记录和总结也是成长的一部分。这一年&#xff0c;我也努力在不确定性中做一些确定的事情&#xff0c;感恩被保护的三年&#xff0c;三年清零抗疫结束&#xff0c;做好自己健康的第一责任人。研一半个学期在网课或者封校中度过&#xff0c;我们…

1.0、Linux-入门概述

1.0、Linux-入门概述 我们为什么要学习 Linux &#xff1f; Linux诞生了这么多年&#xff0c;以前还喊着如何能取代 Windows 系统&#xff0c;现在这个口号已经小多了&#xff0c;任何事物发展都有其局限性&#xff1b;如同现在国内在搞一个社交软件取代 QQ 、微信 一样&#x…

已解决(Python语法报错)SyntaxError: invalid syntax

已解决&#xff08;Python语法报错&#xff09;SyntaxError: invalid syntax 文章目录报错信息报错翻译报错原因解决方法帮忙解决报错信息 粉丝群里面一个小伙伴运行Python代码&#xff0c;但是发生了报错&#xff08;当时他心里瞬间凉了一大截&#xff0c;跑来找我求助&…

IDEA安装与配置教程

一、下载并安装IDEA 1、下载官网&#xff1a; 下载 IntelliJ IDEA &#xff08;这里以Windows系统为例&#xff0c;其他系统类似&#xff09; 2、安装 1、下载完成后&#xff0c;直接点击安装包安装&#xff0c;即可。 2、开始安装&#xff0c;然后下一步 3、可以在此处自定…

算法 - 蓝桥杯并查集题型

目录 合并集合 连通块中点的数量 蓝桥杯2017年第八届真题-合根植物 [蓝桥杯][2019年第十届真题] 修改数组 蓝桥幼儿园 刷了好多题&#xff0c;发现并查集这种思想挺妙的&#xff0c;是时候总结一下了&#xff1b; 作用与基本原理&#xff1a; 套路问题&#xff1a; 用一道…

Mac M1 Pro下载node.js

Mac M1 Pro下载node.js基本信息 Mac M1 Pronode版本&#xff1a;14.20.0npm版本&#xff1a;8.19.3cnpm版本&#xff1a;8.5.1 注意&#xff1a; 我之前是去官网下了最新版本node&#xff0c;但cnpm就是下载不下来&#xff0c;于是查了其他博主的文章&#xff0c;这边通过nvm…

aws codepipeline 配置 ecs 蓝绿部署

参考资料 CI/CD workshop for Amazon ECSTutorial: Create a pipeline with an Amazon ECR source and ECS-to-CodeDeploy deploymentAmazon ECS 计算平台上的部署CodeDeploy AppSpec 文件引用 之前的文章介绍了通过codepipeline对ecs服务进行滚动更新&#xff0c;本文主要介…

Docker 学习总结(78)—— WebAssembly 入门简介

什么是 WebAssembly? WebAssembly 是一种定义二进制指令格式的开放标准&#xff0c;它支持从不同的源语言创建可移植的二进制可执行文件。这些二进制文件可以在各种环境中运行。它起源于 Web&#xff0c;并得到各大主流浏览器的支持。 Wasm 如何在浏览器中工作&#xff1f; …

RCTF-pwn-diary

RCTF-pwn-diary 赛后看了一眼发现给出了源码&#xff0c;https://github.com/ruan777/RCTF2022/blob/main/diary/main.cpp 漏洞是erase的问题 解释一下 add(0) add(1) add(2) delete(1)这样子的话&#xff0c;其实就是把2给删除&#xff0c;把2的内容复制到1中&#xff0c;所…

Base64自定义编码表及破解

什么是Base64 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一&#xff0c;Base64并不是安全领域的加密算法&#xff0c;其实Base64只能算是一个编码算法&#xff0c;对数据内容进行编码来适合传输。标准Base64编码解码无需额外信息即完全可逆&#xff0c;即使你自…

基于Python + Django 开发一款学生管理系统(附源码)

文章目录1.开发环境源码分享&技术交流2.项目实战1&#xff09;创建Django项目2&#xff09;创建应用3&#xff09;配置MySQL4&#xff09;数据模型层创建5&#xff09;路由配置6&#xff09;增删改查视图函数7&#xff09;模板页面创建8&#xff09;启动web服务1.开发环境 …

最大似然和贝叶斯参数估计

统计生成模型的参数估计 – Maximum Likelihood(ML) 假设参数是某个确定的值&#xff0c;通过使似然度最大求出参数 – Bayesian estimation 假设参数是随机变量&#xff0c;估计参数分布的参数 – 最大似然求出具体的参数&#xff0c;贝叶斯求的是参数的分布 最大似然估计 假…

献给自己技术成长的第三年

年度总结词语&#xff1a;幸运 献给自己技术成长的第三年一、五州一都二、if else量产三、学技术四、用真心五、设计精产六、感恩幸运一、五州一都 1.1-1.12成都、2.23-3.19广州、4.12-7.23苏州、8.12-8.20兰州、8.23-9.20湖州、其余杭州 成都。去年年底出差到成都&#xff0c;…

HTTP_day01

在互联网世界里&#xff0c;HTTP 通常跑在 TCP/IP 协议栈之上&#xff0c;依靠 IP 协议实现寻址和路由、TCP 协议实现可靠数据传输、DNS 协议实现域名查找、SSL/TLS 协议实现安全通信。此外&#xff0c;还有一些协议依赖于 HTTP&#xff0c;例如 WebSocket、HTTPDNS 等。这些协…