DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> HTML基礎知識 >> HTML5詳解 >> 用canvas實現圖片濾鏡效果附演示
用canvas實現圖片濾鏡效果附演示
編輯:HTML5詳解     
這是一個很有意思的特效,模擬攝像機拍攝電視屏幕畫面時出現點狀顆粒的效果。顆粒的大小通過變換矩陣實現,可以任意調節,有興趣研究的朋友可以嘗試更多的效果,代碼沒有經過優化,只是一個粗糙的Demo,大家可以自行改進。 

1.獲取圖像數據 

復制代碼代碼如下:
img.src = ’/School/UploadFiles_7810/201603/20160310233859581.jpg’;
canvas.width = img.width; 
canvas.height = img.height; 
var context = canvas.getContext(“2d”); 
context.drawImage(img, 0, 0); 
var canvasData = context.getImageData(0, 0, canvas.width, canvas.height); 

2.設置過濾矩陣 

復制代碼代碼如下:
var m_VideoType=0; 
var pattern=new Array(); 
switch (m_VideoType) 

case0://VIDEO_TYPE.VIDEO_STAGGERED: 

pattern = [ 
0, 1, 
0, 2, 
1, 2, 
1, 0, 
2, 0, 
2, 1, 
]; 
break; 

case1://VIDEO_TYPE.VIDEO_TRIPED: 

pattern = [ 
0, 
1, 
2, 
]; 
break; 

case2://VIDEO_TYPE.VIDEO_3X3: 

pattern = 

0, 1, 2, 
2, 0, 1, 
1, 2, 0, 
]; 
break; 

default: 

pattern = 

0, 1, 2, 0, 0, 
1, 1, 1, 2, 0, 
0, 1, 2, 2, 2, 
0, 0, 1, 2, 0, 
0, 1, 1, 1, 2, 
2, 0, 1, 2, 2, 
0, 0, 0, 1, 2, 
2, 0, 1, 1, 1, 
2, 2, 0, 1, 2, 
2, 0, 0, 0, 1, 
1, 2, 0, 1, 1, 
2, 2, 2, 0, 1, 
1, 2, 0, 0, 0, 
1, 1, 2, 0, 1, 
1, 2, 2, 2, 0, 
]; 
break; 


var pattern_width = [ 2, 1, 3, 5 ]; 
var pattern_height = [6, 3, 3, 15 ]; 

3.獲取過濾數據 

復制代碼代碼如下:
for ( var x = 0; x < canvasData.width; x++) { 
for ( var y = 0; y < canvasData.height; y++) { 
// Index of the pixel in the array 
var idx = (x + y * canvasData.width) * 4; 
var r = canvasData.data[idx + 0]; 
var g = canvasData.data[idx + 1]; 
var b = canvasData.data[idx + 2]; 
var nWidth = pattern_width[m_VideoType]; 
var nHeight = pattern_height[m_VideoType]; 
var index = nWidth * (y % nHeight) + (x % nWidth); 
index = pattern[index]; 
if (index == 0) 
var r = fclamp0255(2 * r); 
if (index == 1) 
var g = fclamp0255(2 * g); 
if (index == 2) 
var b = fclamp0255(2 * b); 
// assign gray scale value 
canvasData.data[idx + 0] = r; // Red channel 
canvasData.data[idx + 1] = g; // Green channel 
canvasData.data[idx + 2] = b; // Blue channel 
canvasData.data[idx + 3] = 255; // Alpha channel 
// 加上黑色的邊框 
if(x < 8 || y < 8 || x > (canvasData.width - 8) || y > (canvasData.height - 8)) 

canvasData.data[idx + 0] = 0; 
canvasData.data[idx + 1] = 0; 
canvasData.data[idx + 2] = 0; 




4.寫入過濾後的數據 

復制代碼代碼如下:
context.putImageData(canvasData, 0, 0); 

5.參考資料 
代震軍ImageFilter開源項目
XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved