【发布时间】:2018-03-02 09:25:56
【问题描述】:
我有一张想要裁剪的图片。
因此,我创建了具有较暗背景的canvas as overlay,然后在鼠标移动时,我在该画布上绘制了一个rect,并在该矩形中清除了深色背景。如下所示:
因此,没有背景的区域将被裁剪。
我的代码如下:
var canvas = document.getElementById('canvas');
var img = document.getElementById('photo');
var ctx = canvas.getContext('2d');
var rect = {};
var drag = false;
var update = true; // when true updates canvas
var original_source = img.src;
img.src = original_source;
var deg = 0;
var image_rotate_angle = 90;
document.getElementById('right').addEventListener("click", rotateRight, false);
document.getElementById('left').addEventListener("click", rotateLeft, false);
function rotateRight(){
deg = deg + image_rotate_angle;
img.style.transform = "rotate(" + deg + "deg)";
canvas.style.transform = "rotate(" + deg + "deg)";
}
function rotateLeft(){
deg = deg - image_rotate_angle;
img.style.transform = "rotate(" + deg + "deg)";
canvas.style.transform = "rotate(" + deg + "deg)";
}
function init() {
img.addEventListener('load', function(){
canvas.width = img.width;
canvas.height = img.height;
canvas.addEventListener('mousedown', mouseDown, false);
canvas.addEventListener('mouseup', mouseUp, false);
canvas.addEventListener('mousemove', mouseMove, false);
});
// start the rendering loop
requestAnimationFrame(updateCanvas);
}
// main render loop only updates if update is true
function updateCanvas(){
if(update){
drawCanvas();
update = false;
}
requestAnimationFrame(updateCanvas);
}
// draws a rectangle with rotation
function drawRect(){
ctx.clearRect(rect.startX, rect.startY, rect.w, rect.h);
}
// clears canvas sets filters and draws rectangles
function drawCanvas(){
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = 'rgba(32, 32, 32, 0.7)';
ctx.fillRect(0, 0, canvas.width, canvas.height);
drawRect()
}
// create new rect add to array
function mouseDown(e) {
rect = {
startX : e.offsetX,
startY : e.offsetY,
w : 1,
h : 1
};
drag = true;
}
function mouseUp() { drag = false; update = true; }
function mouseMove(e) {
if (drag) {
rect.w = (e.pageX - this.offsetLeft) - rect.startX;
rect.h = (e.pageY - this.offsetTop) - rect.startY;
update = true;
}
}
init();
canvas{
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
display:inline-block;
background:rgba(0,0,0,0.3);
}
<div style="margin-bottom: 15px;">
<button id="left">Rotate Reft</button>
<button id="right">Rotate Right</button>
</div>
<div style="position: relative; overflow: hidden;display:inline-block;">
<img id="photo" src="http://www.html5canvastutorials.com/demos/assets/darth-vader.jpg"/>
<canvas id="canvas"></canvas>
</div>
我还有两个用于旋转图像的按钮。我有问题。解决方案可能很明显,但我没有看到。
如果我画一个矩形然后旋转图像,我也会旋转图像和画布,然后矩形在旋转后保持在同一位置。这就是我想要的,而且效果很好。
问题是如果我先旋转图像然后尝试绘制一个矩形。然后矩形没有按应有的方式绘制,它朝相反的方向移动。
知道怎么解决吗?
【问题讨论】:
-
所以,你想旋转图像而不是画布。不是吗?
-
@LuisGar 否。如果我不将画布与图像一起旋转,则矩形将保持在与旋转前相同的位置。
-
所以你可以破例。如果绘制了矩形,则全部旋转,如果没有,则仅旋转图像。如果我在函数 rotateLeft 和 rotateRight 中评论 line canvas.... 它运行良好。但是如果要保持矩形如果是绘制那么你应该例外
-
如果这是你的目标,你可能必须在切割后重新旋转作品
-
@LuisGar 那怎么做?如果您用画布注释掉线条,则在旋转之前未绘制画布时它可以正常工作。如果这些行被注释掉并且您先绘制矩形然后旋转图像,则矩形将保持在与旋转前相同的位置。这就是我不想要的。
标签: javascript canvas