HTML 5 canvas 圖像處理
作者:blue_lg
前兩天無意中看了下《pro html5 programming》,發(fā)現(xiàn)html5竟然也能很好的支持圖像處理,在此稍稍交代一下。與matlab處理圖像類似的是,這里也是采用圖像矩陣的形式。
前兩天無意中看了下《pro html5 programming》,發(fā)現(xiàn)html5竟然也能很好的支持圖像處理,在此稍稍交代一下。
與matlab處理圖像類似的是,這里也是采用圖像矩陣的形式。
下面就介紹一個(gè)簡(jiǎn)單的例子:
- <!DOCTYPE html>
- <html>
- <head>
- <title>canvas圖像處理</title>
- </head>
- <body>
- <h1>canvas</h1>
- <canvas id="canvas1" width="200" height="150">是時(shí)候更換瀏覽器了<a href="http://firefox.com.cn/download/">點(diǎn)擊下載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()">圖像的反轉(zhuǎn)</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">是時(shí)候更換瀏覽器了<a href="http://firefox.com.cn/download/">點(diǎn)擊下載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()">圖像的反轉(zhuǎn)</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">是時(shí)候更換瀏覽器了<a href="http://firefox.com.cn/download/">點(diǎn)擊下載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()">圖像的反轉(zhuǎn)</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)html5 的canvas調(diào)用
- var canvas1=document.getElementById('canvas1');//獲取canvas元素
- var context1=canvas.getContext('2d');//此時(shí)獲取到canvas圖像上下文
2)創(chuàng)建圖像并繪制原始圖像
- image=new Image();//創(chuàng)建image對(duì)象
- image.src="z.JPG";//image的地址
- image.onload=function(){
- context1.drawImage(image,0,0);//繪制原始圖像,(0,0)表示圖像的左上角位與canvas畫布的位置
- }
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):創(chuàng)建寬高分別為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 原矩陣的一部分,起點(diǎn)為(0,0)
- }
下面就細(xì)說下html5圖像的儲(chǔ)存形式:
矩陣中每個(gè)像素點(diǎn)有四個(gè)通道分別儲(chǔ)存r/g/b/a的值。(四個(gè)值按序連續(xù)的排列,為一維矩陣)
所以每?jī)蓚€(gè)像素間相隔4位,計(jì)算時(shí)
- k=4*(image.width*j+i);為像素點(diǎn)(i,j)的位置,
- imagedata1.data[k+0]表示R分量,依次類推,其中剩下的分別為G、B分量還有透明度。
這樣上面的程序就實(shí)現(xiàn)了簡(jiǎn)單的圖像的反轉(zhuǎn)功能。<BR>效果如下:

另外需要注意的是,getImageData()函數(shù)可能會(huì)涉及到跨域的problem,所以建議配置apache環(huán)境并將該html放置到其根目錄下進(jìn)行操作。
原文鏈接:http://www.cnblogs.com/blue-lg/archive/2011/12/23/2299019.html
責(zé)任編輯:張偉
來源:
blue_lg的博客


相關(guān)推薦




