canvas—基本介绍
参考:https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial/Basic_usage(MDN) 或
https://juejin.cn/post/7116784455561248775#heading-46
一、说明:
1、canvas标签在使用的时候,内部就会创建一个画图的对象(getContext("2d") 或getContext("3d"))【这个对象包含了画图所需要的所有工具集,如画笔】。挂载在这个canvasDOM对象上。
js 可以直接获取这个canvas标签 对象对应的画图对象ctx。
2、通过这个ctx对象,描述画什么样的图画(ctx对象可以理解成是一个画笔)。
3、使用stroke() 或者 fill() 方法把ctx描述的图画呈现出来。
注:上面的2、3步骤可以合并在一起,步骤2的描述可以作为步骤3(步骤3 API的变形)的参数。如,fillText(text,x,y) 或 strokeText(text,x,y)。
总结:canvas在js使用分3个步骤:获取canvas标签的DOM对象,从DOM对象中取出画图对象ctx;使用画图对象ctx描述所画的图像;将描述的图像呈现从来。
画图对象ctx常用的API:https://www.cnblogs.com/liugang-vip/p/5360283.html
二、绘制API介绍:
不同于 SVG,<canvas> 只支持两种形式的图形绘制:矩形和路径(由一系列点连成的线段)。所有其他类型的图形都是通过一条或者多条路径组合而成的。不过,我们拥有众多路径生成的方法让复杂图形的绘制成为了可能。
注意:canvas 只是在形状的绘制上只支持两种形式,但是canvas还可以绘制 文字、图像。
- 绘制矩形:canvas提供了三中方法绘制矩形
- fillRect(x,y,width,height)
- strokeRect(x,y,width,height)
- clearRect(x,y,width,height)
绘制路径:绘制路径用到的函数 - beginPath() :本质上,路径是由很多子路径构成,这些子路径都是在一个列表中,所有的子路径(线、弧形、等等)构成图形。而每次这个方法调用之后,列表清空重置,然后我们就可以重新绘制新的图形。
即:调用 beginPath 是为了把前面的路径列表清空,所以一开始画路径时,beginPath可以不写的(即使写了,也没什么用)。 - moveTo():画路径时(圆弧除外),这函数必须要有,不然无法画出。可以理解为笔要先移动到画布上某个点才能开始画。
圆弧是通过圆心定位后画图的,所以不用调用 moveTo() - closePath():闭合路径,有的路径本身就是闭合的(如,rect路径)就不需要closePath了。这个方法会通过绘制一条从当前点到开始点的直线来闭合图形。如果图形是已经闭合了的,即当前点为开始点,该函数什么也不做。
- stroke():通过线条来绘制图形轮廓。
- fill():当你调用 fill() 函数时,所有没有闭合的形状都会自动闭合,所以你不需要调用 closePath() 函数。但是调用 stroke() 时不会自动闭合。
总结:beginPath 和 closePath 两者的处理的不是一个东西。beginPath 是 清除 路径列表,closePath 是闭合路径(功能上是补了一条路径)。
- 绘制 不同的路径有不同的API :
- 线:
- lineTo(x,y): 绘制一条从moveTo指定点 到 目标点(xy坐标)的直线。
- 圆弧:
- arc(x, y, radius, startAngle, endAngle, anticlockwise)
以(x,y)为圆心,以 radius 为半径的圆弧(圆),从 startAngle(弧度) 开始到 endAngle 结束,按照 anticlockwise 给定的方向(默认为顺时针)来生成。 - arcTo(x1, y1, x2, y2, radius) :不过这个的实现并不是那么的可靠(MDN上说的)。
- arc(x, y, radius, startAngle, endAngle, anticlockwise)
- 贝塞尔曲线
- 矩形:
- rect(x,y,width,height)
- 线:
-
绘制文字
- fillText(text, x, y):
注意:s,y是文本的位置坐标,但不是文字左上角的对应坐标。y是文本的基线的 Y 轴坐标。 - strokeText(text, x, y)
- fillText(text, x, y):
-
绘制图片:
- 获取图片的源:
HTMLImageElement
、HTMLVideoElement
、HTMLCanvasElement
、ImageBitmap
。 - drawImage(image, x, y):若调用
drawImage
时,图片没装载完,那什么都不会发生。因此你应该用 load 事件来保证不会在加载完毕之前使用这个图片。
var img = new Image(); // 创建 img 元素 img.onload = function () { // 执行 drawImage 语句 ctx.drawImage(img, 10, 60) }; img.src = "myImage.png"; // 设置图片源地址
以视频帧作为图片源:绘制视频帧 画面,不像 图片加载完就能获取第一帧。video 视频加载完,此时的第一帧可能还没开始渲染。
const canvas = document.getElementById('canvas') const ctx = canvas.getContext('2d') const video = document.getElementById("video") function getMyVideo() { requestAnimationFrame(getMyVideo); // 视频的每一帧都进行绘制,这时就变成视频了。 ctx.clearRect(0, 0, 800, 800) ctx.drawImage(video, 0, 0) // 直接把 video 当前的帧,作为canvas的源 进行渲染。 } getMyVideo()
- 获取图片的源:
总结:canvas只支持两种形式的图形绘制(矩形和路径),但是canvas提供了对已有图形(文字、图片)的渲染功能。
三、canvas 样式:
- 画笔 颜色:
fillStyle = "red" // 设置图形的填充颜色。 strokeStyle = "red" // 设置图形轮廓的颜色。
四、绘制新形状时应用的合成操作的类型:
ctx.globalCompositeOperation = type;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具