当前位置:首页 > 生活百科

js特效教程(javascript特效代码大全)

栏目:生活百科日期:2025-05-31浏览:0

前端

小试牛刀,实现了六款简单常见HTML5 Canvas特效滤镜,并且封装成一个纯JavaScript可调用的API文件gloomyfishfilter.js。支持的特效滤镜分别为:

1.反色

2.灰色调

3.模糊

4.浮雕

5.雕刻

6.合理

滤镜原理解释:

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 imagetempContext = 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");var len = canvas.width * canvas.height * 4;var canvasData = tempContext.getImageData(0, 0, canvas.width, canvas.height);var binaryData = canvasData.data;

4、如何对DOM对象实现鼠标ClickEvent绑定

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部分:

#svgContainer {  width:800px;  height:600px;  background-color:#EEEEEE;}#sourcep { float: left; border: 2px solid blue} #targetp { float: right;border: 2px solid red}

filter1.html中HTML源代码:

&<!DOCTYPE html&>&<html&>&<head&>&<meta http-equiv="X-UA-Compatible" content="chrome=IE8"&>&<meta http-equiv="Content-type" content="text/html;charset=UTF-8"&>&<title&>Canvas Filter Demo&</title&>&<link href="default.css" rel="stylesheet" /&>&<script src="gloomyfishfilter.js"&>&</scrip&>&</head&>&<body&>  &<h1&>HTML Canvas Image Process - By Gloomy Fish&</h1&>  &<p id="svgContainer"&>    &<p id="sourcep"&>      &<img id="source" src="../test.png" /&>    &</p&>    &<p id="targetp"&>      &<canvas id="target"&>&</canvas&>    &</p&>  &</p&>  &<p id="btn-group"&>    &<button type="button" id="invert-button"&>反色&</button&>    &<button type="button" id="adjust-button"&>灰色调&</button&>    &<button type="button" id="blur-button"&>模糊&</button&>    &<button type="button" id="relief-button"&>浮雕&</button&>    &<button type="button" id="diaoke-button"&>雕刻&</button&>    &<button type="button" id="mirror-button"&>镜像&</button&>  &</p&>&</body&>&</html&>

filter1.html中JavaScript源代码:

var tempContext = null; // global variable 2d context    window.onload = function() {      var source = document.getElementById("source");      var canvas = document.getElementById("target");      canvas.width = source.clientWidth;      canvas.height = source.clientHeight;      if (!canvas.getContext) {          console.log("Canvas not supported. Please install a HTML5 compatible browser.");          return;      }      // get 2D context of canvas and draw image      tempContext = canvas.getContext("2d");      tempContext.drawImage(source, 0, 0, canvas.width, canvas.height);          // initialization actions          var inButton = document.getElementById("invert-button");          var adButton = document.getElementById("adjust-button");          var blurButton = document.getElementById("blur-button");          var reButton = document.getElementById("relief-button");          var dkButton = document.getElementById("diaoke-button");          var mirrorButton = document.getElementById("mirror-button");          // bind mouse click event          bindButtonEvent(inButton, "click", invertColor);          bindButtonEvent(adButton, "click", adjustColor);          bindButtonEvent(blurButton, "click", blurImage);          bindButtonEvent(reButton, "click", fudiaoImage);          bindButtonEvent(dkButton, "click", kediaoImage);          bindButtonEvent(mirrorButton, "click", mirrorImage);    }    function bindButtonEvent(element, type, handler)  {        if(element.addEventListener) {           element.addEventListener(type, handler, false);        } else {           element.attachEvent('on'+type, handler); // for IE6,7,8      }      }      function invertColor() {      var canvas = document.getElementById("target");      var len = canvas.width * canvas.height * 4;      var canvasData = tempContext.getImageData(0, 0, canvas.width, canvas.height);      var binaryData = canvasData.data;          // Processing all the pixels          gfilter.colorInvertProcess(binaryData, len);          // Copying back canvas data to canvas          tempContext.putImageData(canvasData, 0, 0);    }    function adjustColor() {      var canvas = document.getElementById("target");      var len = canvas.width * canvas.height * 4;      var canvasData = tempContext.getImageData(0, 0, canvas.width, canvas.height);          var binaryData = canvasData.data;          // Processing all the pixels          gfilter.colorAdjustProcess(binaryData, len);          // Copying back canvas data to canvas          tempContext.putImageData(canvasData, 0, 0);    }    function blurImage() {      var canvas = document.getElementById("target");      var len = canvas.width * canvas.height * 4;      var canvasData = tempContext.getImageData(0, 0, canvas.width, canvas.height);          // Processing all the pixels          gfilter.blurProcess(tempContext, canvasData);          // Copying back canvas data to canvas          tempContext.putImageData(canvasData, 0, 0);    }    function fudiaoImage() {      var canvas = document.getElementById("target");      var len = canvas.width * canvas.height * 4;      var canvasData = tempContext.getImageData(0, 0, canvas.width, canvas.height);          // Processing all the pixels          gfilter.reliefProcess(tempContext, canvasData);          // Copying back canvas data to canvas          tempContext.putImageData(canvasData, 0, 0);    }    function kediaoImage() {      var canvas = document.getElementById("target");      var len = canvas.width * canvas.height * 4;      var canvasData = tempContext.getImageData(0, 0, canvas.width, canvas.height);          // Processing all the pixels          gfilter.diaokeProcess(tempContext, canvasData);          // Copying back canvas data to canvas          tempContext.putImageData(canvasData, 0, 0);    }    function mirrorImage() {      var canvas = document.getElementById("target");      var len = canvas.width * canvas.height * 4;      var canvasData = tempContext.getImageData(0, 0, canvas.width, canvas.height);          // Processing all the pixels          gfilter.mirrorProcess(tempContext, canvasData);          // Copying back canvas data to canvas          tempContext.putImageData(canvasData, 0, 0);    }

滤镜源代码(gloomyfishfilter.js):

var gfilter = {    type: "canvas",    name: "filters",    author: "zhigang",    getInfo: function () {        return this.author + ' ' + this.type + ' ' + this.name;    },    /**     * invert color value of pixel, new pixel = RGB(255-r, 255-g, 255 - b)     *      * @param binaryData - canvas's imagedata.data     * @param l - length of data (width * height of image data)     */   colorInvertProcess: function(binaryData, l) {    for (var i = 0; i &< l; i += 4) {          var r = binaryData&[i];          var g = binaryData&[i + 1];          var b = binaryData&[i + 2];          binaryData&[i] = 255-r;          binaryData&[i + 1] = 255-g;          binaryData&[i + 2] = 255-b;      }   },   /**    * adjust color values and make it more darker and gray...    *     * @param binaryData    * @param l    */  colorAdjustProcess: function(binaryData, l) {    for (var i = 0; i &< l; i += 4) {          var r = binaryData&[i];          var g = binaryData&[i + 1];          var b = binaryData&[i + 2];          binaryData&[i] = (r * 0.272) + (g * 0.534) + (b * 0.131);          binaryData&[i + 1] = (r * 0.349) + (g * 0.686) + (b * 0.168);          binaryData&[i + 2] = (r * 0.393) + (g * 0.769) + (b * 0.189);      }  },  /**   * deep clone image data of canvas   *    * @param context   * @param src   * @returns   */  copyImageData: function(context, src)  {      var dst = context.createImageData(src.width, src.height);      dst.data.set(src.data);      return dst;  },  /**   * convolution - keneral size 5*5 - blur effect filter(模糊效果)   *    * @param context   * @param canvasData   */  blurProcess: function(context, canvasData) {    console.log("Canvas Filter - blur process");    var tempCanvasData = this.copyImageData(context, canvasData);    var sumred = 0.0, sumgreen = 0.0, sumblue = 0.0;    for ( var x = 0; x &< tempCanvasData.width; x++) {                for ( var y = 0; y &< tempCanvasData.height; y++) {                    // Index of the pixel in the array                    var idx = (x + y * tempCanvasData.width) * 4;                       for(var subCol=-2; subCol&<=2; subCol++) {                  var colOff = subCol + x;                  if(colOff &<0 || colOff &>= tempCanvasData.width) {                    colOff = 0;                  }                  for(var subRow=-2; subRow&<=2; subRow++) {                    var rowOff = subRow + y;                    if(rowOff &< 0 || rowOff &>= tempCanvasData.height) {                      rowOff = 0;                    }                    var idx2 = (colOff + rowOff * tempCanvasData.width) * 4;                          var r = tempCanvasData.data&[idx2 + 0];                          var g = tempCanvasData.data&[idx2 + 1];                          var b = tempCanvasData.data&[idx2 + 2];                      sumred += r;                      sumgreen += g;                      sumblue += b;                  }                }                // calculate new RGB value                var nr = (sumred / 25.0);                var ng = (sumgreen / 25.0);                var nb = (sumblue / 25.0);                // clear previous for next pixel point                sumred = 0.0;                sumgreen = 0.0;                sumblue = 0.0;                // assign new pixel value                    canvasData.data&[idx + 0] = nr; // Red channel                    canvasData.data&[idx + 1] = ng; // Green channel                    canvasData.data&[idx + 2] = nb; // Blue channel                    canvasData.data&[idx + 3] = 255; // Alpha channel                }    }  },  /**   * after pixel value - before pixel value + 128   * 浮雕效果   */  reliefProcess: function(context, canvasData) {    console.log("Canvas Filter - relief process");    var tempCanvasData = this.copyImageData(context, canvasData);    for ( var x = 1; x &< tempCanvasData.width-1; x++)     {                for ( var y = 1; y &< tempCanvasData.height-1; y++)            {                    // Index of the pixel in the array                    var idx = (x + y * tempCanvasData.width) * 4;               var bidx = ((x-1) + y * tempCanvasData.width) * 4;        var aidx = ((x+1) + y * tempCanvasData.width) * 4;                // calculate new RGB value                var nr = tempCanvasData.data&[aidx + 0] - tempCanvasData.data&[bidx + 0] + 128;                var ng = tempCanvasData.data&[aidx + 1] - tempCanvasData.data&[bidx + 1] + 128;                var nb = tempCanvasData.data&[aidx + 2] - tempCanvasData.data&[bidx + 2] + 128;                nr = (nr &< 0) ? 0 : ((nr &>255) ? 255 : nr);                ng = (ng &< 0) ? 0 : ((ng &>255) ? 255 : ng);                nb = (nb &< 0) ? 0 : ((nb &>255) ? 255 : nb);                // assign new pixel value                    canvasData.data&[idx + 0] = nr; // Red channel                    canvasData.data&[idx + 1] = ng; // Green channel                    canvasData.data&[idx + 2] = nb; // Blue channel                    canvasData.data&[idx + 3] = 255; // Alpha channel                }    }  },  /**   *   before pixel value - after pixel value + 128   *  雕刻效果   *    * @param canvasData   */  diaokeProcess: function(context, canvasData) {    console.log("Canvas Filter - process");    var tempCanvasData = this.copyImageData(context, canvasData);    for ( var x = 1; x &< tempCanvasData.width-1; x++)     {                for ( var y = 1; y &< tempCanvasData.height-1; y++)            {                    // Index of the pixel in the array                    var idx = (x + y * tempCanvasData.width) * 4;               var bidx = ((x-1) + y * tempCanvasData.width) * 4;        var aidx = ((x+1) + y * tempCanvasData.width) * 4;                // calculate new RGB value                var nr = tempCanvasData.data&[bidx + 0] - tempCanvasData.data&[aidx + 0] + 128;                var ng = tempCanvasData.data&[bidx + 1] - tempCanvasData.data&[aidx + 1] + 128;                var nb = tempCanvasData.data&[bidx + 2] - tempCanvasData.data&[aidx + 2] + 128;                nr = (nr &< 0) ? 0 : ((nr &>255) ? 255 : nr);                ng = (ng &< 0) ? 0 : ((ng &>255) ? 255 : ng);                nb = (nb &< 0) ? 0 : ((nb &>255) ? 255 : nb);                // assign new pixel value                    canvasData.data&[idx + 0] = nr; // Red channel                    canvasData.data&[idx + 1] = ng; // Green channel                    canvasData.data&[idx + 2] = nb; // Blue channel                    canvasData.data&[idx + 3] = 255; // Alpha channel                }    }  },  /**   * mirror reflect   *    * @param context   * @param canvasData   */  mirrorProcess : function(context, canvasData) {    console.log("Canvas Filter - process");    var tempCanvasData = this.copyImageData(context, canvasData);    for ( var x = 0; x &< tempCanvasData.width; x++) // column    {                for ( var y = 0; y &< tempCanvasData.height; y++) // row            {                    // Index of the pixel in the array                    var idx = (x + y * tempCanvasData.width) * 4;               var midx = (((tempCanvasData.width -1) - x) + y * tempCanvasData.width) * 4;                // assign new pixel value                    canvasData.data&[midx + 0] = tempCanvasData.data&[idx + 0]; // Red channel                    canvasData.data&[midx + 1] = tempCanvasData.data&[idx + 1]; ; // Green channel                    canvasData.data&[midx + 2] = tempCanvasData.data&[idx + 2]; ; // Blue channel                    canvasData.data&[midx + 3] = 255; // Alpha channel                }    }  },};

“js特效教程(javascript特效代码大全)” 的相关文章

python自带数据库好用吗(揭秘SQLite数据库优劣势)

如果你是软件开发人员,相信你一定知道甚至曾经使用过一个非常轻量级的数据库——SQLite。它几乎拥有作为一个关系数据库所需的所有功能,而且这些有功能都保存在一个...

华为荣耀20青春版参数配置(手机荣耀20青春版怎么样)

在荣耀众多手机产品线中,&&#8221;青春版&&#8221;系列凭借优秀的机身设计,超高的颜值,一直备受年轻用户的喜爱,拥有大批拥趸,今天,10月22日,荣耀...

harrys剃须刀好不好用(Harry&&#8217;s剃须刀开箱使用测

近5-10年,欧美地区掀起了一股新消费品牌浪潮,比较知名的例如:WarbyParker、Everlane、Harrys、Allbirds等。有人叫他们DTCbr...

中国设计公司排行榜(国内最好的设计公司)

国内做工业设计公司有很多,报价差别也很大,对于初入该行业的小白真的不容易选择。那么,究竟哪些公司更专业靠谱呢?小编根据设计创新能力、公司规模、荣誉奖项、经营年限...

saas系统是什么样的系统,中国saas企业排名

saas是软件即服务的缩写。随着互联网技术的发展和应用软件的成熟,21世纪出现了一种全新的软件应用模式。用户不必购买软件,而是可以将基于web的软件租用提供商的...

eclipse整理代码格式快捷键(eclipse一键整理代码)

设置字体设置编码Eclipse工作空间(workspace)的缺省字符编码是操作系统缺省的编码,简体中文操作系统(WindowsXP、Windows2000简体...

240g固态硬盘多少钱一个(光威240GSSD固态硬盘最新报价)

开头就简单说说情况,免得引起误会,本文的国产含义仅仅就是MADEINCHINA的意思,没有其他意思。至于固态硬盘的闪存颗粒用的是啥,打磨没打磨过,是什么颗粒打磨...

ppt制作工具有哪些(手机做ppt免费模板)

PhotoShowPro最新版是PhotoShow的扩展,具有许多附加功能和照片共享功能;在PC或Macintosh和Google相册以及flickr之间发送和...

主机启动不了灯也不亮怎么回事(电脑不能启动电源风扇解

这个假期还真是短暂啊,一不留神就又到了开工的日子,不过经过了几天假期的休息,你是否会遇到回到工位后发现自己的电脑无法开机的情况呢?接下来给大家介绍几个小技巧,希...

为什么看不到微信好友的朋友圈(无法查看好友动态的4种

别急着拉黑,因为可能另有隐情。看不了他的朋友圈,其实有以下四种情况:1、他关闭了朋友圈功能前些天,小编突然发现发小的朋友圈显示暂未开启朋友圈功能当时一下子懵逼了...