使用HTML5 Canvas绘图来实现马赛克拼图,即由上千张小的方形图拼成一张人脸的大图。

下图显示了由上千张头像拼成的章子怡的脸:

  使用Canvas创建了两个重叠的图层:底层用来显示小的方形图,上层用来显示大的人脸图。通过改变上层人脸图的透明度,就能实现如上图所示的马赛克拼图效果。

  具体的实现代码如下:

 1 <!DOCTYPE html> 2 <html> 3   <head> 4           <title>图像马赛克</title> 5         <style type="text/css"> 6             #small { 7                 position:absolute; 8                 left: 10px; 9                 top: 10px;10             }11             #big {12                 position:absolute;13                 left: 10px;14                 top: 10px;15             }16         </style>17   </head>18   <body>19   <canvas id="small" style="border: 1px solid;"  width="800" height="600"> </canvas>20   <canvas id="big" style="border: 1px solid;"  width="800" height="600"> </canvas>21   <script>22           var canvas = document.getElementById('small');23           var smallcontext = canvas.getContext('2d');24           var photo = Array(1200);25       26         for(var i = 0; i < 1200; i ++) {27              drawPhoto(i);28         }                    29         30         //绘制小图  31         function drawPhoto(i) {32             photo[i] = new Image();33               photo[i].src = "photo/p (" + (i % 652) + ").jpg";34               photo[i].onload = function() {35                 //JavaScript没有整除运算,需要理由取余运算进行转换            36                 smallcontext.drawImage(photo[i], (i % 40) * 20, ((i - (i % 40)) / 40) * 20, 20, 20);37               }38         }39         40         //绘制大图41         var canvas = document.getElementById('big');42           var bigcontext = canvas.getContext('2d');43         bigpic = new Image();44         bigpic.src = "b.jpg";45         bigpic.onload = function() {46             bigcontext.drawImage(bigpic, 0, 0, 800, 600);47             changeAlpha(bigcontext);48         }49         50         //改变大图的透明度51         function changeAlpha(context) {52             //获得像素数据53             var imgd = context.getImageData(0, 0, 800,600);54             var pix = imgd.data;55             for(var i = 0, n = pix.length; i < n; i += 4) {56                 //每个像素由四个图像数据组成,分别表示红色,绿色,蓝色和透明度57                 //取值范围都是从0到255的数字58                 pix[i+3] = 190;59             }60             //保存像素数据61             context.putImageData(imgd, 0, 0);62         }63   </script>64   </body>65 </html>

  在实现过程中,一共遇到三个问题。

  1. Javascript的代码是分块处理的,如果在一个块内对某个变量进行多次赋值操作,则该区块内的该变量在运行时都为最终值。因此,必须将加载小头像的代码单独放在一个函数内;否则,加载的小头像都是同一个头像。
  2. 图片增加了Canvas操作的复杂度:必须等到图片完全加载后才能对其进行操作。浏览器通常会在页面脚本执行的同时异步加载图片。如果试图在图片未完全加载之前就将其呈现到Canvas上,那么Canvas将不会显示任何图片。因此,必须使用回调函数来确保图片在呈现之前已经加载完毕。
  3. 在本机测试HTML5 Canvas程序的时候,如果用context.drawImage()后再用context.getImageData()获取图片像素数据的时候会抛出错误:SECURITY_ERR:DOM Exception 18。这是Javascript同源策略(Same origin policy)造成的。目前此问题在Firefox和Chrome中都存在。

    解决方法如下:

    Firefox:在地址栏输入about:config,然后设置security.fileuri.strict_origin_policy为false。

    Chrome:在命令行中运行 /path-to-chrome/chrome.exe –allow-file-access-from-files。

转载于:https://www.cnblogs.com/alex-cheng/archive/2011/09/22/2185447.html

使用HTML5 Canvas实现马赛克拼图相关推荐

  1. HTML5 canvas生成图片马赛克特效插件

    HTML5 canvas生成图片马赛克特效插件 简要教程 这是一款使用html5 canvas来将图片制作成马赛克效果的js插件.该插件的灵感来自于美国肖像画家Chuck Close.已经有人使用这个 ...

  2. HTML5 Canvas图片马赛克模糊动画

    经常可以在网上或者电视上看到被马赛克模糊的图片或者视频,今天我们要利用HTML5 Canvas技术来实现图片的马赛克模糊效果.在演示中我们可以拖动滑竿来设置马赛克模糊的程度,你可以在不同的值下观察图片 ...

  3. html5 即时生成图片,HTML5 canvas生成图片马赛克特效插件

    这是一款使用html5 canvas来将图片制作成马赛克效果的js插件.该插件的灵感来自于美国肖像画家Chuck Close.已经有人使用这个js插件来制作了一个完整的图片马赛克应用框架:The Pi ...

  4. html5 生成图片插件,HTML5 canvas生成图片马赛克特效插件

    简要教程 这是一款使用html5 canvas来将图片制作成马赛克效果的js插件.该插件的灵感来自于美国肖像画家Chuck Close.已经有人使用这个js插件来制作了一个完整的图片马赛克应用框架:T ...

  5. canvas 实现图片局部模糊_HTML5 Canvas图片马赛克模糊动画

    本文作者html5tricks,转载请注明出处 经常可以在网上或者电视上看到被马赛克模糊的图片或者视频,今天我们要利用 HTML代码如下 Change pixel resolution 32 定义了一 ...

  6. canvas动画科技园_8个经典炫酷的HTML5 Canvas动画欣赏

    HTML5非常强大,尤其是Canvas技术的应用,让HTML5几乎可以完成所有Flash能完成的效果.本文精选了8个经典炫酷的HTML5 Canvas动画欣赏,每一个都提供全部的源代码,希望对你有所帮 ...

  7. html5常用动画效果教程,HTML5教程 8个经典HTML5 Canvas动画学习

    本篇教程探讨了HTML5教程 8个经典HTML5 Canvas动画学习,希望阅读本篇文章以后大家有所收获,帮助大家HTML5+CSS3从入门到精通 . < HTML5非常强大,尤其是Canvas ...

  8. html5游戏开发马赛克对比,基于HTML5 Canvas的纯JS图片马赛克效果插件

    这是一款基于HTML5 canvas的图片马赛克js插件.该图片马赛克插件使用简单,可调整马赛克的大小,透明度等属性,适合用于制作一些特殊的图片效果. 基于HTML5 Canvas的纯JS图片马赛克效 ...

  9. html5拖拽实现拼图,HTML5技术之图像处理:一个滑动的拼图游戏

    HTML5有许多功能特性可以把多媒体整合到网页中.使用canvas元素可以在这个空白的画板上填充线条,载入图片文件,甚至动画效果. 在这篇文章中,我将做一个滑动拼图的游戏用来展示HTML5 canva ...

最新文章

  1. JavaCore/HeapDump文件及其分析方法
  2. 数据库中字段类型对应C#中的数据类型
  3. java中的技术_Java中的四个核心技术思想
  4. 【R语言】R是现在最好的数据科学语言吗?
  5. docker日志引擎说明
  6. vfp和python比较_vfp-和vfp相关的内容-阿里云开发者社区
  7. 网页设计期末复习 选择+简答+大题
  8. wincc控件之FlexGrid系列(注册安装)
  9. 转载-【常用RGB颜色查询对照表及感情色】
  10. 官方水晶报表 .NET 应用程序实例下载 (Visual Basic .NET)
  11. linux常用操作命令总结
  12. git clone报错:could not read Username for ‘http://xxx.com‘: Device not configured
  13. Android神奇“控件”-----RemoteViews
  14. Eclipse的preference的位置
  15. 【CV】SiamFC:用于目标跟踪的全卷积孪生网络
  16. Java 学习路线大全,再也不用迷路啦(持续更新)
  17. 04_Large_OAD
  18. 全国计算机b级试题及答案,全国计算机等级考试一级b模拟试题及答案
  19. FPGA自动售货机设计
  20. 因为干过外包,我脏了简历!大厂HR透露:干过外包就刷掉

热门文章

  1. 谜题79: 这是狗的生活
  2. java程序员从笨鸟到菜鸟之(十五)StringBuffer类练习题
  3. 硬盘中单击auto病毒的清理
  4. ENVI安装步骤和常见问题及解决办法(以ENVI5.3为例)
  5. 3D模型文件--STL,OBJ,3DS
  6. 设计神经网络的基本原则,神经网络设计原则包括
  7. 一看就会的meta分析-Stata
  8. 2017十大网络黑客攻击事件丨阿里云河南
  9. MATLAB/Simulimk 低压用户型电能路由器仿真模型(光伏发电+储能+逆变孤网运行)
  10. 量子计算机在医学的应用,量子计算机运算能力强大 有助推动医疗、交通发展...