三人行必有我师焉,择其善者而从之,其不善者而改之
三人行必有我师焉,择其善者而从之,其不善者而改之
三人行必有我师焉,择其善者而从之,其不善者而改之
三人行必有我师焉,择其善者而从之,其不善者而改之
三人行必有我师焉,择其善者而从之,其不善者而改之

canvas的像素级操作——1.引子
作者:Neoxone    发表时间: 2012年01月6号,星期五     阅读:10,592 次

本文是对《MDC的canvas经典教程辑和个人学习笔记》的补遗,也是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——在最新标准中已引入一个Uint8ClampedArrayTyped 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。

标签: , , , ,

一条评论 发表在“canvas的像素级操作——1.引子”上

  1. [...] 之前整理过几篇像素级操作的文章。http://www.cssass.com/blog/index.php/2012/1140.html [...]

留下回复

):9:( ):8:( ):7:( ):6:( ):5:( ):4:( ):3:( ):2:( ):20:( ):1:( ):19:( ):18:( ):17:( ):16:( ):15:( ):14:( ):13:( ):12:( ):11:( ):10:(