canvas滤镜6种效果吗详解编程语言
昨天写了一个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 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 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
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/13859.html
cjava相关文章
- jQuery图片缩小效果详解编程语言
- 用Jquery实现打字效果的代码详解编程语言
- JS实现简易图片轮播效果详解编程语言
- pm25首页css3天气场景动画效果代码详解编程语言
- 利用html5 canvas绘制圆形发散效果的图形详解编程语言
- CSS3实现10种Loading效果详解编程语言
- Java基础加强之并发(三)Thread中start()和run()的区别详解编程语言
- js子窗体调用父窗体函数的问题详解编程语言
- 基于Windows下python3.4.1IDLE常用快捷键小结详解编程语言
- JavaScript Math详解编程语言
- 跑马灯效果的TextView之singLine 和maxLines详解编程语言
- easyui formatter实现超链接效果详解编程语言
- DateUtil日期时间相关的工具类常用方法详解编程语言
- 在java中数据类型long类型如何转换为int类型详解编程语言
- Java日志记录的事儿详解编程语言
- 《Drools7.0.0.Final规则引擎教程》第4章 Function函数详解编程语言
- maven-war-plugin 插件 web.xml 缺失时忽略详解编程语言
- 通过Spring配置文件中bean中的property赋值详解编程语言
- jQuery中的动画与效果详解编程语言
- input标签设置disabled=”disabled”属性的效果详解编程语言
- CSS3倒影效果详解编程语言
- css3 mask遮罩动画(照明灯效果)详解编程语言
- sap中如何追踪生产订单的修改记录详解编程语言