表示出来的结果是一样吗,你换一下都对比一下就知道了
调用方法传值
起一个本地服务就可以了
支持的呀
fillStyle 可以设置成 RGBA,你应该在离屏 canvas 就处理好。然后调用目标 canvas 直接画
我看的时候也觉得有问题。。。不知道是不是我的理解有问题,截取是从原图(sx,sy)截取的,思路1正确的做法我觉得应该是把canvas的宽高等比缩小后原图宽高的1/2减去缩小后的画布宽高的1/2,截取下来的部分再放在画布上(0,0,canvas.width,canvas.height)
写几个滑块控制不同方向超出部分大小,注意这里就不能再使用 drawImageByScale 了,因为这个函数是以中心为缩放de。
html代码,max,value等值随意。
<input type="range" name="range" id="vertical" min="0" max="3.0" step="0.01" value="1.5" class="slider left">
js代码:
let canvas = document.querySelector('#canvas'), vertical = document.querySelector('#vertical'), // 右侧滑块 slider = document.querySelector('#range'); ... let scale = slider.value; let exceedInfo = { dx: 0, dy: 0, imageWidth: 0, imageHeight: 0 }; // 缩放后的图像信息 ... image.onload = () => { vertical.onmousemove = () => { const { dx, dy } = exceedInfo; dy < 0 && drawExceedImage(vertical.value); // 超出的时候小于0 } } // 绘制超出部分 function drawExceedImage(y) { context.clearRect(0, 0, canvas.width, canvas.height); // 清空画布 const { dx, imageWidth, imageHeight } = exceedInfo; context.drawImage(image, dx, -y, imageWidth, imageHeight); } function drawImageByScale(scale) { ... if (dy < 0) { let max = Math.abs(dy) * 2; // 滑块的最大值,dy是顶部超出,因为纵向只用了一个滑块,所以底部 + 顶部 = *2 vertical.max = max; vertical.value = max / 2; // 初始值是中间值,表示无translateY } ... return { dx, dy, imageWidth, imageHeight } }
一开始是这样:
这时候其实没有超出,可以隐藏右侧滑块,我没写。
放大后这样(已经在垂直方向超出了):
拖到顶部是这样:
拖到底部是这样:
contexta应该是canvasa吧
找到原因了,我截取的时候截取的大小超过了图片的大小,所以。。
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画布位置的坐标应该就可以算出来了
同求感觉d3没有什么系统的教程
要找一张比画布大的图片才可以看出效果
这个问题有意思,就是饱和度的计算公式,有了这个公式就和灰度效果的实现差不多
自己回答一下,果然是因为图片引用上出问题了,如果放img文件夹中,引用应该写为“../img/img.jpg”
当然可以
我是先将 canvas的大小与 图片大小调成一致 然后在渲染过后的canva用 css的手段 将其限制大小 这样就不会失帧了
鼠标抬起啊
so what
getBoundingClientReact是获得元素相对与游览器视窗的left、top、right、bottom的值
context.clearRect(0,0,canvas.width,canvas.height);每次点击之后你是不是没有重新来绘制canvas,没有清空呢?
good
offsetleft,会把盒子模型里的margin值也算进去这样就无法得到精确的位置了。