store
store copied to clipboard
Canvas文档
js文档:https://www.canvasapi.cn/
教程:https://wangdoc.com/webapi/canvas.html
参考:https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial
示例:https://www.twle.cn/l/yufei/canvas/canvas-basic-index.html
MDN: CanvasRenderingContext2D API接口参考
贝塞尔曲线 - 维基百科
canvas 文档
目录
-
- 绘制形状
- 路径
- 线型
- 弧线
- 贝塞尔曲线
- 椭圆
- Path2D 对象
- 矩形
- 文本
- 渐变和图案填充
- 阴影
- 透明度
- 合成与裁剪
- 状态的保存和恢复
- 其他属性和方法
-
- 图像变换
- 旋转
- 缩放
- 位移
- 矩阵
- 图像处理
- 绘制图片
- 像素读写
-
- 动画
-
- canvas元素方法
- Canvas.getContext()
- Canvas.toDataURL()
- Canvas.toBlob()
1. 绘制形状
Canvas 画布提供了一个作图的平面空间,该空间的每个点都有自己的坐标。原点(0, 0)
位于图像左上角,x
轴的正向是原点向右,y
轴的正向是原点向下。
路径
图形的基本元素是路径。路径是通过不同颜色和宽度的线段或曲线相连形成的不同形状的点的集合。一个路径,甚至一个子路径,都是闭合的。使用路径绘制图形需要一些额外的步骤。
- 首先,你需要创建路径起始点。
- 然后你使用画图命令去画出路径。
- 之后你把路径封闭。
- 一旦路径生成,你就能通过描边或填充路径区域来渲染图形。
以下方法和属性用来绘制路径:
-
beginPath()
:开始绘制路径。 -
closePath()
:结束路径,返回到当前路径的起始点,会从当前点到起始点绘制一条直线。如果图形已经封闭,或者只有一个点,那么此方法不会产生任何效果。 -
moveTo(x, y)
:设置路径的起点,即将一个新路径的起始点移动到(x,y)
坐标。 -
fill()
:在路径内部填充颜色(默认为黑色)。 -
stroke()
:路径线条着色(默认为黑色)。 -
fillStyle
:指定路径填充的颜色和样式(默认为黑色)。 -
strokeStyle
:指定路径线条的颜色和样式(默认为黑色)。
function draw() {
var canvas = document.getElementById('canvas');
if (canvas.getContext){
var ctx = canvas.getContext('2d');
// 笑脸
ctx.beginPath();
ctx.arc(75, 75, 50, 0, Math.PI * 2, true); // 绘制外圆
ctx.moveTo(110, 75);
ctx.arc(75, 75, 35, 0, Math.PI, false); // 口(顺时针)
ctx.moveTo(65, 65);
ctx.arc(60, 65, 5, 0, Math.PI * 2, true); // 左眼
ctx.moveTo(95, 65);
ctx.arc(90, 65, 5, 0, Math.PI * 2, true); // 右眼
ctx.strokeStyle = "blue"
ctx.stroke();
// 扇形
ctx.beginPath();
ctx.moveTo(83, 102);
ctx.bezierCurveTo(83, 94, 89, 88, 97, 88); // 左上1/4圆
ctx.bezierCurveTo(105, 88, 111, 94, 111, 102); // 右上1/4圆
ctx.lineTo(97, 116);
ctx.lineTo(83, 102);
ctx.strokeStyle = 'red'
ctx.stroke();
}
}
线型
lineTo()
绘制直线.
-
lineTo(x, y)
:使用直线从当前点连接到(x, y)
坐标。
线形的控制属性
-
lineWidth
:指定线条的宽度,默认为1.0。 -
lineCap
:指定线条末端的样式,有三个可能的值:butt
(默认值,末端为矩形)、round
(末端为圆形)、square
(末端为突出的矩形,矩形宽度不变,高度为线条宽度的一半)。 -
lineJoin
:指定线段交点的样式,有三个可能的值:round
(交点为扇形)、bevel
(交点为三角形底边)、miter
(默认值,交点为菱形)。 -
miterLimit
:指定交点菱形的长度,默认为10。该属性只在lineJoin
属性的值等于miter
时有效。 -
getLineDash()
:返回一个数组,表示虚线里面线段和间距的长度。 -
setLineDash(segments)
:数组,用于指定虚线里面线段和间距的长度。 -
lineDashOffset
: 设置虚线样式的起始偏移量。
弧线
-
arc()
:通过指定圆心和半径绘制弧形,主要用来绘制圆形或扇形。 -
arcTo()
:通过指定两根切线和半径绘制弧形,主要用来绘制圆弧。
context.arc(x, y, radius, startAngle, endAngle [, anticlockwise]);
// `x, y`: 圆弧对应的圆心横坐标
// `radius`: 圆弧的半径大小。
// `startAngle`: 圆弧开始的角度,单位是弧度。
// `endAngle`: 圆弧结束的角度,单位是弧度。
// `anticlockwise`: 画图时应该逆时针画(true)还是顺时针画(false),这个参数用来控制扇形的方向(比如上半圆还是下半圆)。
context.arcTo(x1, y1, x2, y2, radius)
// `x1, y1`: 是第1个控制点的横坐标;
// `x2, y2`: 是第2个控制点的横坐标;
// `radius`: 是圆弧的半径大小。
注意:
arc()
函数中表示角的单位是弧度,不是角度。
角度与弧度的js表达式:弧度=(Math.PI/180)*角度。
比如:ctx.arc(60, 60, 50, 0, Math.PI * 2, true)
绘制了一个半径50,起始角度为0,终止角度为2 * PI
的完整的圆。
贝塞尔曲线
-
quadraticCurveTo(cp1x, cp1y, x, y)
:绘制二次贝塞尔曲线,cp1x,cp1y
为一个控制点,x,y为
结束点。 -
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)
:绘制三次贝塞尔曲线,cp1x,cp1y
为控制点一,cp2x,cp2y
为控制点二,x,y
为结束点。
椭圆
ellipse()
是 Canvas 2D API 添加椭圆路径的方法。椭圆的圆心在(x,y)位置,半径分别是radiusX 和 radiusY ,按照anticlockwise(默认顺时针)指定的方向,从 startAngle 开始绘制,到 endAngle 结束。
ctx.ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
// `x, y`: 椭圆圆心的坐标
// `radiusX`: 椭圆长轴的半径
// `radiusY`: 椭圆短轴的半径
// `rotation, startAngle`: 椭圆将要绘制的起始点和结束点角度,以弧度表示(非角度度数)。
// `anticlockwise`: 如果为 true,逆时针方向绘制椭圆 (逆时针), 反之顺时针方向绘制。
// Demo
ctx.ellipse(100, 100, 50, 75, 45 * Math.PI/180, 0, 2 * Math.PI); //倾斜45°角
Path2D 对象
正如我们所讲,你可以使用一系列的路径和绘画命令来把对象“画”在画布上。为了简化代码和提高性能,Path2D
对象已可以在较新版本的浏览器中使用,用来缓存或记录绘画命令,这样你将能快速地回顾路径。
所有的路径方法比如moveTo
, rect
, arc
或quadraticCurveTo
等,如我们前面见过的,都可以在Path2D中使用。Path2D还有另一个强大的特点,就是使用SVG path data来初始化canvas上的路径。这将使你获取路径时可以以SVG或canvas的方式来重用它们。
const square = new Path2D("M10 10 h 80 v 80 h -80 Z")
ctx.stroke(square)
矩形
以下方法用来绘制矩形:
-
rect(x, y, width, height)
:绘制矩形路径。 -
fillRect(x, y, width, height)
:填充一个矩形。 -
strokeRect(x, y, width, height)
:绘制矩形边框。 -
clearRect(x, y, width, height)
:指定矩形区域的像素都变成透明,并擦除之前绘制的所有内容。
上面四个方法的格式都一样,都接受四个参数,分别是矩形左上角的横坐标和纵坐标、矩形的宽和高。
const canvas = document.getElementById('canvas')
const ctx = canvas.getContext('2d')
// line画矩形路径,填充
ctx.moveTo(10, 100)
ctx.lineTo(60, 100)
ctx.lineTo(60, 150)
ctx.lineTo(10, 150)
ctx.fillStyle = 'pink'
ctx.fill()
// rect画矩形路径,填充
ctx.beginPath()
ctx.rect(10, 10, 50, 50)
ctx.fillStyle = 'blue'
ctx.fill()
// fillRect 画矩形
ctx.fillStyle = 'green'
ctx.fillRect(80, 10, 50, 50)
// strokeRect 矩形描边
ctx.strokeStyle = 'red'
ctx.strokeRect(150, 10, 50, 50)
// clearRect 清除矩形区域内容
ctx.clearRect(40, 30, 60, 20)
文本
canvas 提供了fillText()
和 strokeText()
两种方法来渲染文本。
-
fillText(text, x, y [, maxWidth])
:在指定位置绘制实心字符。 -
strokeText(text, x, y [, maxWidth])
:在指定位置绘制空心字符。 -
measureText()
:预测量文本宽度,返回一个 TextMetrics 对象。
文本样式属性:
-
font
:指定字型大小和字体,默认值为10px sans-serif
。 -
textAlign
:文本的对齐方式,默认值为start
。[start, end, left, right, center
] -
direction
:文本的方向,默认值为inherit
。[ltr, rtl, inherit
] -
textBaseline
:文本的垂直位置,默认值为alphabetic
。[top, hanging, middle, alphabetic, ideographic, bottom
]
渐变和图案填充
-
createLinearGradient()
:定义线性渐变样式。 -
createRadialGradient()
:定义辐射渐变样式。 -
createPattern()
:使用指定的图片创建图案,通过 repetition 变量指定的方向上重复源图片。
线性渐变
ctx.createLinearGradient(x0, y0, x1, y1)
x0
和y0
是起点的横坐标和纵坐标,x1
和y1
是终点的横坐标和纵坐标。通过不同的坐标值,可以生成从上至下、从左到右的渐变等等。
该方法的返回值是一个CanvasGradient
对象,该对象只有一个addColorStop()
方向,用来指定渐变点的颜色。addColorStop()
方法接受两个参数,第一个参数是0到1之间的一个位置量,0表示起点,1表示终点,第二个参数是一个字符串,表示 CSS 颜色。
var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
var gradient = ctx.createLinearGradient(0, 0, 200, 0);
gradient.addColorStop(0, 'green');
gradient.addColorStop(1, 'white');
ctx.fillStyle = gradient;
ctx.fillRect(10, 10, 200, 100);
辐射渐变
createRadialGradient()
方法定义一个辐射渐变,需要指定两个圆。
ctx.createRadialGradient(x0, y0, r0, x1, y1, r1)
x0
和y0
是辐射起始的圆的圆心坐标,r0
是起始圆的半径,x1
和y1
是辐射终止的圆的圆心坐标,r1
是终止圆的半径。
图像填充
createPattern()
方法定义一个图像填充样式,在指定方向上不断重复该图像,填充指定的区域。
ctx.createPattern(image, repetition)
该方法接受两个参数,第一个参数是图像数据,它可以是<img>
元素,也可以是另一个<canvas>
元素,或者一个表示图像的 Blob 对象。第二个参数是一个字符串,有四个可能的值,分别是repeat
(双向重复)、repeat-x
(水平重复)、repeat-y
(垂直重复)、no-repeat
(不重复)。如果第二个参数是空字符串或null
,则等同于null
。
该方法的返回值是一个CanvasPattern
对象。
var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
var img = new Image();
img.src = 'https://example.com/pattern.png';
img.onload = function( ) {
var pattern = ctx.createPattern(img, 'repeat');
ctx.fillStyle = pattern;
ctx.fillRect(0, 0, 400, 400);
};
阴影
-
CanvasRenderingContext2D.shadowBlur
:阴影的模糊程度,默认为0
。 -
CanvasRenderingContext2D.shadowColor
:阴影的颜色,默认为black
。 -
CanvasRenderingContext2D.shadowOffsetX
:阴影的水平位移,默认为0
。 -
CanvasRenderingContext2D.shadowOffsetY
:阴影的垂直位移,默认为0
。
透明度
通过设置 globalAlpha
属性或者使用一个半透明颜色作为轮廓或填充的样式。
globalAlpha
属性在需要绘制大量拥有相同透明度的图形时候相当高效。不过strokeStyle
和fillStyle
属性接受符合 CSS 3 规范的颜色值,那可以使用rgba(255,0,0,0.5)
来设置具有透明度的颜色。
function draw() {
var ctx = document.getElementById('canvas').getContext('2d');
// 画背景框
ctx.fillStyle = '#6C0';
ctx.fillRect(0, 0, 150, 75);
ctx.fillStyle = 'rgba(0, 153, 255, 0.8)';
ctx.fillRect(0, 75, 150, 75);
// 设置透明度值
ctx.globalAlpha = 0.2;
// 画半透明圆
ctx.fillStyle = '#FFF'
for (var i=0;i<7;i++){
ctx.beginPath();
ctx.arc(75,75,10+10*i,0,Math.PI*2,true);
ctx.fill();
}
}
合成与裁剪
合成 globalCompositeOperation
我们不仅可以在已有图形后面再画新图形,还可以用来遮盖指定区域,清除画布中的某些部分(清除区域不仅限于矩形,像clearRect()
方法做的那样)以及更多其他操作。
-
globalCompositeOperation = type
: 设定了在画新图形时采用的遮盖策略,其值是一个标识12种遮盖方式的字符串。- source-over:默认设置,在现有画布上下文之上绘制新图形。
- source-in:新图形只在新图形和目标画布重叠的地方绘制。其他的都是透明的。
- source-out:在不与现有画布内容重叠的地方绘制新图形。
- source-atop:新图形只在与现有画布内容重叠的地方绘制。
- destination-over:在现有的画布内容后面绘制新的图形。
- destination-in:现有的画布内容保持在新图形和现有画布内容重叠的位置。其他的都是透明的。
- destination-out:现有内容保持在新图形不重叠的地方。
- destination-atop:现有的画布只保留与新图形重叠的部分,新的图形是在画布内容后面绘制的。
- lighter:两个重叠图形的颜色是通过颜色值相加来确定的。
- copy:只显示新图形。
- xor:图像中,那些重叠和正常绘制之外的其他地方是透明的。
- multiply:将顶层像素与底层相应像素相乘,结果是一幅更黑暗的图片。
- screen:像素被倒转,相乘,再倒转,结果是一幅更明亮的图片。
- overlay:multiply和screen的结合,原本暗的地方更暗,原本亮的地方更亮。
- darken:保留两个图层中最暗的像素。
- lighten:保留两个图层中最亮的像素。
- color-dodge:将底层除以顶层的反置。
- color-burn:将反置的底层除以顶层,然后将结果反过来。
- hard-light:屏幕相乘(A combination of multiply and screen)类似于叠加,但上下图层互换了。
- soft-light:用顶层减去底层或者相反来得到一个正值。
- difference:一个柔和版本的强光(hard-light)。纯黑或纯白不会导致纯黑或纯白。
- exclusion:和difference相似,但对比度较低。
- hue:保留了底层的亮度(luma)和色度(chroma),同时采用了顶层的色调(hue)。
- saturation:保留底层的亮度(luma)和色调(hue),同时采用顶层的色度(chroma)。
- color:保留了底层的亮度(luma),同时采用了顶层的色调(hue)和色度(chroma)。
- luminosity:保持底层的色调(hue)和色度(chroma),同时采用顶层的亮度(luma)。
裁剪路径 clip
裁切路径和普通的 canvas 图形差不多,不同的是它的作用是遮罩,用来隐藏不需要的部分。
-
clip()
:将当前正在构建的路径转换为当前的裁剪路径。
const canvas = document.getElementById('canvas')
const ctx = canvas.getContext('2d')
ctx.beginPath();
ctx.arc(0,0,60,0,Math.PI*2,true);
ctx.clip(); // 创建一个扇形的裁剪区域
// draw background
var lingrad = ctx.createLinearGradient(0,0,0,150);
lingrad.addColorStop(0, 'blue');
lingrad.addColorStop(1, 'red');
ctx.fillStyle = lingrad;
ctx.fillRect(0,0,150,150);
状态的保存和恢复
-
save()
:将画布的当前样式保存到堆栈,相当于在内存之中产生一个样式快照。 -
restore()
:将画布的样式恢复到上一个保存的快照,如果没有已保存的快照,则不产生任何效果。
Canvas状态存储在栈中,每当save()方法被调用后,当前的状态就被推送到栈中保存。一个绘画状态包括:
- 当前的变形矩阵
- 当前的剪切区域
- 当前的虚线列表
- 以下属性当前的值:
strokeStyle, fillStyle, globalAlpha, lineWidth, lineCap, lineJoin, miterLimit, lineDashOffset, shadowOffsetX, shadowOffsetY, shadowBlur, shadowColor, globalCompositeOperation, font, textAlign, textBaseline, direction, imageSmoothingEnabled
可以调用任意多次 save方法。每一次调用 restore 方法,上一个保存的状态就从栈中弹出,所有设定都恢复。
const canvas = document.getElementById('canvas')
const ctx = canvas.getContext('2d')
ctx.fillRect(0,0,300,300);
ctx.save(); // 保存默认状态
ctx.fillStyle = 'blue' // 蓝色状态
ctx.fillRect(25,25,250,250);
ctx.save(); // 保存当前状态
ctx.fillStyle = 'red' // 红色状态
ctx.fillRect(50,50,200,200);
ctx.restore(); // 恢复至蓝色状态
ctx.fillRect(75,75,150,150)
ctx.restore(); // 恢复至默认状态
ctx.fillRect(100,100,100,100)
其他属性和方法
-
CanvasRenderingContext2D.isPointInPath()
:检测某个点是否在当前路径中 -
CanvasRenderingContext2D.isPointInStroke()
:判断检测点是否在路径的描边线上。 -
CanvasRenderingContext2D.scrollPathIntoView()
:将当前或给定的路径滚动到窗口。 -
CanvasRenderingContext2D.drawFocusIfNeeded()
:如果给定的元素获取了焦点,那么此方法会在当前的路径绘制一个焦点。
2. 图像变换
以下方法用于图像变换。
-
CanvasRenderingContext2D.rotate()
:图像旋转 -
CanvasRenderingContext2D.scale()
:图像缩放 -
CanvasRenderingContext2D.translate()
:图像平移 -
CanvasRenderingContext2D.transform()
:通过一个变换矩阵完成图像变换 -
CanvasRenderingContext2D.setTransform()
:取消前面的图像变换
旋转
顺时针旋转的弧度。
默认旋转中心点是Canvas的左上角(0, 0)
坐标点,如果希望改变旋转中心点,例如以Canvas画布的中心旋转,需要先使用translate()
位移旋转中心点。
角度转弧度计算公式是:
radian = degree * Math.PI / 180
。例如,旋转45°,旋转弧度就是45 * Math.PI / 180
。
rotate(angle);
// angle : Canvas画布坐标系旋转的角度,单位是弧度。注意,此旋转和CSS3的旋转变换不一样,旋转的是坐标系,而非元素。因此,实际开发的时候,旋转完毕,需要将坐标系再还原。
画布和图片同步旋转 demo :
var canvas = document.getElementById('canvas')
var context = canvas.getContext('2d')
var width = canvas2.width;
var height = canvas2.height;
// 加载图片素材
var img = new Image();
img.onload = function () {
// 先位移坐标到中心
context.translate(width / 2, height / 2);
// 旋转90度
context.rotate(90 * Math.PI / 180);
// 此时按照旋转后的尺寸
// 把定位中心移动到左上角
context.translate(-1 * height / 2, -1 * width / 2);
// 绘制图片
context.drawImage(this, 0, 0, height, width);
// 坐标系还原到初始
context.setTransform(1, 0, 0, 1, 0, 0);
};
img.src = './1.jpg';
缩放
根据 x 水平方向和 y 垂直方向,为canvas 单位添加缩放变换的方法。
scale()
用来缩放Canvas画布的坐标系,只是影响坐标系,之后的绘制会受此方法影响,但之前已经绘制好的效果不会有任何变化。
默认缩放中心点是Canvas的左上角(0, 0)
坐标点,如果希望改变缩放中心点,需要先使用translate()方法进行位移。
ctx.scale(x, y)
// x : Canvas坐标系水平缩放的比例。支持小数,如果值是-1,表示水平翻转。
// y : Canvas坐标系垂直缩放的比例。支持小数,如果值是-1,表示垂直翻转。
位移
将 canvas 按原始 x点的水平方向、原始的 y点垂直方向进行平移变换。
ctx.translate(x, y);
矩阵
transform()
方法可以对当前坐标系进行进一步变换,以实现缩放,旋转,拉伸或者位移效果。
此方法和setTransform()
方法的区别在于,后者一旦执行会完全重置已有的变换,transform()方法则是累加。
-
transform(a, b, c, d, e, f)
将当前的变形矩阵乘上一个基于自身参数的矩阵 -
setTransform(a, b, c, d, e, f)
将当前的变形矩阵重置为单位矩阵。 -
resetTransform()
重置当前变形为单位矩阵,它和调用以下语句是一样的:ctx.setTransform(1, 0, 0, 1, 0, 0);
context.transform(a, b, c, d, e, f);
/*
a:水平缩放(默认值1,单位倍数)
b:水平倾斜(默认值0,单位弧度)
c:垂直倾斜(默认值0,单位弧度)
d:垂直缩放(默认值1,单位倍数)
e:水平位移(默认值0,单位像素)
f:垂直位移(默认值0,单位像素)
*/
下面是一个例子。
const canvas = document.getElementById('canvas')
const ctx = canvas.getContext('2d')
// step 1
ctx.transform(2, 0, 0, 1, 50, 50);
ctx.fillRect(0, 0, 100, 100);
// step 2
ctx.setTransform(1, 0, 0, 1, 0, 100);
ctx.fillStyle = 'red'
ctx.fillRect(0, 0, 100, 100);
上面代码中:step1将原始图形是 100 x 100 的矩形,结果缩放成 200 x 100 的矩形,并且左上角从(0, 0)
移动到(50, 50)
。step2 将重置当前矩阵,无缩放、无旋转,将画布中心点移至(0, 100)
注意:多个
transform()
方法具有叠加效果。
图像处理
绘制图片
Canvas API 允许将图像文件写入画布,做法是读取图片后,使用drawImage()
方法将这张图片放上画布。
CanvasRenderingContext2D.drawImage()
有三种使用格式。
ctx.drawImage(image, dx, dy);
ctx.drawImage(image, dx, dy, dWidth, dHeight);
ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);
各个参数的含义如下。
- image:图像元素
- sx:图像内部的横坐标,用于映射到画布的放置点上。
- sy:图像内部的纵坐标,用于映射到画布的放置点上。
- sWidth:图像在画布上的宽度,会产生缩放效果。如果未指定,则图像不会缩放,按照实际大小占据画布的宽度。
- sHeight:图像在画布上的高度,会产生缩放效果。如果未指定,则图像不会缩放,按照实际大小占据画布的高度。
- dx:画布内部的横坐标,用于放置图像的左上角
- dy:画布内部的纵坐标,用于放置图像的右上角
- dWidth:图像在画布内部的宽度,会产生缩放效果。
- dHeight:图像在画布内部的高度,会产生缩放效果。
const canvas = document.getElementById('canvas')
const ctx = canvas.getContext('2d')
const img = new Image()
img.crossOrigin = 'anonymous' // 解决图片跨域问题
img.onload = function() {
// 拉伸图片同时保持图片比例
ctx.drawImage(img, 0, 42, 500, 250, 0, 0, 300, 150)
}
img.src = 'https://www.canvasapi.cn/assets/images/examples/500/1.jpg' // 图片实际宽高 500333
如何让一张尺寸为500*300
图片填满尺寸为300*150
Canvas画布,同时保持图片的原始比例呢?这个就需要用到sx,sy,sWidth和sHeight这几个参数。
上面的示例关键如何理解 0, 42, 500, 250
这4个值是怎么计算来的。我们最终图片要显示在300*150
大小的Canvas画布中,比例是2:1
,因此,我们最终设置的用来绘制的图片尺寸比例也是2:1
。原始图片宽度是500
,要保持2:1
,则高度我们就设置为250
;而原始高度是333
,我们希望显示图片中心区域,因此起始垂直坐标计算下,(333 - 250) / 2
,四舍五入就是42,因此,就有了对原始图片的剪裁坐标值和尺寸值0, 42, 500, 250
。
像素读写
-
CanvasRenderingContext2D.getImageData()
:将画布读取成一个 ImageData 对象 -
CanvasRenderingContext2D.putImageData()
:将 ImageData 对象写入画布 -
CanvasRenderingContext2D.createImageData()
:生成 ImageData 对象
getImageData()
CanvasRenderingContext2D.getImageData()
方法用来读取<canvas>
的内容,返回一个 ImageData 对象,包含了每个像素的信息。
context.getImageData(sx, sy, sWidth, sHeight)
getImageData()
方法接受四个参数。sx
和sy
是读取区域的左上角坐标,sWidth
和sHeight
是读取区域的宽度和高度。如果想要读取整个<canvas>
区域,可以写成下面这样。
var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
getImageData()
方法返回的是一个ImageData
对象。该对象有三个属性。
-
ImageData.data
:一个一维数组。该数组的值,依次是每个像素的红、绿、蓝、alpha 通道值(每个值的范围是 0~255),因此该数组的长度等于图像的像素宽度 x 图像的像素高度 x 4
。这个数组不仅可读,而且可写,因此通过操作这个数组,就可以达到操作图像的目的。 -
ImageData.width
:浮点数,表示 ImageData 的像素宽度。 -
ImageData.height
:浮点数,表示 ImageData 的像素高度。
putImageData()
CanvasRenderingContext2D.putImageData()
方法将ImageData
对象的像素绘制在<canvas>
画布上。该方法有两种使用格式。
ctx.putImageData(imagedata, dx, dy)
ctx.putImageData(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight)
该方法有如下参数。
- imagedata:包含像素信息的 ImageData 对象。
- dx:
<canvas>
元素内部的横坐标,用于放置 ImageData 图像的左上角。 - dy:
<canvas>
元素内部的纵坐标,用于放置 ImageData 图像的左上角。 - dirtyX:ImageData 图像内部的横坐标,用于作为放置到
<canvas>
的矩形区域的左上角的横坐标,默认为0。 - dirtyY:ImageData 图像内部的纵坐标,用于作为放置到
<canvas>
的矩形区域的左上角的纵坐标,默认为0。 - dirtyWidth:放置到
<canvas>
的矩形区域的宽度,默认为 ImageData 图像的宽度。 - dirtyHeight:放置到
<canvas>
的矩形区域的高度,默认为 ImageData 图像的高度。
createImageData()
CanvasRenderingContext2D.createImageData()
方法用于生成一个空的ImageData
对象,所有像素都是透明的黑色(即每个值都是0
)。该方法有两种使用格式。
ctx.createImageData(width, height)
ctx.createImageData(imagedata)
createImageData()
方法的参数如下。
- width:ImageData 对象的宽度,单位为像素。
- height:ImageData 对象的高度,单位为像素。
- imagedata:一个现有的 ImageData 对象,返回值将是这个对象的拷贝。
var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
var imageData = ctx.createImageData(100, 100);
上面代码中,imageData
是一个 100 x 100 的像素区域,其中每个像素都是透明的黑色。
4. 动画
canvas画布可能最大的限制就是图像一旦绘制出来,它就是一直保持那样了。如果需要移动它,我们不得不对所有东西(包括之前的)进行重绘。重绘是相当费时的,而且性能很依赖于电脑的速度。
动画的基本步骤:
可以通过以下的步骤来画出一帧:
-
清空 canvas
除非接下来要画的内容会完全充满 canvas (例如背景图),否则你需要清空所有。最简单的做法就是用
clearRect
方法。 - 保存 canvas 状态 如果你要改变一些会改变 canvas 状态的设置(样式,变形之类的),又要在每画一帧之时都是原始状态的话,你需要先保存一下。
- 绘制动画图形(animated shapes) 这一步才是重绘动画帧。
- 恢复 canvas 状态 如果已经保存了 canvas 的状态,可以先恢复它,然后重绘下一帧。
5. canvas元素方法
Canvas.getContext()
``HTMLCanvasElement.getContext()` 返回canvas 的上下文,如果上下文没有定义则返回 null
// 语法
canvas.getContext(contextType);
canvas.getContext(contextType, contextAttributes);
参数说明
-
contextType :
String
-
2d
: 创建并返回一个CanvasRenderingContext2D对象,主要用来进行2d绘制,也就是二维绘制,平面绘制。 -
webgl
或experimental-webgl
: 此参数可以返回一个WebGLRenderingContext(WebGL渲染上下文)对象,WebGL(全写Web Graphics Library)是一种3D绘图协议,可以为HTML5 Canvas提供硬件3D加速渲染,这样Web开发人员就可以借助系统显卡来在浏览器里更流畅地展示3D场景和模型,无需安装任何其他插件。此参数对应的WebGL版本1(OpenGL ES 2.0)。 -
webgl2
: 此参数可以返回一个WebGL2RenderingContext对象,可以用来绘制三维3D效果。此参数对应的WebGL版本2(OpenGL ES 3.0)。不过目前这个还处于试验阶段,我们实际Kaufman都是使用'webgl'这个参数。 -
bitmaprenderer
: 创建一个ImageBitmapRenderingContext(位图渲染上下文),可以借助给定的ImageBitmap替换Canavs的内容。
-
-
contextAttributes :(可选)
Object
contextAttributes为一个纯对象参数
Canvas.toDataURL()
<canvas>
元素的toDataURL()
方法,可以将 Canvas 数据转为 Data URI 格式的图像。
canvas.toDataURL(type, quality)
toDataURL()
方法接受两个参数。
- type:字符串,表示图像的格式。默认为
image/png
,另一个可用的值是image/jpeg
,Chrome 浏览器还可以使用image/webp
。 - quality:浮点数,0到1之间,表示 JPEG 和 WebP 图像的质量系数,默认值为0.92。
该方法的返回值是一个 Data URI 格式的字符串。
function convertCanvasToImage(canvas) {
var image = new Image();
image.src = canvas.toDataURL('image/png');
return image;
}
上面的代码将<canvas>
元素,转化成PNG Data URI。
var fullQuality = canvas.toDataURL('image/jpeg', 0.9);
var mediumQuality = canvas.toDataURL('image/jpeg', 0.6);
var lowQuality = canvas.toDataURL('image/jpeg', 0.3);
上面代码将<canvas>
元素转成高画质、中画质、低画质三种 JPEG 图像。
Canvas.toBlob()
HTMLCanvasElement.toBlob()
方法用于将<canvas>
图像转成一个 Blob 对象,默认类型是image/png
。它的使用格式如下。
// 格式
canvas.toBlob(callback, mimeType, quality)
// 示例
canvas.toBlob(function (blob) {...}, 'image/jpeg', 0.95)
toBlob()
方法可以接受三个参数。
- callback:回调函数。它接受生成的 Blob 对象作为参数。
- mimeType:字符串,图像的 MIMEType 类型,默认是
image/png
。 - quality:浮点数,0到1之间,表示图像的质量,只对
image/jpeg
和image/webp
类型的图像有效。
注意,该方法没有返回值。
下面的例子将<canvas>
图像复制成<img>
图像。
var canvas = document.getElementById('myCanvas');
function blobToImg(blob) {
var newImg = document.createElement('img');
var url = URL.createObjectURL(blob);
newImg.onload = functio () {
// 使用完毕,释放 URL 对象
URL.revokeObjectURL(url);
};
newImg.src = url;
document.body.appendChild(newImg);
}
canvas.toBlob(blobToImg);
HTML Canvas 参考手册
来源1:https://www.w3school.com.cn/tags/html_ref_canvas.asp 来源2:https://www.w3cschool.cn/htmltags/ref-canvas.html
HTML <canvas>
标签用于通过脚本(通常是 JavaScript)动态绘制图形。
描述
HTML5 <获得用于在画布上绘图的对象获得用于在画布上绘图的对象> 标签用于绘制图像(通过脚本,通常是 JavaScript)。
不过,<canvas>
元素本身并没有绘制能力(它仅仅是图形的容器) - 您必须使用脚本来完成实际的绘图任务。
getContext() 方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属性。
本手册提供完整的 getContext("2d")
对象的属性和方法,可用于在画布上绘制文本、线条、矩形、圆形等等。
颜色、样式和阴影
属性 | 描述 |
---|---|
fillStyle | 设置或返回用于填充绘画的颜色、渐变或模式。 |
strokeStyle | 设置或返回用于笔触的颜色、渐变或模式。 |
shadowColor | 设置或返回用于阴影的颜色。 |
shadowBlur | 设置或返回用于阴影的模糊级别。 |
shadowOffsetX | 设置或返回阴影与形状的水平距离。 |
shadowOffsetY | 设置或返回阴影与形状的垂直距离。 |
方法 | 描述 |
---|---|
createLinearGradient() | 创建线性渐变(用在画布内容上)。 |
createPattern() | 在指定的方向上重复指定的元素。 |
createRadialGradient() | 创建放射状/环形的渐变(用在画布内容上)。 |
addColorStop() | 规定渐变对象中的颜色和停止位置。 |
线条样式
属性 | 描述 |
---|---|
lineCap | 设置或返回线条的结束端点样式。 |
lineJoin | 设置或返回两条线相交时,所创建的拐角类型。 |
lineWidth | 设置或返回当前的线条宽度。 |
miterLimit | 设置或返回最大斜接长度。 |
矩形
方法 | 描述 |
---|---|
rect() | 创建矩形。 |
fillRect() | 绘制"被填充"的矩形。 |
strokeRect() | 绘制矩形(无填充)。 |
clearRect() | 在给定的矩形内清除指定的像素。 |
路径
方法 | 描述 |
---|---|
fill() | 填充当前绘图(路径)。 |
stroke() | 绘制已定义的路径。 |
beginPath() | 起始一条路径,或重置当前路径。 |
moveTo() | 把路径移动到画布中的指定点,不创建线条。 |
closePath() | 创建从当前点回到起始点的路径。 |
lineTo() | 添加一个新点,然后在画布中创建从该点到最后指定点的线条。 |
clip() | 从原始画布剪切任意形状和尺寸的区域。 |
quadraticCurveTo() | 创建二次贝塞尔曲线。 |
bezierCurveTo() | 创建三次贝塞尔曲线。 |
arc() | 创建弧/曲线(用于创建圆形或部分圆)。 |
arcTo() | 创建两切线之间的弧/曲线。 |
isPointInPath() | 如果指定的点位于当前路径中,则返回 true,否则返回 false。 |
转换
方法 | 描述 |
---|---|
scale() | 缩放当前绘图至更大或更小。 |
rotate() | 旋转当前绘图。 |
translate() | 重新映射画布上的 (0,0) 位置。 |
transform() | 替换绘图的当前转换矩阵。 |
setTransform() | 将当前转换重置为单位矩阵。然后运行 transform()。 |
文本
属性 | 描述 |
---|---|
font | 设置或返回文本内容的当前字体属性。 |
textAlign | 设置或返回文本内容的当前对齐方式。 |
textBaseline | 设置或返回在绘制文本时使用的当前文本基线。 |
方法 | 描述 |
---|---|
fillText() | 在画布上绘制"被填充的"文本。 |
strokeText() | 在画布上绘制文本(无填充)。 |
measureText() | 返回包含指定文本宽度的对象。 |
图像绘制
方法 | 描述 |
---|---|
drawImage() | 向画布上绘制图像、画布或视频。 |
像素操作
属性 | 描述 |
---|---|
width | 返回 ImageData 对象的宽度。 |
height | 返回 ImageData 对象的高度。 |
data | 返回一个对象,其包含指定的 ImageData 对象的图像数据。 |
方法 | 描述 |
---|---|
createImageData() | 创建新的、空白的 ImageData 对象。 |
getImageData() | 返回 ImageData 对象,该对象为画布上指定的矩形复制像素数据。 |
putImageData() | 把图像数据(从指定的 ImageData 对象)放回画布上。 |
合成
属性 | 描述 |
---|---|
globalAlpha | 设置或返回绘图的当前 alpha 或透明值。 |
globalCompositeOperation | 设置或返回新图像如何绘制到已有的图像上。 |
其他
方法 | 描述 |
---|---|
save() | 保存当前环境的状态。 |
restore() | 返回之前保存过的路径状态和属性。 |
createEvent() | 创建新的 Event 对象 |
getContext() | 获得用于在画布上绘图的对象 |
toDataURL() | 导出在 canvas 元素上绘制的图像 |
awesome-canvas
- 源自:https://github.com/chinaBerg/awesome-canvas
精心收录Canvas相关的资源并整理分类,部分同类资源库也收录SVG/WebGL相关的资源。
简体中文 | English
目录
- awesome-canvas
- 目录
- 教程
- 书籍
-
仓库
- 图形绘制
- 3D库
- VR/AR
- 物理引擎
- 游戏引擎
- 流程图
- 甘特图
- 组织图
- 图编辑
- 电子表格
- 图表库
- 海报截图
- 数据处理
- 图像处理
- 画板
- 签名
- 波纹动画
- 粒子动画
- 路径动画
- 二维码
- 验证码
- 运行时
- 其他
- 插件资源网站
- 效果/案例
- 文章
- 贡献者
- 协议
教程
- Web绘图
- 图可视化美学
- 计算机图形与可视化
- HTML5 Canvas MDN教程
- Internet Explorer 9 开发人员指南:HTML5 Canvas
- HTML5草案标准中的Canvas元素文档
- HTML5 Canvas 基础教程
- HTML5 Canvas 菜鸟教程
- HTML5 Canvas W3school教程
- HTML5 Canvas 廖雪峰教程
- HTML5 Canvas 慕课网教程
- HTML5 Canvas的中文系列学习教程
- AntV Graphin 图数据库解决方案
- AntV Graphin 知识图谱解决方案
- AntV Graphin 网络安全解决方案
- AntV Graphin 企业风控解决方案
书籍
- 《HTML5 Canvas开发详解》 作者: Steve Fulton,Jeff Fulton 链接地址🔗
- 《TypeScript图形渲染实战:2D架构设计与实现》 作者: 步磊峰 链接地址🔗
- 《HTML5 Canvas游戏开发实战》 作者: 张路斌 链接地址🔗
- 《从0到1 HTML5 Canvas动画开发》 作者: 莫振杰 链接地址🔗
- 《HTML5 Canvas核心技术: 图形、动画与游戏开发》 作者: 美基瑞 链接地址🔗
- 《快学熟用D3》 作者: 菲利普·K.贾纳特 链接地址🔗
- 《如何使用 Canvas 制作出炫酷的网页背景特效》 作者: sunshine小小倩 链接地址🔗
- 《可视化入门:从 0 到 1 开发一个图表库》 作者: AntV 链接地址🔗
- 《图分析与可视化》 作者: 理查德·布莱斯 / 大卫·琼克 链接地址🔗
- 《视觉繁美 - 信息可视化方法与案例解析》 作者: Manuel Lima 链接地址🔗
- 《数据可视化》 作者: 陈为 / 沈则潜 链接地址🔗
仓库
图形绘制
-
fabric.js [在线演示] - 轻松处理Canvas元素的框架、Canvas和SVG的转换解析器
-
DarkroomJS [在线演示] - 浏览器端可扩展的图像编辑工具
-
react-design-editor [在线演示] - 基于React、Fabricjs的可编辑设计工具
-
react-sketch [在线演示] - 基于React、Fabricjs的素描应用
-
vue-fabric - 基于Fabric.js的Vue组件,定制画板,图片组合绘制
-
angular-fabric [在线演示] - 使用AngularJS控制Fabricjs Canvas
-
fabric-js-editor - 基于Fabric.js的HTML5矢量图像编辑器
-
fabric-brush [在线演示] - 基于Fabric.js的Canvas笔刷工具
-
fabricjs-image-editor-origin [在线演示] - Fabricjs图像编辑器
-
DrawerJs [在线演示] - 可定制的所见即所得的HTML Canvas编辑器
-
myvision - 免费的在线图像注释工具,用于生成基于计算机视觉的 ML 训练数据
-
DarkroomJS [在线演示] - 浏览器端可扩展的图像编辑工具
-
konva [在线演示] - 通过扩展2D Context让桌面和移动端Canvas支持交互特性
- konva中文文档
-
react-konva [在线演示] - 基于React和konva绘制复杂Canvas图形的JS库
-
vue-konva - 基于Vue和konva绘制复杂canvas图形的JS库
-
react-proto - 为开发人员和设计人员的React原型工具应用
- Leafer JS - Canvas 渲染引擎,高效绘图 、UI 交互(小游戏、互动应用、组态)、图形编辑。
-
two.js [在线演示] - 一个渲染器无关的Web 2D绘图API
-
EaselJS - EaselJS是一个用于在HTML5中构建高性能交互式2D内容的库
-
spritejs [在线演示] - 一个跨平台的高性能图形系统
-
concretejs [在线演示]- 超快、轻量的Canvas框架,支持hit检测、分层、像素比率管理、导出和下载
-
cax [在线演示] - 小程序、小游戏以及 Web 通用 Canvas 渲染引擎
-
wxDraw [在线演示] - 微信小程序2d动画库
-
atrament.js - 一个小型 JS 库,用于在 HTML Canvas 上进行漂亮的绘图和手绘
-
origami.js - 强大且轻量的Canvas库
-
react-native-sketch-canvas [在线演示] - 支持在iOS和Android上触摸绘图React Native组件
3D库
-
three.js [在线演示] - 创建易于使用、轻量级、跨浏览器的通用3d js库
-
zdog [在线演示] - 基于canvas和SVG设计师友好的伪3D引擎
-
curtainsjs [在线演示] - 轻量级的WebGL库,将DOM元素转换为交互式纹理平面
-
obelisk.js - 用HTML5 canvas构建立体图形库
-
seen [在线演示] - 使用SVG或Canvas渲染3D场景
-
Oimo.js [在线演示] - 轻量级的JS 3D物理引擎
-
troika [在线演示] - 用于交互式 3D 和 2D 可视化的 JavaScript 框架
-
phoria.js [在线演示] - 用于在 HTML5 画布 2D 渲染器上进行简单 3D 图形和可视化的 JavaScript 库。它不使用 WebGL。适用于所有 HTML5 浏览器,包括桌面、iOS 和 Android
-
isomer [在线示例] - 基于HTML5 Canvas的简单等距图形库。
VR/AR
-
Panolens.js [在线演示] - Panolens.js基于Three.JS,主要研究领域是全景、虚拟现实和潜在的增强现实。
-
Pannellum [在线演示] - 轻量、免费、开源的web全景查看器。
-
Marzipano [在线演示] 可让您轻松为您的网站创建 360 度媒体播放器。
-
JS-Cloudimage-360-View [在线演示] 一个简单的、交互式的资源,可以用来提供您的产品的虚拟游览。
-
A-Frame [在线演示] A-Frame 除了帮助您构建 360 度媒体播放器外,它还提供了许多附加功能。其他功能可帮助您增强网站的虚拟现实体验。
-
exokit [在线演示] - 基于JavaScript的原生VR / AR / XR引擎
-
webvr-boilerplate [在线演示] - 工作在VR头戴设备的基于Web的VR虚拟体验
物理引擎
-
matter-js [在线演示] - 用于web的2D刚体物理引擎
-
box2d.js [在线示例] - box2d.js是Box2D物理引擎的JS版本。
-
p2.js [在线演示] - JavaScript 2D 物理引擎库。
游戏引擎
-
Hilo [在线演示] - 阿里巴巴集团开发的跨平台HTML5游戏开发解决方案
-
melonJS [在线演示] - 一个全新的轻量级javascript游戏引擎
-
Babylon.js [在线演示] - 功能强大、美观、简单、开源、封装友好的游戏渲染引擎
-
Phaser [在线演示] - 有趣、免费、快速、支持Canvas和WebGL的2D游戏框架,用于为桌面和移动端浏览器H5游戏制作
-
phaser-examples - 包含数百个Phaser HTML5 游戏框架的源代码示例
-
games - 一个基于Phaser的小游戏集合
-
phaser3-examples - phaser3例子
-
phaser-ce - Phaser CE 是一个有趣、免费且快速的2D游戏框架,用于为桌面和移动端Web制作HTML5游戏,支持 Canvas和WebGL渲染
-
phaser3-project-template - Phaser3项目模板
-
phaser-examples - 包含数百个Phaser HTML5 游戏框架的源代码示例
-
taro [在线演示] - 轻量级3D游戏引擎。
-
turbulenz_engine [在线演示] - 模块化的3D和2D游戏框架,用于为浏览器、桌面端和移动端设备制作 HTML5 驱动的游戏。
流程图
-
GOJS [在线演示] - 交互式流程图、组织结构图、设计工具、规划工具、可视化语言的JavaScript图表库
-
Drawflow [在线演示] - 仅用4行代码即可创建基于dom和svg的流程图
-
Flowy [在线演示] - 用于创建流程图的最小javascript库
-
flowchart.js - 可以运行在浏览器和终端的流程图DSL和SVG流程图
-
mermaid [在线演示] - 通过解析类Markdown语法生成图表和流程图等
-
wireflow [在线演示] - 用户流程图实时协作工具
-
butterfly [在线演示] - 基于JavaScript/React/Vue2的流程图组件
甘特图
- 以下甘特图不基于Canvas实现
-
gantt [在线演示] - 开源的Javascript甘特图。基于SVG
-
jQueryGantt [在线演示] - Jquery甘特图编辑器
-
Gantt-Chart [在线演示] - 基于D3的甘特图库
-
gantt-schedule-timeline-calendar [在线演示] - JS甘特图,项目甘特图,时间线,调度图,甘特时间线,预订时间线,React甘特图,Angular甘特图,Vue甘特图,svelte甘特图
-
dhtmlxGantt [在线演示] - GPL版的JS甘特图
-
gantt-for-react [在线演示] - 一个简单的React甘特图组件
-
jquery.ganttView [在线演示] - 一个可编辑的 jQuery 甘特图插件
-
wl-gantt - 简单易用且高度可配置的甘特图、进度计划项目管理插件
-
gantt [在线演示] - 开源的Javascript甘特图。基于SVG
组织图
图编辑
-
Workflow Designer [在线示例] - 基于G6和React的可视化流程编辑器。
-
vue-g6-editor [在线示例] - 基于 G6 和 Vue 的可视化编辑器。
-
X-Flowchart-Vue [在线演示] - 基于G6和Vue的可视化图形编辑器
-
web-pdm [在线示例] - 用G6做的ER图工具,最终目标是想做成在线版的powerdesigner.
-
ng-antv - 基于G6和Angular实现的编辑器。
-
welabx-g6 [在线示例] - 基于G6和Vue的流程图编辑器。
电子表格
-
x-spreadsheet [在线演示] - 基于webJavaScript(canvas)Excel表格
-
Luckysheet [在线演示] - 在线电子表格,功能强大,配置简单,完全开源
-
sheetsee.js - 可视化谷歌Spreadsheet的数据
-
SlickGrid [在线演示] - 极快的JavaScript网格/电子表格
-
handsontable [在线演示] - 带电子表格的数据网格,可以在React、Ng、Vue中使用
-
cheetah-grid [在线演示] - 最快的网络开源数据表
-
Jspreadsheet CE [在线演示] - 创建与其他软件兼容的web端交互式表格和电子表格
-
canvas-datagrid [在线演示] - 基于Canvas的数据网格web组件。能够在单个画布元素上显示数百万连续的分层行和列,而无需分页或加载
图表库
-
D3 [在线演示] - D3(或D3.js)是一个用于web标准可视化数据的JS库
-
awesome-d3
-
angular-charts - 基于D3创建Angular创建图表的指令库
-
nvd3 [在线演示] - 一个用d3.js编写的可重用图表库
-
c3 [在线演示] - 一个基于D3的可重用图表库
-
dc.js [在线演示] - 基于D3使用corssfilter渲染的多维图表
-
britecharts [在线演示] - 基于D3.js v5的客户端可重用图表库
-
neo4jd3 [在线演示] - 使用D3.js的Neo4j图形可视化。
-
awesome-d3
-
echarts [在线演示] - 一个强大的交互式图表和数据可视化库
-
v-charts [在线演示] - 基于 Vue2.0 和 ECharts 封装的图表组件
-
echarts-for-weixin - Apache ECharts (incubating) 的微信小程序版本
-
v-charts [在线演示] - 基于 Vue2.0 和 ECharts 封装的图表组件
-
Chart.js [在线演示] - 给开发和设计人员的简单而灵活的js图表
-
vue-chartjs [在线演示] - 基于Chart.js的Vue图表组件
-
react-chartjs [在线演示] - 基于chart.js的React图表组件
-
angular-chart.js [在线演示] - 基于Chart.js的AngularJS响应式、漂亮的图表库
-
vue-chartjs [在线演示] - 基于Chart.js的Vue图表组件
-
AntV - 蚂蚁集团全新一代数据可视化解决方案
-
G2 [在线演示] - 一套面向常规统计图表,以数据驱动的高交互可视化图形语法。
-
G6 [在线演示] - ♾ G6 是一个简单、易用、完备的图可视化引擎
-
G [在线演示] - G 作为 AntV 底层的渲染引擎,致力于为上层产品提供一致、高性能的 2D / 3D 图形渲染能力,适配 Web 端全部底层渲染 API(Canvas2D / SVG / WebGL / WebGPU)。
-
X6 [在线演示] - 🚀 X6 是 AntV 旗下的图编辑引擎。
-
S2 [在线演示] - 数据驱动的多维分析表格。
-
L7 [在线演示] - 🌎 蚂蚁金服 AntV 数据可视化团队推出的基于 WebGL 的开源大规模地理空间数据可视分析开发框架。
-
F2 [在线演示] - 一个专注于移动,开箱即用的可视化解决方案,完美支持 H5 环境同时兼容多种环境(node, 小程序,weex)
-
F6 [在线示例] - F6是一款可以快速、流畅运行于移动设备中的图可视化引擎
-
F2Native [在线演示] - F2Native 是一个专注于客户端,开箱即用、高性能的可视化解决方案,完备的图形语法理论,满足你的各种需求,专业的移动设计指引为你带来最佳的移动端图表体验。
-
G2Plot [在线演示] - 基于图形语法(the Grammar of Graphics)的图表库。
-
Graphin [在线示例] - 基于G6封装的React组件库,专注在关系可视分析领域,简单高效,开箱即用
-
XFlow [在线示例] - 基于X6图编辑引擎、面向React技术栈用户的专业图编辑应用级解决方案
-
L7Plot [在线示例] - 简单易用、图表丰富、支持定制的地理空间数据可视化地理图表库。
-
Ant Design Charts [在线示例] - 简单好用的 React 图表库。
-
AVA [在线示例] - AVA 是为了更简便的可视分析而生的技术框架。 VA 代表可视分析(Visual Analytics),而第一个 A 具有多重涵义:其目标是成为一个自动化(Automated)、智能驱动(AI driven)、支持增强分析(Augmented)的可视分析解决方案。
-
Viser [在线示例] - 基于G2的适合数据可视化工程师的工具包。支持React、Vue和AngularJS。
-
G2 [在线演示] - 一套面向常规统计图表,以数据驱动的高交互可视化图形语法。
-
highcharts [在线演示] - 基于SVG的JavaScript图表库,支持旧浏览器
-
wordcloud2.js [在线演示] - 2D Canvas/Html词云
-
chartist-js [在线演示] - 简单的响应式图表
-
apexcharts.js [在线演示] - 基于SVG的交互式JavaScript图表
-
easy-pie-chart - 一个轻量级插件,为单个值绘制简单带动画的饼图
-
vega [在线演示] - 可视化语法,使用Vega,您可以用JSON格式描述数据可视化,并使用HTML5 Canvas或SVG生成交互式视图
-
heatmap.js - 基于HTML5 Canvas的Js热力图
-
HQChart - HQChart - H5, 微信小程序 沪深/港股/数字货币/期货/美股 K线图(kline),走势图,缩放,拖拽,十字光标,画图工具,截图,筹码图
-
canvas-gauges [在线演示] - 使用纯 JavaScript 和 HTML5 画布的高度可配置仪表盘。没有依赖性。由于代码库最少,因此适用于物联网设备
海报截图
-
html2canvas [在线演示] - JS截图插件
-
dom-to-image - 使用HTML5 Canvas从DOM节点生成图像
-
html-to-image - 使用HTML5 Canvas和SVG从DOM节点生成图像。
-
canvas2image [在线演示] - 用于保存或转换Canvas为图片的工具
-
mp_canvas_drawer [在线演示] - 微信小程序上canvas绘制图片助手,一个json就制作分享朋友圈图片
-
vue-canvas-poster [在线演示] - vue生成海报图,通过CSS属性画Canvas图片的轻量级组件
数据处理
-
html2pdf.js - 纯JS的客户端HTML生成PDF
-
rasterizeHTML.js - 将HTML渲染到浏览器的Canvas中
-
JavaScript-Canvas-to-Blob - 一个将Canvas元素转换为Blob对象的函数
-
jsgif - 将HTML5 Canvas保存到GIF和动画。一个AS3GIF Gifplayer到JS的港口
-
whammy - 基于Canvas来Hack的实时JS webm编码器
-
js-imagediff - 带有Jasmine匹配器的Canvas图像差异比对程序,用于测试Canvas
图像处理
-
tui.image-editor [在线演示] - 基于Canvas功能完整的照片图像编辑器。
-
merge-images - 轻松将图像组合在一起,且不会弄脏周围的画布
-
we-cropper [在线演示] - 微信小程序图片裁剪工具
-
miniPaint [在线演示] - 在线图片编辑器
-
animockup [在线演示] - 在浏览器中创建动画模型,并导出为视频或动画GIF
-
vintageJS - 使用HTML5 Canvas元素为图像添加复古/复古效果
-
glitch-canvas [在线演示] - 给画布元素添加故障效果
-
JIC [在线演示] - 使用Canvas和文件API的JS图像压缩器
-
context-blender - 与Photoshop混合模式功能相同的Canvas上下文
-
ios-imagefile-megapixel - 修复iOS6 Safari的大尺寸图像(超过百万像素)的渲染问题
画板
-
jspaint [在线演示] - Web版的经典MS Paint翻版
-
drawingboard.js [在线演示] - 一个基于画布的绘图应用程序,您可以轻松集成到您的网站上。
-
drawingboard [在线演示] - 高级画板—自由绘、直/虚线、箭头、所有几何图形
-
draw [在线演示] - 支持钢笔和触摸的Web端Canvas
签名
-
signature_pad [在线演示] - 基于HTML5画布的平滑签名绘图
-
vue-signature-pad [在线演示] - Vue版本的签名板
-
react-signature-pad - React版的签名板
-
angular-signature - Angular版的签名板
-
react-native-signature-pad - React-Native版的签名板
-
vue-signature-pad [在线演示] - Vue版本的签名板
-
signature-pad [在线演示] - JQ插件,创建基于Canvas的签名板
-
canvas-draw [在线演示] - 使用Canvas手写签名或绘图,支持PC、Mobile和横屏
波纹动画
-
wavesurfer.js [在线演示] - 以Web音频和Canvas的音频波纹
-
waveforms - 一个互动的、可探索的声波纹描绘特效
[在线演示]
-
siriwave [在线演示] - JS实现的Apple® Siri 波纹特效
-
waves [在线演示] - 模拟海浪效果
-
waveform-playlist [在线演示] - 具有画布波形预览的多轨网络音频编辑器和播放器。
-
wavedrom [在线演示] - 一个免费的开源在线数字时序图(波形)渲染引擎
粒子动画
-
Proton [在线演示] - Javascript粒子动画库
-
three.proton [在线演示] - 神奇的3D粒子引擎,使用了three.js库和Proton
-
bubbly-bg [在线演示] - 小于 1kB 的漂亮气泡背景(750 字节 gzipped)
-
react-particle-effect-button [在线演示] - 基于React的爆裂粒子效果按钮
路径动画
二维码
-
qrious [在线演示] - 使用Canvas生成二维码的纯JavaScript库
-
qrcodejs - 基于JavaScript的跨浏览器二维码生成器
-
node-qrcode - 二维码生成器
-
wifi-card [在线演示] - 打印您连接的 WiFi 二维码(wificard.io)
-
jsqrcode [在线演示] - Javascript 二维码生成器
-
instascan [在线演示] - 使用网络摄像头的 HTML5 二维码扫描仪
-
qrcode.react - 用于React的二维码组件
-
qrbtf [在线演示] - 艺术二维码生成器
-
Awesome-qr.js [在线演示] - 一个用 JavaScript 编写的很棒的二维码生成器
-
jquery-qrcode - JQ二维码独立生成(不依赖于外部服务)
-
vue-qrcode-reader [在线演示] - 一组用于检测和解码二维码的 Vue.js 组件
-
weapp-qrcode [在线演示] - 在 微信小程序 中,快速生成二维码
-
qr-image - 另一个二维码生成器
验证码
-
jigsaw [在线演示] - canvas滑动验证码
- jq_slideImage [在线演示] - jQuery滑动拼图验证插件
- jigsaw [在线演示] - canvas滑动验证插件jigsaw
- JQuery插件库验证码资源地址
运行时
-
node-canvas - 由Cairo支持的Node.js画布实现。
-
skia-canvas - 关于Canvas的Node.js环境
-
ExplorerCanvas - IE8以前的Canvas环境
其他
-
paper.js [在线演示] - 矢量图形脚本的瑞士军刀
-
react-canvas - 将React组件渲染成Canvas而不是DOM
-
react-native-canvas - React Native Canvas组件
插件资源网站
- CodePen Canvas特效资源
- ANIMPEN 码笔网 Canvas特效资源
- JQuery之家 Canvas特效资源
- JQuery插件库 Canvas特效资源
- CodePen上Canvas相关的你应该关注的人
效果/案例
-
canvas-confetti [在线演示] - 一个撒花/纸屑效果插件
-
lucky-canvas [在线演示] - 基于 TS + Canvas 开发的【大转盘 / 九宫格】抽奖插件,rainbow 一套源码适配多端框架 JS / Vue / React / Taro / UniApp / 微信小程序等
-
CanvasInput [在线演示] - HTML5 Canvas文本输入框
-
wind-js [在线演示] - 使用JS API在Canvas中模拟风的演示动画
-
curvejs [在线演示] - 魔幻线条
-
canvas-nest.js - 一个基于 html5 canvas 绘制的网页背景效果。
-
canvas-special - 超多经典 Canvas 实例,动态离子背景、炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等
-
canvas效果集合
-
shape-shifter [在线演示] - 这是一个基于用户输入使用一组粒子来渲染不同形状的画布实验。它支持多种模式:文本,倒计时,时间和图标
文章
- 可视化私房菜 - 可视化国家队的私房菜,用心烹调,以飨读者。
- 体系化建设 BI 业务定制图表
- 图可视化知多少 - 图可视化、图分析及图编辑知识库。
- G2Plot 可视化圈子
- G2:图形、交互语法
- 可视化小讲堂
- 玩转「Canvas」 - 编程圈 @糖少
- JS之使用Canvas绘图 - 简书 @LemonnYan
- 一个少女心满满的例子带你入门 Canvas - 掘金 @sunshine小小倩
- 为了让她10分钟入门canvas,我熬夜写了3个小项目和这篇文章 - 掘金 @Sunshine_Lin
- 更优雅地基于 canvas 在前端画海报 - 掘金 @2dunn
- 【🎨万物皆可动】详解Canvas路径动画- 掘金 @ChanningHyl
- 产品经理:你能不能用div给我画条龙? - 掘金 @大帅老猿
- Canvas性能优化 - 掘金 @清夜
- 为了让你们进阶Canvas,我花7小时写了3个有趣的小游戏!!! - 掘金 @Sunshine_Lin
- 十分钟实现灭霸打响指灰飞烟灭的效果 - 掘金 @wangzy2019
- 匠心打造canvas签名组件 - @路易斯