用canvas实现图片滤镜效果详解之灰度效果
2013-11-04 08:14
766 查看
前面展示了一些canvas实现图片滤镜效果的展示,并且给出了相应的算法,下面来介绍一下具体的实现方法。
前面介绍的特效中灰度效果最简单,就从这里开始介绍吧。
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);
//计算公式 .299 * r + .587 * g + .114 * b;
// calculate gray scale value
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 gray = .299 * r + .587 * g + .114 * b;
// assign gray scale value
canvasData.data[idx + 0] = gray; // Red channel
canvasData.data[idx + 1] = gray; // Green channel
canvasData.data[idx + 2] = gray; // 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;
}
}
}
前面介绍的特效中灰度效果最简单,就从这里开始介绍吧。
1.获取图像数据
img.src = ’http://bloglaotou.duapp.com/wp-content/themes/frontopen2/tools/filter/image2.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.通过灰度算法处理图像数据
// 1.灰度效果//计算公式 .299 * r + .587 * g + .114 * b;
// calculate gray scale value
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 gray = .299 * r + .587 * g + .114 * b;
// assign gray scale value
canvasData.data[idx + 0] = gray; // Red channel
canvasData.data[idx + 1] = gray; // Green channel
canvasData.data[idx + 2] = gray; // 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;
}
}
}
3.把新的图像数据写入canvas
context.putImageData(canvasData, 0, 0);4.效果预览
点这里看预览相关文章推荐
- 解决IE升级后必须以管理员运行的问题
- 使用Yeoman快速启动AngularJS项目开发
- 开源 免费 java CMS - FreeCMS1.5 标签 channel
- 用canvas实现图片滤镜效果详解之灰度效果
- 我的Android进阶之旅------>Android疯狂连连看游戏的实现之实现游戏逻辑(五)
- .net多线程
- Maven常用命令
- Android使用定制framework开发应用
- .net加密解密
- 最长递增子序列
- 曲与直的博弈促进了微积分学的发展
- win7 8 下进入要提升权限 管理员权限
- 给VS2008/VS2010 MFC项目添加启动画面
- java练习篇 求输出最大值
- python之BeautifulSoup4的例子
- .net stream
- c# 如何用SplitContainer将From分割成上下两部分 即纵向分割窗口
- [课程相关]homework-05
- 【站长图卦】十五年前,我是一名普通的钳工
- Becoming a Data Scientist – Curriculum via Metromap