-
Notifications
You must be signed in to change notification settings - Fork 0
原生canvas
canvas绘图API都保存在canvas.getContext('2d')对象上的
let canvas = document.createElement('canvas');
let ctx = canvas.getContext('2d')
console.info(ctx)var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
ctx.beginPath();
ctx.moveTo(0,0);
ctx.lineTo(300,150);
ctx.stroke();注意:在绘制前,只是设置了样式,或绘制的路径,最后一步context.stroke()或context.fill()才是真正的绘制,前面的操作看不见。
| 属性 | 描述 |
|---|---|
| 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() | |
| getContext() | |
| toDataURL() |
我们要知道,一个图形对象上的每一点像素都是从上到下一行一行(每一行里又是从左到右)有序地排列着的,而每一个像素又有四个数值(RGBA)表示它的颜色。
比如下方有一个非常简单的图形对象(假设我把它放大了75倍,方便查看),它一共只有四个像素点,这四个像素点的RGBA数值分别是(255,255,0,255)、(0,255,64,255)、(43,149,255,255)、(236,103,100,51) :
那么这个图形对象的“像素数据”可以看为一个数组: [255,255,0,255,0,255,64,255,43,149,255,255,236,103,100,51]
也就是把四个像素的RGBA数据依次拼起来。当然这里只是一个非常简单的例子,常规的图像可能有几千几万个像素,但它们的像素数据都遵循这种存储方式。
ImageData你可以理解为“含像素数据的图形对象”,“像素数据”指的是该图形对象上的每一个有序的像素的数据,每个像素都有它对应的颜色数据(RGBA值)。
我们可以通过 createImageData(width,height) 方法来创建一个ImageData对象,然后通过 putImageData(imgData,x,y) 方法把ImageData对象放到画布上:
let c = document.getElementById("myCanvas");
let ctx = c.getContext("2d");
let imgData = ctx.createImageData(200,100); // 创建一个宽为200,高为100的ImageData对象
for (let i=0;i<imgData.data.length;i+=4) { // 遍历ImageData对象的每一个像素点,并给它们上色
imgData.data[i+0]=255;
imgData.data[i+1]=100;
imgData.data[i+2]=0;
imgData.data[i+3]=255;
}
ctx.putImageData(imgData,50,60); // 将上述创建的ImageData对象放到画布坐标(50,60)的位置其实 putImageData() 方法还有四个可选参数,可以用来裁剪ImageData对象上的指定区域。其全部参数为: ctx.putImageData( imgData, x, y, clip_X, clip_Y, clip_Width, clip_Height); clip_X,clip_Y分别表示相对于ImageData对象的裁剪起始点坐标,clip_Width, clip_Height表示要裁剪的矩形区域宽高。
- x:开始复制的左上角位置的 x 坐标
- y:开始复制的左上角位置的 y 坐标
- width:将要复制的矩形区域的宽度
- height:将要复制的矩形区域的高度 getImageData() 方法返回 ImageData 对象,该对象拷贝了画布指定矩形的像素数据。
let c=document.getElementById("myCanvas");
let ctx=c.getContext("2d");
ctx.fillStyle="green";
ctx.fillRect(10,10,50,50);
let imgData = ctx.getImageData(30,30,50,50);
let red = imgData.data[0];
let green = imgData.data[1];
let blue = imgData.data[2];
let alpha = imgData.data[3];
console.info(red + " " + green + " " + blue + " " + alpha);- image:image或canvas对象
- sx,sy: 源对象的x,y坐标
- sWidth,sHeight 源对象的宽高 可选
- dx,dy: 画布上的x,y坐标
- dWidth,dHeight 在画布上绘制的宽高 可选
在位置 (10,10) 处绘制一个矩形,将新的 (0,0) 位置设置为 (70,70)。再次绘制新的矩形(请注意现在矩形从位置 (80,80) 开始绘制):
旋转角度,以弧度计
// 将矩形旋转 20 度
let c = document.getElementById("myCanvas")
let ctx = c.getContext("2d")
ctx.rotate(20*Math.PI/180)
ctx.fillRect(50,20,100,50)let c=document.getElementById("myCanvas");
let ctx = c.getContext("2d")
ctx.strokeRect(5,5,25,15)
ctx.scale(2,2)
ctx.strokeRect(5,5,25,15)- mtx.a:水平旋转绘图
- mtx.b:水平倾斜绘图
- mtx.c:垂直倾斜绘图
- mtx.d:垂直缩放绘图
- mtx.tx:水平移动绘图
- mtx.ty:垂直移动绘图
将当前转换重置为单位矩阵。然后运行 transform() setTransform() 方法把当前的变换矩阵重置为单位矩阵,然后以相同的参数运行 transform()。
替换绘图的当前转换矩阵 transform会在前面的变换基础上进行变换,而setTransform会重置。这是两者区别。
let mtx = new createjs.Matrix2D();
if (mtx) { ctx.save(); ctx.transform(mtx.a, mtx.b, mtx.c, mtx.d, mtx.tx, mtx.ty); }
ctx.fill();
if (mtx) { ctx.restore(); }在画布上放置图像在x,y坐标处
在画布上定位图像,并规定图像的宽度和高度
剪切图像,并在画布上定位被剪切的部分。drawImage(img,sx,sy,swidth,sheight,x,y,width,height)加粗为裁切参数。
- img:规定要使用的图像、画布或视频。
- sx:可选。开始剪切的 x 坐标位置。
- sy:可选。开始剪切的 y 坐标位置。
- swidth:可选。被剪切图像的宽度。
- sheight:可选。被剪切图像的高度。
- x:在画布上放置图像的 x 坐标位置。
- y:在画布上放置图像的 y 坐标位置。
- width:可选。要使用的图像的宽度。(伸展或缩小图像)
- height:可选。要使用的图像的高度。(伸展或缩小图像)