摘要:
canvas可以读取图片后,使用drawImage方法在画布内进行重绘。本文介绍canvas的图像处理
drawImage
drawImage() 方法在画布上绘制图像、画布或视频。drawImage() 方法也能够绘制图像的某些部分,以及/或者增加或减少图像的尺寸。
语法
在画布上定位图像:
context.drawImage(img,x,y);
在画布上定位图像,并规定图像的宽度和高度:
context.drawImage(img,x,y,width,height);
剪切图像,并在画布上定位被剪切的部分:
context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height);
参数
img 规定要使用的图像、画布或视频。
sx 可选。开始剪切的 x 坐标位置。
sy 可选。开始剪切的 y 坐标位置。
swidth 可选。被剪切图像的宽度。
sheight 可选。被剪切图像的高度。
x 在画布上放置图像的 x 坐标位置。
y 在画布上放置图像的 y 坐标位置。
width 可选。要使用的图像的宽度。(伸展或缩小图像)
height 可选。要使用的图像的高度。(伸展或缩小图像)
1 <canvas id="myCanvas" width="800" height="600"> 2 您的浏览器不支持canvas! 3 </canvas> 4 <script> 5 var canvas = document.getElementById('myCanvas'); 6 if (canvas.getContext) { 7 var ctx = canvas.getContext('2d'); 8 var img = new Image(); 9 img.onload = function() { 10 if (img.width != canvas.width) 11 canvas.width = img.width; 12 if (img.height != canvas.height) 13 canvas.height = img.height; 14 15 ctx.clearRect(0, 0, canvas.width, canvas.height); 16 ctx.drawImage(img, 0, 0); // 设置图像对象,以及它在画布上的位置 17 }; 18 img.src = "tree.gif"; 19 } 20 </script>
注意:drawImage方法只能在图像完全载入后才能调用
getImageData与putImageData
getImageData() 方法返回 ImageData 对象,该对象拷贝了画布指定矩形的像素数据。putImageData() 方法将图像数据(从指定的 ImageData 对象)放回画布上。
getImageData() 方法返回 ImageData 对象,该对象拷贝了画布指定矩形的像素数据。
对于 ImageData 对象中的每个像素,都存在着四方面的信息,即 RGBA 值:
- R - 红色 (0-255)
- G - 绿色 (0-255)
- B - 蓝色 (0-255)
- A - alpha 通道 (0-255; 0 是透明的,255 是完全可见的)
color/alpha 以数组形式存在,并存储于 ImageData 对象的 data 属性中。
语法
context.getImageData(x,y,width,height);
context.putImageData(imgData,x,y,dirtyX,dirtyY,dirtyWidth,dirtyHeight);
参数
x 开始复制的左上角位置的 x 坐标。
y 开始复制的左上角位置的 y 坐标。
width 将要复制的矩形区域的宽度。
height 将要复制的矩形区域的高度。
imgData 规定要放回画布的 ImageData 对象。
x ImageData 对象左上角的 x 坐标,以像素计。
y ImageData 对象左上角的 y 坐标,以像素计。
dirtyX 可选。水平值(x),以像素计,在画布上放置图像的位置。
dirtyY 可选。水平值(y),以像素计,在画布上放置图像的位置。
dirtyWidth 可选。在画布上绘制图像所使用的宽度。
dirtyHeight 可选。在画布上绘制图像所使用的高度。
1 <canvas id="myCanvas" width="800" height="600"> 2 您的浏览器不支持canvas! 3 </canvas> 4 <script> 5 var c=document.getElementById("myCanvas"); 6 var ctx=c.getContext("2d"); 7 ctx.fillStyle="red"; 8 ctx.fillRect(10,10,50,50); 9 10 var imgData=ctx.getImageData(30,30,50,50); 11 red=imgData.data[0]; 12 green=imgData.data[1]; 13 blue=imgData.data[2]; 14 alpha=imgData.data[3]; 15 </script>
toDataURL
toDataURL()方法将canvas上的元素保存为图像。context.toDataURL()返回的是一串Base64编码的URL。
语法
context.toDataURL('canvas.png');
参数
canvas.png生成的图像
save与restore
save方法用于保存上下文环境,restore方法用于恢复到上一次保存的上下文环境,都没有参数。Canvas 状态是以堆(stack)的方式保存的,每一次调用 save 方法,当前的状态就会被推入堆中保存起来。会保存strokeStyle, fillStyle, globalAlpha, lineWidth, lineCap, lineJoin, miterLimit, shadowOffsetX, shadowOffsetY, shadowBlur, shadowColor, globalCompositeOperation 的值。你可以调用任意多次 save 方法。每一次调用 restore 方法,上一个保存的状态就从堆中弹出,所有设定都恢复。
语法:
context.save();
context.restore();
1 <canvas id="myCanvas" width="800" height="600"> 2 您的浏览器不支持canvas! 3 </canvas> 4 <script> 5 window.onload=function(){ 6 var ctx=document.getElementById("myCanvas").getContext("2d"); 7 ctx.fillStyle = 'red'; 8 ctx.fillRect(10,10,150,150); 9 10 ctx.save(); 11 ctx.fillStyle="green"; 12 ctx.fillRect(30,30,110,110); 13 14 ctx.save(); 15 ctx.fillStyle="yellow"; 16 ctx.fillRect(50,50,70,70); 17 ctx.restore();//回到上一个状态,即 ctx.fillStyle="green"; 18 ctx.save(); 19 ctx.fillRect(70,70,30,30); 20 ctx.restore(); 21 } 22 </script>
效果