首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有任何javascript方法来检测画布图像封面吗?

有任何javascript方法来检测画布图像封面吗?
EN

Stack Overflow用户
提问于 2013-09-13 02:18:56
回答 1查看 623关注 0票数 0

我正在调查下面的情况。

  1. 由JS创建的Html画布。
  2. 画布上有一个星图(从带有alpha=0背景的png加载)和一个菱形图像(也是从带有alpha=0背景的png加载的)。
  3. 钻石图像正在向恒星图像移动。
  4. 当钻石图像完全在恒星图像后面,比如只显示恒星图像和钻石图像完全在恒星图像后面时,提醒(“隐藏”);
  5. 如果显示了钻石的多个像素,则不应出现警报。

由于恒星背景的α值为0,这意味着恒星不是矩形,因此很难检测出恒星图像是否完全覆盖了菱形图像。

是否有任何库或方法来检测图像是否被其他图像完全覆盖?

或者,有没有人知道这个算法的名称,以便我可以在JS中实现?

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-26 08:47:22

对于形状未知的对象,我们可以使用像素检查来检查对象是否在后面。

下面是一个关于如何做到这一点的完整示例:

在线演示

(GameAlchemist提供了一个修改后的版本)

代码语言:javascript
复制
/// 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;

主函数检查上面定义的区域内的像素。为了优化,我们可以缩小搜索范围。如果您需要检查图像在其他大小上是否可见,则只需扩展该区域以检查该区域。

该函数将屏幕外画布与最前面的图像与“活动”画布进行比较,后者同时绘制背景和前景。

如果活动画布=屏幕外画布,这意味着背景图像不可见。

代码语言:javascript
复制
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;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18777243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档