canvas的像素级操作——1.引子

本文是对《MDC的canvas经典教程辑和个人学习笔记》的补遗,也是canvas像素级操作系列文章的一个引子。

既然是引子,那就不能开门见山的介绍了,我们先讲讲如何复制canvas.
已知一个image对象,我们将其绘制进canvas的方法是什么?drawImage。(当然使用createPattern模板填充也是一个方法)。
那已知一个canvas对象,我们将其绘制进另一个canvas的方法呢?
答案还是drawImage,drawImage算是一个很辽阔的方法了,不仅可以绘image,也可以绘canvas对象,甚至还可以绘video的帧。

并且他拥有大量参数:(Image [, vXSrc] [, vYSrc] [, vWSrc] [, vHSrc], vXDest, vYDest [, vWDest] [, vHDest]),这个读者可以先不管,往下看。

那么,除了drawImage这个方法,还有没有其他方法呢——有,putImageData方法隆重登场。

 

上面的cloneData方法就是通过将源canvas中像素数据ImageData,输出(putImageData)到新的canvas中,达到复制作用。

不过,我们在获取和输出ImageData的过程中,并没有对ImageData做过任何处理,而这个ImageData数据是包含{width,height,CanvasPixelArray},其中CanvasPixelArray包含了图像(canvas也可看做图像)的每一个像素的RGBA数据,可见中间的操作空间是很大的,以后我们会做重点讨论。

插注:CanvasPixelArray——在最新标准中已引入一个Uint8ClampedArray的Typed Array来替代 ,在各浏览器实现之后,将使得对ImageData的操作更快速更便捷。参考例子:http://hacks.mozilla.org/2011/12/faster-canvas-pixel-manipulation-with-typed-arrays/

下面介绍一下像素操作的三个方法:

createImageData();
getImageData();
putImageData();

createImageData的参数是(w,h)可以新建一个W*H尺寸的新的ImageData【firefox3.5开始支持】,不过也可以使用参数(anotherImageData)来创建【firefox5开始支持】。

getImageData的参数(x,y,w,h)表示起点x,y,尺寸w,h。可以获取canvas.context中在参数范围内的ImageData。

putImageData的参数使用要着重要介绍下(和drawImage的参数可以触类旁通):

 

putImageData参数有(ImageData, dx, dy [, DirtyX] [, DirtyX] [, DirtyWidth] [, DirtyHeight])

imageData:包含了图像的width,height,还有一个CanvasPixelArray,前面已经提了。
dx, dy:表示绘图起始位置。相对于canvas区域左上角。
后面四个可选参数:表示可见区范围。相对于起绘点,即上面的参数dx,dy表示的点。缺省为0,0,ImageData.width,ImageData.height。