无价脂宝
表示出来的结果是一样吗,你换一下都对比一下就知道了
Kerry251150
qq_孤独之旅_1
调用方法传值
慕斯卡8272550
起一个本地服务就可以了
慕虎0392284
支持的呀
等她下班
fillStyle 可以设置成 RGBA,你应该在离屏 canvas 就处理好。然后调用目标 canvas 直接画
熊出没
我看的时候也觉得有问题。。。不知道是不是我的理解有问题,截取是从原图(sx,sy)截取的,思路1正确的做法我觉得应该是把canvas的宽高等比缩小后原图宽高的1/2减去缩小后的画布宽高的1/2,截取下来的部分再放在画布上(0,0,canvas.width,canvas.height)
qq_杨小姐好萌啊_0
写几个滑块控制不同方向超出部分大小,注意这里就不能再使用 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 }
}一开始是这样:

这时候其实没有超出,可以隐藏右侧滑块,我没写。
放大后这样(已经在垂直方向超出了):

拖到顶部是这样:

拖到底部是这样:

慕桂英1016021
contexta应该是canvasa吧
qq_Takeiteasy_2
找到原因了,我截取的时候截取的大小超过了图片的大小,所以。。
何时才能成大佬
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>


慕用0489808
是因为没有服务器环境吧,不要用本地图片再试一下
第二钢协
猫猫猫尾草
这哪是什么小问题呀,这
大学霸
比如查看商品的图片时点击可以弹出浏览并可以放大和缩小等一些操作
king0964
因为对象的赋值操作是引用赋值操作。
幕布斯6573378
onmousedown()和onmouseup()获取鼠标按下和松开的坐标,再计算一下相对于canvas画布位置的坐标应该就可以算出来了
精慕门1560878
同求感觉d3没有什么系统的教程
x米多米拉
改成下面这样了,不知道还有没有问题,欢迎交流~
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;
}
}
JeAioTime
要找一张比画布大的图片才可以看出效果
qq_锋田鸣歌_04346908
这个问题有意思,就是饱和度的计算公式,有了这个公式就和灰度效果的实现差不多
Serena_Cecilia
自己回答一下,果然是因为图片引用上出问题了,如果放img文件夹中,引用应该写为“../img/img.jpg”
慕函数5127544
当然可以
qq_A風love銘_0
我是先将 canvas的大小与 图片大小调成一致 然后在渲染过后的canva用 css的手段 将其限制大小 这样就不会失帧了
慕设计2571273
鼠标抬起啊
TalorCC
so what
DangCode
getBoundingClientReact是获得元素相对与游览器视窗的left、top、right、bottom的值
慕粉210917370
保存图片到手机这个问题解决了吗?
沉谙
context.clearRect(0,0,canvas.width,canvas.height);每次点击之后你是不是没有重新来绘制canvas,没有清空呢?