Algorithm 如何仅绘制>;0%alpha和画布中的自定义颜色?

Algorithm 如何仅绘制>;0%alpha和画布中的自定义颜色?,algorithm,canvas,hit,Algorithm,Canvas,Hit,我想为png图像和其他形状做一个良好的性能命中测试。我真的不在乎它们是什么形状,因为使用这种技术在检查(而不是设置)时没有性能问题 我打算在一个辅助画布中收集屏幕上的所有图像,只是为了进行点击测试。对于每一幅画的图像,我将创建一种新的颜色,并将其附加到该特定图像上。然后我把它们都画在画布上,每个图像都有不同的填充颜色 当我点击一个像素(x,y)时,它会得到颜色(r,g,b)。每种颜色都映射到一个图像,所以我点击图像时没有任何错误(我不会浪费时间去查找点击的内容) 我知道它将被限制为256*25

我想为png图像和其他形状做一个良好的性能命中测试。我真的不在乎它们是什么形状,因为使用这种技术在检查(而不是设置)时没有性能问题

我打算在一个辅助画布中收集屏幕上的所有图像,只是为了进行点击测试。对于每一幅画的图像,我将创建一种新的颜色,并将其附加到该特定图像上。然后我把它们都画在画布上,每个图像都有不同的填充颜色

当我点击一个像素(x,y)时,它会得到颜色(r,g,b)。每种颜色都映射到一个图像,所以我点击图像时没有任何错误(我不会浪费时间去查找点击的内容)

我知道它将被限制为256*256*256=16777216个项目,因为这些都是颜色,但我认为现在不会有问题

因此,我真正需要的是知道如何将这些填充颜色放置在二次画布上,二次画布仅基于每个图像的可见像素

更新

正如你在右边看到的,这是命中测试图。因此,如果我点击黑色阴影(c),我立即知道我点击了蓝色框,没有任何其他计算

一个改进是缓存alpha数据。还可以为每个图像实例重用相同的alpha数据(我们必须注意缩放和旋转…)


谢谢

以下是如何对画布图像的不透明像素进行颜色遮罩

请确保将“PutYourImageHere.png”替换为您自己的图像url

<!doctype html>
<html>
<head>

<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>

<style>
    body{ background-color: ivory; }
    canvas{border:1px solid blue;}
</style>

<script>
    $(function(){

        var img=new Image();
        img.onload=function(){

          var red=255;
          var blue=0;
          var green=0;

          var canvasCopy=document.getElementById("canvasCopy");
          var ctxCopy=canvasCopy.getContext("2d");

          var c=document.getElementById("canvas");
          var ctx=c.getContext("2d");
          ctx.drawImage(this,0,0);

          var imgData=ctx.getImageData(0,0,c.width,c.height);

          for (var i=0;i<imgData.data.length;i+=4)
            {
                if(imgData.data[i+3]>0){
                    imgData.data[i]=red;
                    imgData.data[i+1]=green;
                    imgData.data[i+2]=blue;
                    imgData.data[i+3]=255;
                }
            }
          ctxCopy.putImageData(imgData,0,0);
        }
        img.src = "PutYourImageHere.png";

    }); // end $(function(){});
</script>

</head>

<body>

    <canvas id="canvas" width="300" height="300"></canvas>
    <canvas id="canvasCopy" width="300" height="300"></canvas>

</body>
</html>

正文{背景色:象牙;}
画布{边框:1px纯蓝色;}
$(函数(){
var img=新图像();
img.onload=函数(){
var-red=255;
var蓝=0;
绿色变量=0;
var canvasCopy=document.getElementById(“canvasCopy”);
var ctxCopy=canvasCopy.getContext(“2d”);
var c=document.getElementById(“画布”);
var ctx=c.getContext(“2d”);
ctx.drawImage(这个,0,0);
var imgData=ctx.getImageData(0,0,c.宽度,c.高度);
对于(var i=0;i

其他碰撞检测测试有什么问题吗?碰撞检测不会在每个图像中检查每个像素是否被击中?这对于每个约1000像素的>1000个瓷砖来说太慢了。(每个鼠标盖的1000000次检查将非常滞后).我甚至不知道我的想法是否有效,就像我15分钟前想到的那样…嗯,这似乎是为flash设计的。我需要的是一种在画布上为html+Javascript绘制图像填充区域的方法。我认为它会有效!我现在无法测试它,但它似乎正是我想要的。我不知道imageData是结构化的这样做[pixels1.red,pixel1.green,pixel1.blue,pixel2.alpha,pixel2.red]…你知道更深入地解释这个主题的链接吗?谢谢(:刚刚测试过,效果很好!非常感谢!很高兴我能帮上忙。一些优化技巧:--1.将imgData.data缓存为var data=imgData.data,--2.您可以抓取画布的一小部分,而不是整个画布:var myArea=ctx.getImageData(X,Y,Width,Height),--3.可能的最佳优化:计算图像的边界框(BB)并测试BB的碰撞,这样如果没有碰撞,您可以完全避免碰撞测试!嗯,我想您不太理解我的想法。我将在我的问题中发布一张图像,解释它将如何工作。。