HTML 5 canvas 图像处理

开发 前端
前两天无意中看了下《pro html5 programming》,发现html5竟然也能很好的支持图像处理,在此稍稍交代一下。与matlab处理图像类似的是,这里也是采用图像矩阵的形式。

前两天无意中看了下《pro html5 programming》,发现html5竟然也能很好的支持图像处理,在此稍稍交代一下。

与matlab处理图像类似的是,这里也是采用图像矩阵的形式。

下面就介绍一个简单的例子:

<!DOCTYPE html>      
<html>   
<head>      
<title>canvas图像处理</title>     
</head>     
<body>     
<h1>canvas</h1>     
<canvas id="canvas1" width="200" height="150">是时候更换浏览器了<a href="http://firefox.com.cn/download/">点击下载firefox</a></canvas>    
<script>   
    var canvas1=document.getElementById('canvas1');   
    var context1=canvas1.getContext('2d');   
    image=new Image();   
    image.src="z.JPG";   
    image.onload=function(){   
    context1.drawImage(image,0,0);//绘制原始图像,(0,0)表示图像的左上角位与canvas画布的位置   
    }   
</script>   
<br/>   
<button onclick="draw()">图像的反转</button>   
<br/>   
<canvas id="canvas2" width="200" height="150"></canvas>    
<script>   
    function draw(){   
        var canvas2=document.getElementById('canvas2');   
        var context2=canvas2.getContext('2d');   
            var imagedata=context1.getImageData(0,0,image.width,image.height);   
            var imagedata1=context2.createImageData(image.width,image.height);   
            for(var j=0;j<image.height;j+=1)   
            for(var i=0;i<image.width;i+=1){   
              k=4*(image.width*j+i);   
              imagedata1.data[k+0]=255-imagedata.data[k+0];   
              imagedata1.data[k+1]=255-imagedata.data[k+1];   
              imagedata1.data[k+2]=255-imagedata.data[k+2];   
              imagedata1.data[k+3]=255;   
            }   
            context2.putImageData(imagedata1,0,0);   
    }   
</script>    
</body>     
</html>   
<!DOCTYPE html>      
<html>   
<head>      
<title>canvas图像处理</title>     
</head>     
<body>     
<h1>canvas</h1>     
<canvas id="canvas1" width="200" height="150">是时候更换浏览器了<a href="http://firefox.com.cn/download/">点击下载firefox</a></canvas>    
<script>   
    var canvas1=document.getElementById('canvas1');   
    var context1=canvas1.getContext('2d');   
    image=new Image();   
    image.src="z.JPG";   
    image.onload=function(){   
    context1.drawImage(image,0,0);//绘制原始图像,(0,0)表示图像的左上角位与canvas画布的位置   
    }   
</script>   
<br/>   
<button onclick="draw()">图像的反转</button>   
<br/>   
<canvas id="canvas2" width="200" height="150"></canvas>    
<script>   
    function draw(){   
        var canvas2=document.getElementById('canvas2');   
        var context2=canvas2.getContext('2d');   
            var imagedata=context1.getImageData(0,0,image.width,image.height);   
            var imagedata1=context2.createImageData(image.width,image.height);   
            for(var j=0;j<image.height;j+=1)   
            for(var i=0;i<image.width;i+=1){   
              k=4*(image.width*j+i);   
              imagedata1.data[k+0]=255-imagedata.data[k+0];   
              imagedata1.data[k+1]=255-imagedata.data[k+1];   
              imagedata1.data[k+2]=255-imagedata.data[k+2];   
              imagedata1.data[k+3]=255;   
            }   
            context2.putImageData(imagedata1,0,0);   
    }   
</script>    
</body>     
</html>   
<!DOCTYPE html>      
<html>   
<head>      
<title>canvas图像处理</title>     
</head>     
<body>     
<h1>canvas</h1>     
<canvas id="canvas1" width="200" height="150">是时候更换浏览器了<a href="http://firefox.com.cn/download/">点击下载firefox</a></canvas>    
<script>   
    var canvas1=document.getElementById('canvas1');   
    var context1=canvas1.getContext('2d');   
    image=new Image();   
    image.src="z.JPG";   
    image.onload=function(){   
    context1.drawImage(image,0,0);//绘制原始图像,(0,0)表示图像的左上角位与canvas画布的位置   
    }   
</script>   
<br/>   
<button onclick="draw()">图像的反转</button>   
<br/>   
<canvas id="canvas2" width="200" height="150"></canvas>    
<script>   
    function draw(){   
        var canvas2=document.getElementById('canvas2');   
        var context2=canvas2.getContext('2d');   
            var imagedata=context1.getImageData(0,0,image.width,image.height);   
            var imagedata1=context2.createImageData(image.width,image.height);   
            for(var j=0;j<image.height;j+=1)   
            for(var i=0;i<image.width;i+=1){   
              k=4*(image.width*j+i);   
              imagedata1.data[k+0]=255-imagedata.data[k+0];   
              imagedata1.data[k+1]=255-imagedata.data[k+1];   
              imagedata1.data[k+2]=255-imagedata.data[k+2];   
              imagedata1.data[k+3]=255;   
            }   
            context2.putImageData(imagedata1,0,0);   
    }   
</script>    
</body>     
</html>   
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.

1)html5 的canvas调用

var canvas1=document.getElementById('canvas1');//获取canvas元素   
var context1=canvas.getContext('2d');//此时获取到canvas图像上下文   
 
  • 1.
  • 2.
  • 3.

2)创建图像并绘制原始图像

image=new Image();//创建image对象   
image.src="z.JPG";//image的地址   
image.onload=function(){   
context1.drawImage(image,0,0);//绘制原始图像,(0,0)表示图像的左上角位与canvas画布的位置   
}   
 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

3)获取图像的rgba矩阵并操作

var imagedata=context1.getImageData(0,0,image.width,image.height);   
//getImageData(x1,y1,x2,y2)获取图像的rgba矩阵,其中截取图像的大小为(x1,y1)-(x2,y2) 的矩阵   
var imagedata1=context2.createImageData(image.width,image.height);   
//createImageData(x,y):创建宽高分别为x,y的图像矩阵   
   for(var j=0;j<image.height;j+=1)   
    for(var i=0;i<image.width;i+=1){   
              k=4*(image.width*j+i);   
          imagedata1.data[k+0]=255-imagedata.data[k+0];   
          imagedata1.data[k+1]=255-imagedata.data[k+1];   
          imagedata1.data[k+2]=255-imagedata.data[k+2];   
                  imagedata1.data[k+3]=255;   
        }   
    context2.putImageData(imagedata1,0,0);   
//putImageData(image,0,0):将image矩阵的添加为context 原矩阵的一部分,起点为(0,0)   

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

下面就细说下html5图像的储存形式:

矩阵中每个像素点有四个通道分别储存r/g/b/a的值。(四个值按序连续的排列,为一维矩阵)

所以每两个像素间相隔4位,计算时

k=4*(image.width*j+i);为像素点(i,j)的位置,  
  • 1.
 
imagedata1.data[k+0]表示R分量,依次类推,其中剩下的分别为G、B分量还有透明度。  
  • 1.

这样上面的程序就实现了简单的图像的反转功能。<BR>效果如下:

另外需要注意的是,getImageData()函数可能会涉及到跨域的problem,所以建议配置apache环境并将该html放置到其根目录下进行操作。

原文链接:http://www.cnblogs.com/blue-lg/archive/2011/12/23/2299019.html

  1. HTML 5和CSS3快速制作便签特效
  2. 如何制作HTML 5的iPhone应用程序
  3. HTML 5做出让你意想不到的几件事
  4. HTML 5多媒体组件(视频的使用)
  5. 看HTML 5如何创建一个图片浏览器
责任编辑:张伟 来源: blue_lg的博客
相关推荐

2011-11-25 14:20:57

HTML 5

2012-06-12 09:53:14

HTML5

2012-09-24 13:49:13

HTML5CanvasJS

2012-07-26 10:40:38

HTML5

2011-11-09 10:05:26

HTML 5

2012-05-09 09:41:58

HTML5

2012-02-22 15:41:50

HTML 5

2012-02-24 15:28:36

ibmdw

2012-05-29 09:57:10

HTML5

2017-07-05 16:22:09

HTML5canvas动态

2012-08-30 10:18:09

HTML5CanvasHTML5实例

2015-10-08 08:48:44

HTML5canvas动画

2011-07-21 15:34:36

iPhone HTML5 Canvas

2011-07-18 13:35:14

HTML 5

2012-05-09 12:18:14

HTML5Canvas

2016-01-20 10:11:56

华丽CanvasHTML5

2012-04-18 15:36:33

HTML5Canvas交互式

2013-03-06 16:14:16

UCHTML5游戏引擎

2012-02-23 10:32:19

HTML 5

2011-03-02 13:15:26

HTML 5jQuery
点赞
收藏

51CTO技术栈公众号