Canvas操作图片像素
Canvas支持直接处理图片中的像素,通过对图片像素进行各种类型的处理,能够实现不同的图片效果,本文的示例图片来自参考文献1,图片像素处理方法参照的参考文献2-7。
Canvas主要通过两种方式获取图片像素集合:
- getImageData;该方法获取Canvas中指定位置的图片像素集合,函数返回的是canvasPixelArray对象,该对象中的data属性保存的是像素集合的一维数组,通过处理该数组实现像素处理;
- createImageData:该方法在canvas中创建一个图片区域,然后返回该区域的像素集合;
像素处理完成后,通过调用canvas的putImageData图片像素集合内容显示在指定的地方。
下面通过实现几种像素处理方式来展示图片处理效果,更详细的说明可以看参考文献2-7。
颜色反转
颜色反转效果原理是用255减去每个像素中的r、g、b值。示例代码如下所示:
var cnv = document.getElementById("canvas");var cxt=cnv.getContext("2d");var cnvInverse = document.getElementById("inverse");var cxtInverse=cnvInverse.getContext("2d");var image=new Image();image.src= "image/Gundam.jpeg";image.onload= function( ){cxt.drawImage(image,0,0,cnv.clientWidth,cnv.clientHeight); var imgData=cxt.getImageData(0,0,cnv.clientWidth,cnv.clientHeight);var data=imgData.data;for(var i=0;i<data.length;i+=4){data[i+0]=255-data[i+0];data[i+1]=255-data[i+1];data[i+2]=255-data[i+2];} cxtInverse.putImageData(imgData,0,0); }
但是真正执行代码时,显示的图片效果是下面这样的,处理后的图片没有显示出来。
打开火狐浏览器提供的调试器界面,发现代码报如下的操作不安全的错误。
错误原因好像是由于跨域访问造成的,看的不是太明白(还是个网页编程新手)。根据参考文献3的解决办法,关闭了如下图所示的火狐浏览器的设置。
在刷新网页,即可看到颜色反转的效果,如下图所示。
黑白效果
就是将彩色图片转换为灰度图,参考文献中提供了三种做法:平均值、加权、最大值。
平均值做法是将每个像素的r、g、b值都设置为他们三个和的平均值,示例代码及效果图如下所示
for(var i=0;i<data.length;i+=4){var average=(data[i+0]+data[i+1]+data[i+2])/3;data[i+0]=255-average;data[i+1]=255-average;data[i+2]=255-average;}
加权做法是将每个像素的r、g、b值都设置为他们三个的加权和,权重系统可以调节,本文是参照的参考文献2中的权重,加权代码及示意图如下所示
var average=data[i+0]*0.3+data[i+1]*0.6+data[i+2]*0.1;
最大值做法是将每个像素的r、g、b值都设置为他们三个中的最大值,代码及示意图如下所示:
var average=Math.max(Math.max(data[i+0],data[i+1]),data[i+2]);
亮度效果
主要是指将每个像素的r、g、b值加上相同的值,可以是正值,也可以是负值。示例代码如下:
for(var i=0;i<data.length;i+=4){var a=-50;data[i+0]+=a;data[i+1]+=a;data[i+2]+=a;}
统一加正值的效果如下:
统一加负值的效果如下:
复古效果
复古效果是对每个像素中的r、g、b值都进行加权平均处理,加权参数可以调节,本文参考的是参考文献2中的代码,其示例代码及效果如下所示:
for(var i=0;i<data.length;i+=4){var r=data[i+0];var g=data[i+1];var b=data[i+2];data[i+0]=r*0.39+g*0.76+b*0.18;data[i+1]=r*0.35+g*0.68+b*0.16;data[i+2]=r*0.27+g*0.53+b*0.13;}
单色蒙版
主要指将每个像素的r、g、b平均值赋予某个通道,其它两个通道值赋0。示例代码以红绿蓝单色蒙版效果如下所示:
for(var i=0;i<data.length;i+=4){var r=data[i+0];var g=data[i+1];var b=data[i+2];var average=(r+g+b)/3;data[i+0]=average;data[i+1]=0;data[i+2]=0;}
透明处理
主要是调整每个像素中的透明度,示例代码及图片如下所示:
for(var i=0;i<data.length;i+=4){ data[i+3]=data[i+3]*0.3;}
浮雕效果
主要是操作当前像素与邻近像素的r、g、b值,本文根据参考文献中的C#代码改成的JavaScript代码。示例代码及图片如下所示:
for(var i=0;i<data.length-4;i+=4){var r1=data[i+0];var g1=data[i+1];var b1=data[i+2];var r2=data[i+4];var g2=data[i+5];var b2=data[i+6];var r = Math.abs(g1 - g2 + 128); var g = Math.abs(g1 - g2 + 128); var b = Math.abs(b1 - b2 + 128); if (r > 255) r = 255; if (r < 0) r = 0; if (g > 255) g = 255; if (g < 0) g = 0; if (b > 255) b = 255; if (b < 0) b = 0; data[i+0]=r;data[i+1]=g;data[i+2]=b;}
图片像素的处理方式有很多,本文主要跟基于参考文献演示了其中比较简单的几种效果,有兴趣的朋友可以再去实验更复杂的效果。网上应该也有很多成熟的JavaScript图片操作库可以直接使用。
原文地址:
[1]图片地址:https://m.sohu.com/a/239776224_666417
[2]从0到1 HTML5 Canvas动画开发
[3]https://blog.csdn.net/mochong/article/details/84055015?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=1328575.184.16146071539985545&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control
[4]https://www.cnblogs.com/jameslong/p/3805993.html
[5]https://blog.csdn.net/chdjj/article/details/19568857
[6]https://www.cnblogs.com/mq0036/p/4026057.html
[7]https://blog.csdn.net/weixin_34319817/article/details/94711204
Canvas操作图片像素相关推荐
- 用 canvas 操作图片像素
canvas 像素操作 在 canvas 中可以使用 context.drawImage(image,dx,dy) 方法将图片绘制在 canvas 上.将图片绘制上去后,还可以使用 context.g ...
- 在MIDP2.0中操作图片像素
正文 我们知道,在MIDP1.0中,除非我们利用特定厂商的API(比如Nokia),我们是没法对图片的像素进行操作的,但是在MIDP2.0中,Image和Graphics的功能都大大增强了.比如,我们 ...
- canvas操作图片 设置背景
** canvas操作图片: ** 在画布上插入图片: 在canvas中获取图片的路径: var img = new Image(); img.src = "路径" ctx.dra ...
- HTML5 Canvas操作图像像素
操作图像像素 如果要对图像进行进一步的处理,就可以先通过getImageData()方法获取图像像素,进行处理后再通过putImageData()方法,把处理后的像素重新绘制到画布中. 1)getIm ...
- html怎样把图片放进画布中,HTML5 canvas操作图片
1.canvas操作图像的能力 canvas更有意思的一项特性就是图像操作能力.可以用于动态的图像合成或者作为图形的背景,以及游戏界面(Sprites)等等.浏览器支持的任意格式的外部图片都可以使用, ...
- canvas操作图片,进行面板画图,旋转等
HTML5 <canvas> 标签用于绘制图像(通过脚本,通常是 JavaScript). 不过,<canvas> 元素本身并没有绘制能力(它仅仅是图形的容器) - 您必须使用 ...
- Opencv开发笔记(一):操作图片像素
在很多项目中我们会运用到对图形图像的像素处理,很文章我们来总结以下使用opencv对图片的像素进行操作从而达到自己想要的结果. 所谓的像素是图像的基本元素,从根本来说,一张图片就是由数值组成的矩阵,在 ...
- h5: canvas操作图片并上传
canvas.drawImage() 作用:将图片绘制到canvas对象上,具体使用请参考 MDN文档 用法: void ctx.drawImage(image, dx, dy); // 不缩放 vo ...
- canvas 像素操作(图片像素操作)
canvas 图片像素/像素操作 在 canvas 中的 drawImage() 方法允许在 canvas 中插入其他图像( img 和 canvas 元素都可以) .图片绘制上去后,我们可以通过 g ...
最新文章
- 学了指针没学动态内存一切都白搭!C语言基础教程之内存管理
- /D _WINDOWS, /D _CONSOLE
- java保留两位小数
- TCP传输-出现差错的解决办法
- 进入正在运行状态中的Docker容器
- Vue 项目调试总结
- 四个角不是直角的四边形_同步资料人教版四上数学第五单元平行四边形和梯形5.1...
- String 字符串问题一
- C# in Depth
- python优先级队列-python 优先级队列
- 【爆赞】这款Python小程序自动抠图只需5秒,秒杀PS手动抠图?
- Python正态性检验
- 微信小程序分享至朋友圈
- 存储资源 存储设备 数据存储
- MySQL 创库 查库 等基本操作
- CoreText(四):行 CTLineRef
- android 永久root权限,安卓 实现永久性开启adb 的root权限
- 一篇文章教你正确解锁 代理ip 的使用方式,包含两个实战案例
- 3D打印与3D扫描的未来在哪里
- 股票L1和L2都代表是什么意思?
热门文章
- 4-20mA电路转换
- Flask之自定义模型类
- 天猫电视盒子服务器响应错误,天猫魔盒网络故障汇总:简单设置恢复连接|天猫魔盒网络异常,天猫魔盒,天猫魔盒网络掉线...
- APT(Advanced Persistent Threat高级持续性威胁)——网络安全
- 各种网易黄金激活码,新手码,实时更新可用,点击图片领取,真正的福利,快人一步
- 计算方法c语言编程,计算方法C语言编程计算方法C语言编程.doc
- 鸿蒙荣耀x10max,网曝荣耀X10 Max起售价2千元 屏幕成本太高
- 树上的小兔子,藏了服务的新逻辑
- Node 学习八、通信之 01 网络通信基本原理、网络层次模型、数据封装与解封装、TCP三次握手与四次挥手
- 台式计算机用u盘给电脑安装系统,台式电脑用U盘安装Win10系统教程