入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

纯JavaScript实现HTML5 Canvas六种特效滤镜

创建时间:2016-12-20 投稿人: 浏览次数:1572

纯JavaScript实现HTML5 Canvas六种特效滤镜 

小试牛刀,实现了六款简单常见Html5 Canvas特效滤镜,并且封装成一个纯

JavaScript可调用的API文件gloomyfishfilter.js。支持的特效滤镜分别为:

1.      反色

2.      灰色调

3.      模糊

4.      浮雕

5.      雕刻

6.      镜像

滤镜原理解释:

1.      反色:获取一个像素点RGB值r, g, b则新的RGB值为(255-r, 255-g, 255-b)

2.      灰色调:获取一个像素点RGB值r, g, b则新的RGB值为

          newr = (r * 0.272) + (g * 0.534) + (b * 0.131);

          newg = (r * 0.349) + (g * 0.686) + (b * 0.168);

          newb = (r * 0.393) + (g * 0.769) + (b * 0.189);

3.      模糊:基于一个5*5的卷积核

4.      浮雕与雕刻:

         基于当前像素的前一个像素RGB值与它的后一个像素的RGB值之差再加上128

5.      镜像:模拟了物体在镜子中与之对应的效果。

杂项准备

1.        如何获取Canvas 2d context对象

var canvas = document.getElementById("target");

canvas.width = source.clientWidth;

canvas.height = source.clientHeight;

if(!canvas.getContext) {

    console.log("Canvas not supported. Please install a HTML5compatible browser.");

    return;

}

// get 2D context of canvas and draw image

tempContext = canvas.getContext("2d");


2.        如何绘制一个DOM img对象到Canvas对象中

var source = document.getElementById("source");

tempContext.drawImage(source, 0, 0, canvas.width,canvas.height);

3.        如何从Canvas对象中获取像素数据

var canvas = document.getElementById("target");

varlen = canvas.width * canvas.height * 4;

var canvasData = tempContext.getImageData(0, 0, canvas.width, canvas.height);

var binaryData = canvasData.data;

4.        如何对DOM对象实现鼠标Click事件绑定

function bindButtonEvent(element, type, handler) 

if(element.addEventListener){ 

       element.addEventListener(type, handler,false); 

    }else { 

       element.attachEvent("on"+type, handler);// for IE6,7,8

    } 

}

5.        如何调用实现的gfilter API完成滤镜功能

<scriptsrc="gloomyfishfilter.js"></script> //导入API文件

gfilter.colorInvertProcess(binaryData, len); //调用 API


6.        浏览器支持:IE, FF, Chrome上测试通过,其中IE上支持通过以下标签实现:

<meta http-equiv="X-UA-Compatible"content="chrome=IE8"

效果演示:


应用程序源代码:

CSS部分:

[css] view plain copy
  1. #svgContainer {  
  2.     width:800px;  
  3.     height:600px;  
  4.     background-color:#EEEEEE;  
  5. }  
  6.            
  7. #sourceDiv { float: left; border: 2px solid blue}   
  8. #targetDiv { float: right;border: 2px solid red}   
filter1.html中HTML源代码:

[html] view plain copy
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4. <meta http-equiv="X-UA-Compatible" content="chrome=IE8">  
  5. <meta http-equiv="Content-type" content="text/html;charset=UTF-8">  
  6. <title>Canvas Filter Demo</title>  
  7. <link href="default.css" rel="stylesheet" />  
  8. <script src="gloomyfishfilter.js"></scrip>  
  9. </head>  
  10. <body>  
  11.     <h1>HTML Canvas Image Process - By Gloomy Fish</h1>  
  12.     <div id="svgContainer">  
  13.         <div id="sourceDiv">  
  14.             <img id="source" src="../test.png" />  
  15.         </div>  
  16.         <div id="targetDiv">  
  17.             <canvas id="target"></canvas>  
  18.         </div>  
  19.     </div>  
  20.     <div id="btn-group">  
  21.         <button type="button" id="invert-button">反色</button>  
  22.         <button type="button" id="adjust-button">灰色调</button>  
  23.         <button type="button" id="blur-button">模糊</button>  
  24.         <button type="button" id="relief-button">浮雕</button>  
  25.         <button type="button" id="diaoke-button">雕刻</button>  
  26.         <button type="button" id="mirror-button">镜像</button>  
  27.     </div>  
  28. </body>  
  29. </html>  

filter1.html中JavaScript源代码:

[javascript] view plain copy
  1. var tempContext = null; // global variable 2d context  
  2. window.onload = function() {  
  3.     var source = document.getElementById("source");  
  4.     var canvas = document.getElementById("target");  
  5.     canvas.width = source.clientWidth;  
  6.     canvas.height = source.clientHeight;  
  7.       
  8.     if (!canvas.getContext) {  
  9.         console.log("Canvas not supported. Please install a HTML5 compatible browser.");  
  10.         return;  
  11.     }  
  12.       
  13.     // get 2D context of canvas and draw image  
  14.     tempContext = canvas.getContext("2d");  
  15.     tempContext.drawImage(source, 0, 0, canvas.width, canvas.height);  
  16.   
  17.        // initialization actions  
  18.        var inButton = document.getElementById("invert-button");  
  19.        var adButton = document.getElementById("adjust-button");  
  20.        var blurButton = document.getElementById("blur-button");  
  21.        var reButton = document.getElementById("relief-button");  
  22.        var dkButton = document.getElementById("diaoke-button");  
  23.        var mirrorButton = document.getElementById("mirror-button");  
  24.   
  25.        // bind mouse click event  
  26.        bindButtonEvent(inButton, "click", invertColor);  
  27.        bindButtonEvent(adButton, "click", adjustColor);  
  28.        bindButtonEvent(blurButton, "click", blurImage);  
  29.        bindButtonEvent(reButton, "click", fudiaoImage);  
  30.        bindButtonEvent(dkButton, "click", kediaoImage);  
  31.        bindButtonEvent(mirrorButton, "click", mirrorImage);  
  32. }  
  33.   
  34. function bindButtonEvent(element, type, handler)    
  35. {    
  36.     if(element.addEventListener) {    
  37.        element.addEventListener(type, handler, false);    
  38.     } else {    
  39.        element.attachEvent("on"+type, handler); // for IE6,7,8  
  40.     }    
  41. }    
  42.   
  43. function invertColor() {  
  44.     var canvas = document.getElementById("target");  
  45.     var len = canvas.width * canvas.height * 4;  
  46.     var canvasData = tempContext.getImageData(0, 0, canvas.width, canvas.height);  
  47.     var binaryData = canvasData.data;  
  48.          
  49.        // Processing all the pixels  
  50.        gfilter.colorInvertProcess(binaryData, len);  
  51.   
  52.        // Copying back canvas data to canvas  
  53.        tempContext.putImageData(canvasData, 0, 0);  
  54. }  
  55.   
  56. function adjustColor() {  
  57.     var canvas = document.getElementById("target");  
  58.     var len = canvas.width * canvas.height * 4;  
  59.     var canvasData = tempContext.getImageData(0, 0, canvas.width, canvas.height);  
  60.        var binaryData = canvasData.data;  
  61.          
  62.        // Processing all the pixels  
  63.        gfilter.colorAdjustProcess(binaryData, len);  
  64.   
  65.        // Copying back canvas data to canvas  
  66.        tempContext.putImageData(canvasData, 0, 0);  
  67. }  
  68.   
  69. function blurImage()   
  70. {  
  71.     var canvas = document.getElementById("target");  
  72.     var len = canvas.width * canvas.height * 4;  
  73.     var canvasData = tempContext.getImageData(0, 0, canvas.width, canvas.height);  
  74.          
  75.        // Processing all the pixels  
  76.        gfilter.blurProcess(tempContext, canvasData);  
  77.   
  78.        // Copying back canvas data to canvas  
  79.        tempContext.putImageData(canvasData, 0, 0);  
  80. }  
  81.       
  82. function fudiaoImage()   
  83. {  
  84.     var canvas = document.getElementById("target");  
  85.     var len = canvas.width * canvas.height * 4;  
  86.     var canvasData = tempContext.getImageData(0, 0, canvas.width, canvas.height);  
  87.          
  88.        // Processing all the pixels  
  89.        gfilter.reliefProcess(tempContext, canvasData);  
  90.   
  91.        // Copying back canvas data to canvas  
  92.        tempContext.putImageData(canvasData, 0, 0);  
  93. }  
  94.   
  95. function kediaoImage()   
  96. {  
  97.     var canvas = document.getElementById("target");  
  98.     var len = canvas.width * canvas.height * 4;  
  99.     var canvasData = tempContext.getImageData(0, 0, canvas.width, canvas.height);  
  100.          
  101.        // Processing all the pixels  
  102.        gfilter.diaokeProcess(tempContext, canvasData);  
  103.   
  104.        // Copying back canvas data to canvas  
  105.        tempContext.putImageData(canvasData, 0, 0);  
  106. }  
  107.   
  108. function mirrorImage()   
  109. {  
  110.     var canvas = document.getElementById("targ
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。