在html5中如何使用canvas对基础图像进行处理
这篇文章给大家分享的是有关在html5中如何使用canvas对基础图像进行处理的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
基础 API
canvas 的图像处理能力通过 ImageData 对象来处理像素数据。主要的 API 如下:
createImageData():创建一个空白的 ImageData 对象
getImageData():获取画布像素数据,每一个像素点有 4 个值 —— rgba
putImageData():将像素数据写入画布
imageData={width:Number,height:Number,data:Uint8ClampedArray}
width 是 canvas 画布的宽或者说 x 轴的像素数量;height 是画布的高或者说 y 轴的像素数量;data 是画布的像素数据数组,总长度 w * h * 4,每 4 个值(rgba)代表一个像素。
对图片的处理
下面,我们通过几个例子来看下 canvas 基础的图片处理能力。
constcvs=document.getElementById("canvas");constctx=cvs.getContext("2d");constimg=newImage();img.src="图片URL";img.onload=function(){ctx.drawImage(img,0,0,w,h);}
底片/负片效果
算法:将 255 与像素点的 rgb 的差,作为当前值。
functionnegative(x){lety=255-x;returny;}
constimageData=ctx.getImageData(0,0,w,h);const{data}=imageData;letl=data.length;for(leti=0;i<l;i+=4){constr=data[i];constg=data[i+1];constb=data[i+2];data[i]=negative(r);data[i+1]=negative(g);data[i+2]=negative(b);}ctx.putImageData(imageData,0,0);
单色效果
单色效果就是保留当前像素的 rgb 3个值中的一个,去除其他色值。
for(leti=0;i<l;i+=4){//去除了r、g的值data[i]=0;data[i+1]=0;}
灰度图
灰度图:每个像素只有一个色值的图像。0 到 255 的色值,颜色由黑变白。
for(leti=0;i<l;i+=4){constr=data[i];constg=data[i+1];constb=data[i+2];constgray=grayFn(r,g,b);data[i]=gray;data[i+1]=gray;data[i+2]=gray;}
算法1——平均法:
constgray=(r+g+b)/3;
算法2——人眼感知:根据人眼对红绿蓝三色的感知程度:绿 > 红 > 蓝,给定权重划分
constgray=r*0.3+g*0.59+b*0.11
除此以外,还有:
取最大值或最小值。
constgrayMax=Math.max(r,g,b);//值偏大,较亮constgrayMin=Math.min(r,g,b);//值偏小,较暗
constgrayMax=Math.max(r,g,b);//值偏大,较亮constgrayMin=Math.min(r,g,b);//值偏小,较暗
取单一通道,即 rgb 3个值中的一个。
二值图
算法:确定一个色值,比较当前的 rgb 值,大于这个值显示黑色,否则显示白色。
for(leti=0;i<l;i+=4){constr=data[i];constg=data[i+1];constb=data[i+2];constgray=gray1(r,g,b);constbinary=gray>126?255:0;data[i]=binary;data[i+1]=binary;data[i+2]=binary;}
高斯模糊
高斯模糊是“模糊”算法中的一种,每个像素的值都是周围相邻像素值的加权平均。原始像素的值有最大的高斯分布值(有最大的权重),相邻像素随着距离原始像素越来越远,权重也越来越小。
一阶公式:
(使用一阶公式是因为一阶公式的算法比较简单)
constradius=5;//模糊半径constweightMatrix=generateWeightMatrix(radius);//权重矩阵for(lety=0;y<h;y++){for(letx=0;x<w;x++){let[r,g,b]=[0,0,0];letsum=0;letk=(y*w+x)*4;for(leti=-radius;i<=radius;i++){letx1=x+i;if(x1>=0&&x1<w){letj=(y*w+x1)*4;r+=data[j]*weightMatrix[i+radius];g+=data[j+1]*weightMatrix[i+radius];b+=data[j+2]*weightMatrix[i+radius];sum+=weightMatrix[i+radius];}}data[k]=r/sum;data[k+1]=g/sum;data[k+2]=b/sum;}}for(letx=0;x<w;x++){for(lety=0;y<h;y++){let[r,g,b]=[0,0,0];letsum=0;letk=(y*w+x)*4;for(leti=-radius;i<=radius;i++){lety1=y+i;if(y1>=0&&y1<h){letj=(y1*w+x)*4;r+=data[j]*weightMatrix[i+radius];g+=data[j+1]*weightMatrix[i+radius];b+=data[j+2]*weightMatrix[i+radius];sum+=weightMatrix[i+radius];}}data[k]=r/sum;data[k+1]=g/sum;data[k+2]=b/sum;}}functiongenerateWeightMatrix(radius=1,sigma){//sigma正态分布的标准偏差consta=1/(Math.sqrt(2*Math.PI)*sigma);constb=-1/(2*Math.pow(sigma,2));letweight,weightSum=0,weightMatrix=[];for(leti=-radius;i<=radius;i++){weight=a*Math.exp(b*Math.pow(i,2));weightMatrix.push(weight);weightSum+=weight;}returnweightMatrix.map(item=>item/weightSum);//归一处理}
感谢各位的阅读!关于“在html5中如何使用canvas对基础图像进行处理”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。