表示出来的结果是一样吗,你换一下都对比一下就知道了
for (var i=0;i<5;i++){
for (var j=0;j<3;j++){
var p = i*3+j;
document.write(p+' ');
}
}
document.write("<br />");
for (var i=0;i<5;i++){
for (var j=0;j<3;j++){
var p = j*3+i;
document.write(p+' ');
}
}
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> .btn{ text-decoration: none; border: 1px solid black; border-radius: 5px; background: white; color: black; padding: 10px; box-shadow: 5px 5px 5px #b7b7b7; } </style> </head> <body> <div style="margin:20px auto;width:1168px;"> <canvas id="canvasa" width="582" height="388" style="display:block;float:left;border:1px solid #aaa;"></canvas> <canvas id="canvasb" width="582" height="388" style="display:block;float:right;border:1px solid #aaa;"></canvas> <div style="clear:both;"></div> <div style="text-align:center;margin-top:50px;font-size:20px;"> <a href="javascript:blurEffect()" class="btn">Blur Effect</a> </div> </div> <script> var cnvA=document.getElementById("canvasa"); var cxtA=cnvA.getContext("2d"); var cnvB=document.getElementById("canvasb"); var cxtB=cnvB.getContext("2d"); var image=new Image(); window.onload=function(){ image.src="images/02.jpg"; image.onload=function(){ cxtA.drawImage(image,0,0,cnvA.width,cnvA.height); } }; function blurEffect(){ var imageData=cxtA.getImageData(0,0,cnvA.width,cnvA.height); var data=imageData.data; var tempImageData=cxtA.getImageData(0,0,cnvA.width,cnvA.height); var tempData=tempImageData.data; var blurR=3; var number=(blurR+1+blurR)*(blurR+1+blurR); for(var i=blurR;i<.height-blurR;i++){ for(var j=blurR;j<cnvB.width-blurR;j++){ var sumR=0,sumG= 0,sumB=0; for(var dx=-blurR;dx<=blurR;dx++){ for(var dy=-blurR;dy<=blurR;dy++){ var x=i+dx; var y=j+dy; var index=x*cnvB.width+y; sumR+=tempData[index*4+0]; sumG+=tempData[index*4+1]; sumB+=tempData[index*4+2]; } } var index=i*cnvB.width+j; data[index*4+0]=sumR/number; data[index*4+1]=sumG/number; data[index*4+2]=sumB/number; } } cxtB.putImageData(imageData,0,0,0,0,cnvB.width,cnvB.height); } </script> </body> </html>
是因为没有服务器环境吧,不要用本地图片再试一下
这哪是什么小问题呀,这
onmousedown()和onmouseup()获取鼠标按下和松开的坐标,再计算一下相对于canvas画布位置的坐标应该就可以算出来了
改成下面这样了,不知道还有没有问题,欢迎交流~
var blurR = 50;
for(var i = 0; i < canvasA.height; i++){
for(var j = 0; j < canvasA.width; j++ ){
var r = 0,g = 0,b = 0,totalNum = 0;
for(var m = -blurR; m <= blurR; m++){
for(var n = -blurR; n <= blurR;n++){
var x = i + m;
var y = j + n;
if(x<0||y<0||x >= canvasA.height ||y >= canvasA.width)
continue;
totalNum++;
var p = x*canvasA.width+y;
r += tmpData[4*p+0];
g += tmpData[4*p+1];
b += tmpData[4*p+2];
}
}
var p = i*canvasA.width+j;
tmpData[4*p+0] = r/totalNum;
tmpData[4*p+1] = g/totalNum;
tmpData[4*p+2] = b/totalNum;
}
}
我是先将 canvas的大小与 图片大小调成一致 然后在渲染过后的canva用 css的手段 将其限制大小 这样就不会失帧了
so what
var a = pixelData[i*4+2]
var grey = r*0.3 + g*0.59 + b*0.11
声明a却用b计算
chrome底层决定的吧,用chrome的话需要打开存在服务器的网页才能使用getImageData()方法。用firefox、edge等就不用
//从dx,dy开始,使w,h区域马赛克 for(var i=dy;i<(dy+h);i+=size) for(var j=dx;j<(dx+w);j+=size){ }
在canvas中,像素点是以一维数组的形式呈现的,所以当你获取了二维坐标以后,需要转成一维数组。
当你将j的初始值设置为size的时候,即你不马赛克化x方向下前size值的图片,但是你会发现图片处理后的情况如下
可以得出结论,如果j+size的值大于图片的width时,即(j+dy)的值在大于图片的width,他就会从头开始获取像素值,所以才会出现三段图像,而不是我们预料的两段图像
其实你的说法是严谨的做法,但是因为canvasa和canvasb两个canvas其实是相同大小的,所以两种条件都成立
图像边缘的1个像素是保持不变的,相对于整个图像来说可以忽略
试过了,不行的,他的最高和最底相差很大的,用Ps去做,也做不了一个满意的效果。