我有一个像素化(模糊)背景和正常图像。
用户将鼠标悬停在图像上几次后如何使图像恢复正常?查询。
样本:
从您的问题来看,您尝试实现的目标有点不清楚,但是假设您的意思是如何将一张图像中的耳朵/绘画到另一张图像中,可以简单地使用以下步骤:
destination-out
将擦除您绘制的内容。您当然必须实现鼠标和绘图的逻辑。
这是此处的现场演示示例。
初始代码可以是:
var ctx = $('#demo')[0].getContext('2d'), /// get context
img = new Image, /// load a new image
isDown = false, /// for mouse button
radius = 15; /// eraser radius
/// setup logic
$(img).on('load', function() { /// onload for image
/// when image has been loaded, attach event listeners for mouse
$('#demo').on('mousedown', function(e) {
isDown = true;
erase(getXY(e));
})
.on('mousemove', function(e) {
if (isDown) erase(getXY(e));
})
.on('mouseup', function(e) {
isDown = false;
});
/// draw blurred image
ctx.drawImage(img, 0, 0);
/// change composite mode so we can erase
ctx.globalCompositeOperation = 'destination-out';
});
img.src = 'http://i.imgur.com/mi3zfEX.jpg'; /// blurred image
画布的目标背景(正常)是用 CSS 定义的:
#demo {
background:url(http://i.imgur.com/v85BQ8k.jpg) no-repeat left top;
cursor:crosshair;
}
然后我们只需要在鼠标位置绘制一些东西来监听覆盖并显示背景:
function erase(pos) {
ctx.beginPath(); /// start new path
ctx.arc(pos.x, pos.y, radius, 0, 2 * Math.PI); /// draw a circle
ctx.closePath(); /// close path
ctx.fill(); /// fill it
}
我们可以用任何颜色填充它——这并不重要,因为我们将destination-out
模式用于复合模式,因为无论如何它都会在绘制它的区域中擦除。
我们唯一需要做的最后一件事是调整鼠标位置,以便我们相对于画布进行绘制 - 此函数返回一个具有x
和y
属性的对象:
function getXY(e) {
var r = $('#demo')[0].getBoundingClientRect();
return {x: e.clientX - r.left, y: e.clientY - r.top};
}