操作图像的像素:getImageData() putImageData()

ImageData对象

调用getImageData()方法实际是获取了一个指向ImageData对象的引用,返回的对象包含3个属性:1)width以设备像素为单位的图像数据宽度 2)height以设备像素为单位的图像数据高度 3)data包含各个设备像素数值的数组

width和height都是只读的无符号长整数,data属性包含的每个数组元素都表示图像数据中相应的像素值,每个值包含的颜色分量都是含有8个二进制位的整数(后面将详细讲解)

为了使绘图更加逼真,浏览器可能会使用多个像素来表示一个像素,一个边长都为200像素的canvas,共有40000个像素,若浏览器用2个像素来表示原来的1个像素,将有160000像素,可通过width和height查看

putImageData()方法不受全局设置的影响(globalAlpha与globalCompositeOperation等),也不会在绘制时运用图像合成、阴影等效果,drawImage()方法与之相反,会受全局属性影响

getImageData()参数分别是x、y、图像的高和图像的宽

putImageData()方法后4个参数表示图像数据中一块脏矩形区域(以设备像素为单位),这4个参数是可选的,不指定则采取默认值:

所绘脏矩形距离整幅图像数据左上角的水平偏移量,以设备像素为单位,默认0

所绘脏矩形距离整幅图像数据左上角的垂直偏移量,以设备像素为单位,默认0

以设备像素为单位的脏矩形宽度,默认是整幅图像的宽度

以设备像素为单位的脏矩形高度,默认是整幅图像的高度

注意,putImageData()方法的第二个和第三个参数以CSS像素计量

ImageData对象中的数组

ImageData对象中的data属性指向一个包含8位二进制整数的数组,这些整数的值位于0-255之间,分别表示一个像数的红、绿、蓝及透明度分量

遍历每个数组

for(var index=0;index<length;++i){

    value=data[index];

  }

反向遍历每个像素

index=length-1;

while(index >=0){

    value=data[index];

    index--;

  }

只处理alpha值,不修改红绿蓝分量

for(index=3;index<length-4;index+=4){

    data[index]=...;

  }

只处理红绿蓝分量,不修改alpha值

for(index=0;index<length-4;index+=4){

    data[index]=...;

    data[index+1]=...;

    data[index+2]=...;

  }

图像滤镜

通过操作单个像素实现滤镜效果

负片滤镜,即反向,255减去当前的分量,alpha值不变

黑白滤镜,计算每个像素红绿蓝分量的平均值,将三个分量都设置为这个值

浮雕滤镜, 基于当前像素的前一个像素RGB值与它的后一个像素的RGB值之差再加上128

在与图像数据有关的度量值中,应该使用设备像素而非CSS像素

用工作线程处理图像

浏览器在执行JavaScript代码时,使用的是主线程,可以使用工作线程处理一些复杂运算,以便浏览器能够及时响应用户操作

当主线程执行到sunglassFilter=new Work('sunglassFilter.js')这一行语句时,会创建一个工作线程,传递给Work构造器的文件名表示工作进程将要执行的Javascript代码文件,可以在其他函数中调用变量sunglassFilter,实现一些通信

以图像制作动画

通过设置setInterval()来持续降低每个像素的alpha值,实现淡入淡出效果

图像绘制的安全问题

HTML5Canvas规范允许绘制不属于自己的(其他域)的图像,但却不能通过CanvasAPI保存或修改其他域中的图像

安全机制原理:每个canvas都有一个origin-clean的标志位,初始值是true,如果使用了drawImage()绘制一幅其他域中的图像,origin-clean的值将被设置为false;本身就是false的canvas绘制到当前canvas中,依旧是false,对origin-clean为false的canvas调用toDataURL()或getImageData()会抛出异常

浏览器会将用户的文件系统与运行应用程序的环境视为两个不同的域,所以在默认情况下不能保存或修改文件系统的图片

临时解决办法:在命令行中指定“--allow-file-access-from-files”参数来启东Chrome浏览器,使用火狐浏览器时调用netscape.security.PriviegeManager.enablePrivilege("UniversalBrowserRead");

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf6的更多相关文章

  1. HTML5 Canvas核心技术图形动画与游戏开发 ((美)David Geary) 中文PDF扫描版​

    <html5 canvas核心技术:图形.动画与游戏开发>是html5 canvas领域的标杆之作,也是迄今为止该领域内容最为全面和深入的著作之一,是公认的权威经典.amazon五星级超级 ...

  2. HTML5 Canvas核心技术图形动画与游戏开发(读书笔记)----第一章,基础知识

    一,canvas元素 1 为了防止浏览器不支持canvas元素,我们设置“后备内容”(fallback content),下面紫色的字即为后备内容 <canvas id="canvas ...

  3. Html5 Canvas核心技术(图形,动画,游戏开发)--基础知识

    基础知识 canvas 元素可以说是HTML5元素中最强大的一个,他真正的能力是通过canvas的context对象表现出来的.该环境对象可以从canvas元素身上获得. <body> & ...

  4. HTML5 Canvas核心技术:图形、动画与游戏开发 PDF扫描版​

    HTML5 Canvas核心技术:图形.动画与游戏开发 内容简介: <HTML5 Canvas核心技术:图形.动画与游戏开发>中,畅销书作家David Geary(基瑞)先生以实用的范例程 ...

  5. HTML5 Canvas核心技术—图形、动画与游戏开发.pdf2

    事件处理: HTML5应用程序是以事件来驱动的,可以在canvas中增加一个事件监听器,当事件发生时,浏览器就会调用这个监听器 //方法一canvas.onmousedown=function(e){ ...

  6. HTML5 Canvas核心技术—图形、动画与游戏开发.pdf8

    第6章 精灵 精灵(sprite),它是一种可以集成入动画之中的图像对象,赋予它们各种行为,精灵并非Canvas API的一部分,,但都是从它衍生而来 本章将会实现三种设计模式:策略模式(精灵与绘制器 ...

  7. HTML5 Canvas核心技术—图形、动画与游戏开发.pdf7

    性能 运行putImageData()比drawImage()慢,同等条件下优先考虑drawImage() 操作图像数据需要遍历大量数据,应该注意几点: 1)避免在循环体中直接访问对象属性,应当保存在 ...

  8. HTML5 Canvas核心技术—图形、动画与游戏开发.pdf1

    canvas元素可以说是HTML5元素中功能最强大的一个,它真正的能力是通过Canvas的context对象(绘图上下文)表现出来的 fillText()方法使用fillStyle属性来填充文本中的字 ...

  9. HTML5 Canvas核心技术—图形、动画与游戏开发.pdf5

    文本的定位 水平与垂直定位:当使用strokeText()和fillText()绘制文本时,指定了所绘文本的X与Y坐标,还有textAlign与textBaseline两个属性 textAlign:s ...

随机推荐

  1. QListWidget 删除选中项目

    void MainWindow::on_action_Del_triggered() { QList<QListWidgetItem*> selectedItems = ui->li ...

  2. js 中对象属性特性2

    对象的存储描述: get   和   set 方法 <script> var obj ={ get age(){ return 22 }, set age(value){ console. ...

  3. Linux crontab定时执行任务 命令格式与详细例子

    基本格式 : * * * * * command 分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示 第2列表示小时1-23(0表示0点) 第3列表示日期1-31 第4列表示 ...

  4. stream_context_create解决file_get_contents超时处理

    stream_context_create作用:创建并返回一个文本数据流并应用各种选项,可用于fopen(),file_get_contents()等过程的超时设置.代理服务器.请求方式.头信息设置的 ...

  5. 由css属性:vertial-align想到的。。

    我的笔记本:型号 acer4750G-2412g50mnkk 分辨率:1333*768,点距:0.25933mm; 12px下的font-size: 默认line-height减去font-size: ...

  6. jquery mobile页面跳转后,必须重新刷新页面js方可有效

    最近在做个项目,用到jquery mobile,很陌生对他,问题一个个的来,那就要一个个解决,找了一天这个问题,放可明白:首先明白jqm里面页面跳转默认都是通过ajax请求的,必须重新刷新页面js方可 ...

  7. 【转】iOS设计模式之观察者模式

    参考:http://blog.csdn.net/xdrt81y/article/details/24039163 或者 http://blog.jobbole.com/55505/

  8. STM32库函数开发使用总结

    一.外设常具备的几类寄存器 控制寄存器xxx_CR (Control/Configuration Register): 用来配置.控制响应外设的工作方式,如GPIOx_CRL.AFIO_EXTICR1 ...

  9. c# 之 New新知

    本人从事.NET工作已经一段时间,毕业之前一直想着做C++的,后来因为各种原因(跟学校导师相关),走向了.NET之路,从而时不时补一下.net的基础知识,因为自己的.NET知识还不是很扎实.近期每天早 ...

  10. Spring MVC 环境搭建(maven+SpringMVC+mybatis+Freemarker)

    Spring MVC 环境搭建(maven+SpringMVC+mybatis+Freemarker) 一.准备工作 1.Eclipse Java EE IDE(4.4.1) 2.JDK 3.Tomc ...