`

利用HTML5中Canvas处理并存储图片

 
阅读更多

      HTML5中增加的Canvas元素,配合JS灵活的语法,处理起图片变得异常简单,不需要在客户端用C/C++写一大堆代码,对于熟悉JS的程序员来说,只需要考虑处理图片的逻辑了。

 


 

      canvas中如果想要处理图片就需要借助ImageData这个对象,就是将画布中某一区域中的图像以RGBA的方式保存下来,存成一个二维数组。

    

[javascript] view plaincopy
  1. ctx.getImageData( x, y, w, h)      //获取ImageData  
  2. ctx.putImageData( x, y, w, h)     //将ImageData绘在画布上  

   

     写了个简单的处理图像的类,可以翻转/灰化/去色/高亮/设单色值

    

[javascript] view plaincopy
  1. /** 
  2.  * @author Norris Tong 
  3.  */  
  4.   
  5. var PS = function( config ){  
  6.     //$.extend( this, config );  
  7.     return this;  
  8. }  
  9.   
  10. PS.prototype = {  
  11.       
  12.     //将图像灰化  
  13.     gray        : function( ctx, imageData ){  
  14.         var w = imageData.width,  
  15.                 h = imageData.height,  
  16.                 ret = ctx.createImageData( w, h );  
  17.           
  18.         for (i=0; i<w; i++)  
  19.         {  
  20.             for (j=0; j<h; j++)  
  21.             {  
  22.                 var index=(i*h+j) * 4;  
  23.               
  24.                 var red=imageData.data[index];  
  25.                 var green=imageData.data[index+1];  
  26.                 var blue=imageData.data[index+2];  
  27.                 var alpha=imageData.data[index+3];  
  28.               
  29.                 var average=(red+green+blue)/3;  
  30.               
  31.                 ret.data[index]=average;  
  32.                 ret.data[index+1]=average;  
  33.                 ret.data[index+2]=average;  
  34.                 ret.data[index+3]=alpha;  
  35.               }  
  36.         }  
  37.           
  38.         return ret;  
  39.     },  
  40.       
  41.     // 生成ImageData  
  42.     createImageData : function( ctx, ori, from, w, h ){  
  43.             var ret = ctx.createImageData( w, h );  
  44.             var total = w * h * 4;  
  45.             from = from * w * 4;  
  46.             for (var i= 0 ; i< total; i++) {  
  47.                 ret.data[ i ] = ori.data[ from + i ];  
  48.             }  
  49.               
  50.             return ret;  
  51.     },  
  52.       
  53.     //生成ImageData  
  54.     //对称图像反转  
  55.      createImageDataTurn    : function( ctx, ori, from, w, h ){  
  56.             var ret = ctx.createImageData( w, h );  
  57.             var total = w * h * 4;  
  58.             from = from * w * 4;  
  59.             for (var j=0; j<h; j++) {  
  60.                 for (var i=0; i<w; i++) {  
  61.                     var  a =  (j * w + i) * 4,  
  62.                             b = from + a,  
  63.                             c =  (j * w + w- i) * 4;  
  64.                               
  65.                     ret.data[ c++ ] = ori.data[ b++ ];  
  66.                     ret.data[ c++ ] = ori.data[ b++ ];  
  67.                     ret.data[ c++ ] = ori.data[ b++ ];  
  68.                     ret.data[ c++ ] = ori.data[ b++ ];  
  69.                 }  
  70.             }  
  71.               
  72.             return ret;  
  73.     },  
  74.       
  75.     //将整个图片设置为某一颜色值  
  76.      setColorR  : function( ctx, imageData, n ){  
  77.         var w = imageData.width,  
  78.                 h = imageData.height,  
  79.                 ret = ctx.createImageData( w, h );  
  80.           
  81.         var total = w * h * 4;  
  82.           
  83.         for (var i=0; i<total; i +=4 ) {  
  84.               
  85.             ret.data[i]  = n; // imageData[ i ];  
  86.             ret.data[i+1]= imageData.data[ i + 1 ];  
  87.             ret.data[i+2]= imageData.data[ i + 2 ];  
  88.             ret.data[ i+3]= imageData.data[ i + 3 ];  
  89.         }     
  90.           
  91.         return ret;  
  92.     },  
  93.       
  94.     //将整个图片设置为某一颜色值  
  95.      setColorG  : function( ctx, imageData, n ){  
  96.         var w = imageData.width,  
  97.                 h = imageData.height,  
  98.                 ret = ctx.createImageData( w, h );  
  99.           
  100.         var total = w * h * 4;  
  101.           
  102.         for (var i=0; i<total; i +=4 ) {  
  103.             var red=imageData.data[i],  
  104.                 green=imageData.data[i+1],  
  105.                 blue=imageData.data[i+2];  
  106.               
  107.             var a = (red + green + blue) / 3;  
  108.                   
  109.             ret.data[i]  = a;  
  110.             ret.data[i+1]= a + n;  
  111.             ret.data[i+2]= a;  
  112.             ret.data[ i+3]= imageData.data[ i + 3 ];  
  113.         }     
  114.           
  115.         return ret;  
  116.     },  
  117.       
  118.     //将整个图片设置为某一颜色值  
  119.      setColorB  : function( ctx, imageData, n ){  
  120.         var w = imageData.width,  
  121.                 h = imageData.height,  
  122.                 ret = ctx.createImageData( w, h );  
  123.           
  124.         var total = w * h * 4;  
  125.           
  126.         for (var i=0; i<total; i +=4 ) {  
  127.               
  128.             ret.data[i]  = imageData.data[ i ];  
  129.             ret.data[i+1]= imageData.data[ i + 1 ];  
  130.             ret.data[i+2]= n;  
  131.             ret.data[ i+3]= imageData.data[ i + 3 ];  
  132.         }     
  133.           
  134.         return ret;  
  135.     },  
  136.       
  137.     //高亮整个图片  
  138.      highlight  : function( ctx, imageData, n ){  
  139.         var w = imageData.width,  
  140.                 h = imageData.height,  
  141.                 ret = ctx.createImageData( w, h );  
  142.           
  143.         var total = w * h * 4;  
  144.           
  145.         for (var i=0; i<total; i +=4 ) {  
  146.               
  147.             ret.data[i]  = imageData.data[ i ] + n;  
  148.             ret.data[i+1]= imageData.data[ i + 1 ] + n;  
  149.             ret.data[i+2]= imageData.data[ i + 2 ] + n;  
  150.             ret.data[ i+3]= imageData.data[ i + 3 ];  
  151.         }     
  152.           
  153.         return ret;  
  154.     },  
  155.       
  156.     //去色   紫色 247, 0, 255  
  157.      removeColor    : function( ctx, imageData, r, g, b ){  
  158.         var w = imageData.width,  
  159.                 h = imageData.height,  
  160.                 ret = ctx.createImageData( w, h );  
  161.           
  162.         var total = w * h * 4;  
  163.           
  164.         for (var i=0; i<total; i +=4 ) {  
  165.             var red=imageData.data[i],  
  166.                 green=imageData.data[i+1],  
  167.                 blue=imageData.data[i+2];  
  168.               
  169.             //相等则全透明      
  170.             if ( r == red && green == g && blue == b ){  
  171.                 ret.data[ i+3]= 0;  
  172.             }else{  
  173.                 ret.data[i]  = red;  
  174.                 ret.data[i+1]= green;  
  175.                 ret.data[i+2]= blue;  
  176.                 ret.data[ i+3]= imageData.data[ i + 3 ];  
  177.             }  
  178.         }     
  179.           
  180.         return ret;  
  181.     }                     
  182.       
  183. };  
  184.   
  185. PS = new PS();  

 

     通过一系列操作,渲染好图像后,就需要借助如下的代码将画布中的图像保存成图片

    

[c-sharp] view plaincopy
  1. //将图像输出为base64压缩的字符串  默认为image/png  
  2. var data = canvas.toDataURL();                      
  3. //删除字符串前的提示信息 "data:image/png;base64,"  
  4. var b64 = data.substring( 22 );  
  5. //POST到服务器上,生成图片                      
  6. $.post( "save.aspx" , { data : b64, name : filename }, function(){  
  7.     //OK  
  8. });  

    

    save.aspx中的代码如下:

   

[c-sharp] view plaincopy
  1. protected void Page_Load(object sender, EventArgs e)  
  2. {  
  3.     if (Request["name"] != null)  
  4.     {  
  5.         string name = Request["name"];  
  6.   
  7.         String savePath = Server.MapPath("~/images/output/");  
  8.   
  9.         try  
  10.         {  
  11.             FileStream fs = File.Create(savePath + "/" + name);  
  12.   
  13.             byte[] bytes = Convert.FromBase64String(Request["data"]);  
  14.   
  15.             fs.Write(bytes, 0, bytes.Length);  
  16.             fs.Close();  
  17.         }  
  18.         catch (Exception except)  
  19.         {  
  20.         }  
  21.   
  22.     }  
  23. }  

 

   PS: 由于沙箱的限制,想在浏览器端通过JS直接存为本地图片,似乎是不大可能,现在网上较为折中的方式为

   window.location.href = "image/octet-stream" + data

   但这种方式不能指定保存的文件名,在FF下默认是xxxxx.part

   参照 : http://www.nihilogic.dk/labs/canvas2image/

分享到:
评论

相关推荐

    html2canvas生成图片demo.zip

    HTML2canvas是一个JavaScript库,它的...通过查看和分析这个demo,开发者可以学习到如何更有效地利用html2canvas库,解决实际开发中的问题,提高工作效率。同时,这个demo也可以作为一个模板,为其他类似需求提供参考。

    html5 canvas 游戏

    HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,创造出丰富的交互式2D内容。这个“html5 canvas 游戏”是一个基于HTML5 Canvas技术开发的小游戏,主题是“兔子吃萝卜”,展示了...

    根据DOM将html转为canvas图片格式

    这里我们关注的是如何利用DOM(Document Object Model)和Canvas API将HTML内容转化为Canvas图像,进一步转换为base64编码的图片。这个过程通常涉及到以下几个关键知识点: 1. DOM (Document Object Model): DOM...

    html5+canvas+js头像缩放裁剪

    Canvas是HTML5中的一个核心元素,允许在网页上动态绘制图形,就像一个画布。JavaScript作为客户端脚本语言,与HTML5和Canvas结合,可以创建出丰富的交互式用户界面,包括图像处理功能,如头像的缩放和裁剪。 头像...

    daycaca一款基于canvas图片处理类库它可以帮助你处理图片的压缩裁剪等

    Daycaca是一款强大的JavaScript图片处理类库,它充分利用HTML5中的Canvas元素,为开发者提供了便捷的图片压缩和裁剪功能。在Web开发中,尤其是在用户上传图片或者需要进行实时图片处理的场景下,Daycaca扮演着至关...

    一款基于 Html5、Canvas 的图片编辑器.zip

    标题 "一款基于 Html5、Canvas 的图片编辑器.zip" 提示我们关注的是一个利用 HTML5 和 Canvas 技术实现的图片编辑工具。HTML5 是一种先进的网页开发标准,它极大地扩展了网页内容的表现形式和交互性。Canvas 是 ...

    HTML5 canvas星星连线

    在这个"HTML5 canvas星星连线"的项目中,利用canvas结合JavaScript技术,实现了用户通过鼠标移动时在屏幕上连接星星的效果,营造出一种梦幻般的星空画面。 首先,我们来了解一下HTML5 canvas的基本概念。canvas是一...

    html5 canvas填色画游戏代码

    综上所述,这个压缩包提供的代码示例展示了如何利用HTML5 Canvas技术开发一个互动的儿童填色游戏,涵盖了图形绘制、事件处理、数据管理等多个方面,是学习和理解HTML5 Canvas应用的一个很好的实例。通过研究这个游戏...

    HTML5 Canvas 游戏开发实战PDF+源码

    本书《HTML5 Canvas游戏开发实战》由张路斌(lufy_legend)编写,深入浅出地讲解了如何利用HTML5 Canvas进行游戏开发,结合提供的源码实例,读者可以更直观地学习和理解相关技术。 1. **HTML5 Canvas基础** - ...

    HTML5+Canvas打开红包获得流量动画代码.zip

    1. HTML5:HTML5是超文本标记语言的第五个版本,它引入了许多新特性,如语义化标签(如、等)、离线存储(离线Web应用程序)、拖放功能、媒体元素(、)以及Canvas等。在这个项目中,HTML5被用来构建页面结构,并与...

    HTML5 Canvas全屏背景动画特效

    通过上述讲解,我们可以理解如何利用HTML5 Canvas来实现全屏背景动画特效。实际项目中,你可以从提供的7款特效中学习和借鉴,结合自己的创意,创造出更多独特且引人入胜的视觉体验。在实践中不断探索和提升,将使你...

    HTML5Canvas雪花动画特效代码

    在HTML5中,`&lt;canvas&gt;`元素是一个矩形区域,我们可以在这个区域内通过JavaScript API进行绘图。Canvas API提供了一系列的方法,如`fillRect()`, `strokeRect()`, `beginPath()`, `moveTo()`, `lineTo()`, `arc()`等...

    HTML5+JS游戏开发模块----canvas图片拖放

    HTML5+JS游戏开发模块中的图片拖放功能是利用HTML5的新特性,特别是Canvas元素,结合JavaScript编程实现的。Canvas是HTML5中的一个强大的绘图工具,允许开发者在网页上进行动态图形绘制,包括图像的移动、旋转、缩放...

    使用CANVAS将网页以图片的格式存到服务器端

    标题中的“使用CANVAS将网页以图片的格式存到服务器端”是指利用HTML5的Canvas元素,配合JavaScript技术,将当前网页的可视内容捕获并转换为图像文件,然后通过Ajax或其他HTTP请求发送到服务器进行存储。这个过程...

    Katexhe和html2canvas公式转图片

    5. 存储和展示:生成的Base64图片数据可以直接插入到HTML的`&lt;img&gt;`标签中显示,也可以保存到服务器或者本地存储。 在提供的压缩包文件"KatexConvertImg"中,可能包含了示例代码、样式文件或其他资源,用于帮助...

    基于html5 canvas实现聚宝盆接金币游戏特效源码.zip

    Canvas是HTML5中的一个画布元素,它允许开发者通过JavaScript来绘制2D图形,包括动态动画。在这款游戏中,Canvas成为了展示游戏画面和交互效果的主要舞台。开发者可以通过调用Canvas的API,如`fillRect()`、`...

    H5 canvas 图片涂抹 擦一擦 刮奖 适配pc手机微信等等

    H5 Canvas是HTML5中的一个强大元素,它允许开发者在网页上进行图形绘制和处理,非常适合创建各种动态效果。 ### 一、Canvas API简介 Canvas是HTML5中引入的一个绘图工具,它提供了一个二维画布,通过JavaScript来...

    canvas压缩图片并展示缩略图

    这里我们将深入探讨如何利用HTML5的Canvas API来实现这一功能。 首先,`canvas`是HTML5提供的一种强大的图形处理元素,它允许我们在网页中动态绘制图形,包括图片。要使用Canvas压缩图片,我们首先要创建一个`...

    亲测html5+canvas+jquery拼图游戏实例,供学习参考

    在这个"html5+canvas+jquery拼图游戏实例"中,我们看到的是如何利用这些技术来创建一个有趣的游戏体验。Canvas是HTML5的一个核心元素,它允许开发者在网页上进行动态图形绘制,而jQuery则是一个流行的JavaScript库,...

Global site tag (gtag.js) - Google Analytics