昨天写了一个canvas滤镜的取反色效果,今天加一点效果,主要思路都是一样的,改变getImageData.data[]的值,并返回

代码如下:

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Canvas Filter Demo</title>

<style type="text/css">

#wrap {

width: 600px;

height: 600px;

background-color: #EEEEEE;

}

#sourceDiv {

float: left;

border: 2px solid blue;

}

#canvasDiv {

float: right;

border: 2px solid red;

}

</style>

</head>

<body>

<!--最大的wrap-->

<div id="wrap">

<div id="sourceDiv"><!--图片-->

<img id="img" src="img/bg6.jpg" />

</div>

<!--画布-->

<div id="canvasDiv">

<canvas id="canvas"></canvas>

</div>

</div>

<!--按钮组-->

<div 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>

</div>

</body>

<script type="text/javascript">

window.onload = function() {

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

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

canvas.width = img.clientWidth;

canvas.height = img.clientHeight;

// get 2D context of canvas and draw image

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

pen.drawImage(img, 0, 0, canvas.width, canvas.height);//把图片放在画布上

//获取到所有的按钮

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");

// 给按钮添加事件

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

}

}

//通用代码  得到画布上的图片像素数据 返回ImageData对象

function getUseData(canvas){ //形参为画布

//getImageData() 复制画布上指定矩形的像素数据 然后通过putImageData()将图像数据放回画布:

//返回ImageData对象,该对象拷贝了画布指定矩形的像素数据

//对于 ImageData 对象中的每个像素,都存在着四方面的信息,即 RGBA 值 eg:red=ImageData.data[0];

return pen.getImageData(0, 0, canvas.width, canvas.height);

}

function getUseLen(canvas){ //形参为画布

return canvas.width * canvas.height * 4;//图片的数据长度的像素值 图片是由像素组成的

}

//反色

function invertColor() {

var len = getUseLen(canvas);

var canvasData =getUseData(canvas);

//color/alpha 信息以数组形式存在,并存储于 ImageData 对象的 data 属性中

var binaryData = canvasData.data;//存图片的像素值

// 处理所有的像素

gfilter.colorInvertProcess(binaryData, len);

// 将图像数据放回画布

pen.putImageData(canvasData, 0, 0);

}

//灰色调

function adjustColor() {

var canvasData = getUseData(canvas);

var len=getUseLen(canvas);

var binaryData = canvasData.data;

gfilter.colorAdjustProcess(binaryData, len);

pen.putImageData(canvasData, 0, 0);

}

//模糊

function blurImage() {

var canvasData = getUseData(canvas);

var len=getUseLen(canvas);

gfilter.blurProcess(pen, canvasData);

pen.putImageData(canvasData, 0, 0);

}

//浮雕

function fudiaoImage() {

var canvasData = getUseData(canvas);

var len=getUseLen(canvas);

gfilter.reliefProcess(pen, canvasData);

pen.putImageData(canvasData, 0, 0);

}

//雕刻

function kediaoImage() {

var canvasData = getUseData(canvas);

var len=getUseLen(canvas);

gfilter.diaokeProcess(pen, canvasData);

pen.putImageData(canvasData, 0, 0);

}

//镜像

function mirrorImage() {

var canvasData = getUseData(canvas);

var len=getUseLen(canvas);

gfilter.mirrorProcess(pen, canvasData);

pen.putImageData(canvasData, 0, 0);

}

var gfilter = {

type: "canvas",

name: "filters",

author: "zhigang",

getInfo: function() {

return this.author + ' ' + this.type + ' ' + this.name;

},

//取反色new pixel = RGB(255-r, 255-g, 255 - b)

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;

}

},

/*灰色调*/

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);

}

},

copyImageData: function(context, src) {

var dst = context.createImageData(src.width, src.height);

dst.data.set(src.data);

return dst;

},

/*图像模糊*/

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 */

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

}

}

},

//镜像

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

}

}

},

};

</script>

</html>

<!--

尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/4127888.html

-->

canvas滤镜6种效果吗的更多相关文章

  1. canvas动态小球重叠效果

    前面的话 在javascript运动系列中,详细介绍了各种运动,其中就包括碰壁运动.但是,如果用canvas去实现,却是另一种思路.本文将详细介绍canvas动态小球重叠效果 效果展示 静态小球 首先 ...

  2. XE8 for iOS 状态栏的几种效果

    XE8 实现 iOS 状态栏的几种效果: 一.状态栏底色: 开一个新工程. 设定 Fill.Color 颜色属性. 设定 Fill.Kind = Solid. 无需修改任何官方源码. 二.隐藏状态栏( ...

  3. fakeLoader页面加载前loading演示8种效果

    提高用户体验的插件fakeLoader页面加载前loading演示8种效果 在线预览 下载地址 示例代码 <div id="main"> <div class=& ...

  4. jQuery瀑布流从不同方向加载3种效果演示

    很实用的一款插件jQuery瀑布流从不同方向加载3种效果演示在线预览 下载地址 实例代码 <section class="grid-wrap"> <ul clas ...

  5. jQuery Wheel 环形菜单插件5种效果演示

    很酷的菜单-jQuery Wheel 环形菜单插件5种效果演示在线预览 下载地址 实例代码 <div class="container"> <!-- Top Na ...

  6. jQuery超酷下拉插件6种效果演示

    原始的下拉框很丑啦, 给大家一款jQuery超酷下拉插件6种效果 效果预览 下载地址 实例代码 <div class="container"> <section ...

  7. jQuery自定义漂亮的下拉框插件8种效果演示

    原始的下拉框不好看这里推荐一个jQuery自定义漂亮的下拉框插件8种效果演示 在线预览 下载地址 实例代码 <!DOCTYPE html> <html lang="en&q ...

  8. 酷!使用 jQuery & Canvas 制作相机快门效果

    在今天的教程中,我们将使用 HTML5 的 Canvas 元素来创建一个简单的摄影作品集,它显示了一组精选照片与相机快门的效果.此功能会以一个简单的 jQuery 插件形式使用,你可以很容易地整合到任 ...

  9. 如何使用 HTML5 Canvas 制作水波纹效果

    今天,我们继续分享 JavaScript 实现的效果例子,这篇文章会介绍使用 JavaScript 实现水波纹效果.水波效果以图片为背景,点击图片任意位置都会触发.有时候,我们使用普通的 Javasc ...

随机推荐

  1. MySQL基础CRUD编程练习题的自我提升(1)

    基础知识: 1.数据库的连接 mysql -u -p -h -u 用户名 -p 密码 -h host主机 2:库级知识 2.1 显示数据库: show databases; 2.2 选择数据库: us ...

  2. kafka 生产者java编码

    public class KafkaProducerDemo { public static void main(String[] args) throws InterruptedException ...

  3. input上传按钮 文字修改办法

    解决思路是把input 放在文字的上边,弄成透明的,这样在点文字时,实际是点击了input,这样就实现了文件的上传. 具体代码: <style> #uploadImg{ font-size ...

  4. 如何在断开ssh连接后仍然保持服务器正常运行程序

    问题描述:当SSH远程连接到服务器上,然后运行一个Python程序(bpr.py),然后把终端开闭(切断SSH连接)之后,发现该程序执行中断. 解决方法:使用nohup命令让程序在关闭窗口(切换SSH ...

  5. shell脚本中切换用户执行相应的命令或者shell脚本的方法

    通常在执行自动化过程中可能需要将root用户切换到其他用户进行执行,如:oralce 但是,执行的命令又要回到root用户下,继续执行root用户下的其他命令. 此时需要了解 su 命令中的参数 -c ...

  6. 聚类算法之BIRCH(Java实现)转载

    http://www.cnblogs.com/zhangchaoyang/articles/2200800.html http://blog.csdn.net/qll125596718/article ...

  7. sklearn 组合分类器

    组合分类器: 组合分类器有4种方法: (1)通过处理训练数据集.如baging  boosting (2)通过处理输入特征.如 Random forest (3)通过处理类标号.error_corre ...

  8. VS2010使用TTS

    最近在写纯车牌停车管理系统,需要用到语音合成功能. 目前最常用的Windows Speech SDK版本有三种:5.1.5.3和5.4.        Windows Speech SDK 5.1版本 ...

  9. LINQ to SQL Count/Sum/Min/Max/Avg Join

    public class Linq { MXSICEDataContext Db = new MXSICEDataContext(); // LINQ to SQL // Count/Sum/Min/ ...

  10. js页面刷新之实现定时刷新(定时器,meta)

    测试页面的代码见上一篇博客 接下来进入正题-定时不断刷新页面的方法: 1.看到定时,很容易想到js的定时器: //第一种方法 //由于我们已经有了一个定时器,所以只要在定时器test中加入一句刷新页面 ...