我正在调查下面的情况。
由于恒星背景的α值为0,这意味着恒星不是矩形,因此很难检测出恒星图像是否完全覆盖了菱形图像。
是否有任何库或方法来检测图像是否被其他图像完全覆盖?
或者,有没有人知道这个算法的名称,以便我可以在JS中实现?
谢谢你的帮助!
发布于 2013-09-26 08:47:22
对于形状未知的对象,我们可以使用像素检查来检查对象是否在后面。
下面是一个关于如何做到这一点的完整示例:
在线演示
(GameAlchemist提供了一个修改后的版本)
/// basic allocations
var ctx = demo.getContext('2d'),
os = document.createElement('canvas'),
octx = os.getContext('2d'),
w = os.width = demo.width,
h = os.height = demo.height,
/// the images
urlD = 'http://i.imgur.com/U72xIMZ.png',
urlS = 'http://i.imgur.com/n5rgo11.png',
imgD = new Image(),
imgS = new Image(),
cnt = 2,
/// check region (optimized)
rect = [140, 140, 180, 60];
/// load images and when ready, start show
imgD.crossOrigin = imgS.crossOrigin = 'anonymous';
imgD.onload = imgS.onload = function() {
cnt--;
if (cnt === 0) start();
}
imgD.src = urlD;
imgS.src = urlS;主函数检查上面定义的区域内的像素。为了优化,我们可以缩小搜索范围。如果您需要检查图像在其他大小上是否可见,则只需扩展该区域以检查该区域。
该函数将屏幕外画布与最前面的图像与“活动”画布进行比较,后者同时绘制背景和前景。
如果活动画布=屏幕外画布,这意味着背景图像不可见。
function start() {
octx.drawImage(imgS, (w - imgS.width) * 0.5, 20);
var x = -50,
buffer1 = octx.getImageData(rect[0], rect[1], rect[2], rect[3]).data,
len = buffer1.length;
loop();
function loop() {
ctx.clearRect(0, 0, w, h);
ctx.drawImage(imgD, x, 130);
ctx.drawImage(imgS, (w - imgS.width) * 0.5, 20);
if (compare() === true) {
info.innerHTML = 'Object is behind!';
return;
}
x += 2;
if (x < w) requestAnimationFrame(loop);
}
function compare() {
var buffer2 = ctx.getImageData(rect[0], rect[1], rect[2], rect[3]).data,
i = len - 1;
while(i--) {
if (buffer1[i] !== buffer2[i]) return false
}
return true;
}
}https://stackoverflow.com/questions/18777243
复制相似问题