2011-03-25 91 views
1

我想根据较小图像的构成将图像定位在另一图像上。较小的图像是较大图像的切出部分,我需要将其精确定位在较大的图像上,以使其看起来像单个图像,但允许应用单独的滤镜和alpha。由于图像不是简单的矩形或圆形,而是复杂的卫星图像,我不能简单地用代码重新绘制它们。我有相当多的图像,因此不想手动找到每个图像的位置,并在动作中手动设置它们。如果找到完美匹配,我有什么办法可以在较大的图像上采样一个5-10平方的小像素区域,并设置较小图像的x值和y值?所有图像都在一个数组中,并且已经设置了它们,我只需要一种方法来对像素进行采样和匹配。我的第一个猜测是将图像逐像素地向右和向下循环,覆盖整个位图并在找到匹配时移动到数组中的下一个孩子,将匹配的孩子留在发现完美匹配时的位置。比较两个相互匹配的位图匹配as3

+0

为什么不发布至少伪代码为你正在做什么,并告诉我们什么不按预期工作。 – jswolf19 2011-03-25 02:22:11

回答

1

我希望我能正确理解你的问题。

可能有一个选项使用copypixels来实现你想要的。您可以使用bitmapdata.rect值来确定所需示例的大小,并使用矩形和移动点循环更大的位图。让我们看看我是否可以编码...

function findBitmapInBitmap(tinyimg:BitmapData, largeimg:BitmapData):Point { 
    var rect:Rectangle = tinyimg.rect; 
    var xbound:uint = largeimg.rect.width; 
    var ybound:uint = largeimg.rect.height; 
    var imgtest:BitmapData = new BitmapData(tinyimg.rect.width, tinyimg.rect.height); 

    for (var ypos:uint = 0, y <= ybound, y++) { 
     for (var xpos:uint = 0, x <= xbound, x++) { 
      imgtest.copyPixels(largeimg, rect, new Point(xpos, ypos); 
      if (imgtest.compare(tinyimg) == 0) return new Point(xpos, ypos); 
     } 
    } 

    return new Point(-1,-1); // Dummy value, indicating no match. 

} 

沿着这些线应该工作 - 我敢肯定,代码优雅和可能的优化的空间。但是,看起来像这种方法会很慢,因为您必须检查每个像素是否匹配。

有一个更好的方法。将您的大图分割成图层,并使用blitting技术在运行时将它们合成。在你的情况下,你可以创建一个没有卫星的地面纹理,然后分别创建卫星,并使用copyPixels方法将它们放在任何你想要的地方。谷歌“在as3中传输”找到一些很好的教程。我目前正在研究使用这种技术的游戏项目,这是一个非常好的方法。

祝你好运!

编辑:忘记在默认返回语句中的代码。使用这种方法,你必须返回一个无效点(如(-1,-1)),并在函数外检查它。或者,你可以将你的小位图复制到函数中的大位图,这会更合理,但我不知道你的要求。

+0

在您回答之前,我刚刚完成了一些与此类似的事情。我进一步尝试确保它的采样点不是较小位图中的空像素,因为它们通常是不带拐角的不规则形状。谢谢一堆。 – NickCSE 2011-03-26 17:18:21

+0

@ Shammr0ck嗯,你正在使用每像素的方法。如果你必须走这条路线,如果你的图像支持透明度,你可以只检查像素的第一个字节 - 如果第一个字节是0x00,则跳过检查。这样,你只会对颜色检查颜色。不过,我仍然认为,对于你似乎在做的事情,真正的blitting会是更好的答案,因为你可以在幕后进行颜色更改,并放置图像而不必担心偏移和重叠。也许你可以详细说明你的项目?听起来很有趣。 – 2011-03-26 19:17:52

+0

还没有机会看blitting,所以我现在就把它留在它的位置。我正在为不同的公司创建交互式地图,并且不希望在主要主图像的顶部加载外部图像时手动设置图像位置。我并没有完全为我的需求制定出完美的解决方案,因为图像是从主地图中剪切出来的,图像编辑器尝试对它们进行反锯齿,然后边缘无法匹配原始图像中的任何内容。我打算使用黑名单数组来防止检查者匹配那个位置,如果找不到匹配的话。 – NickCSE 2011-03-26 20:01:22

1

对于实际比较,有BitmapData.compare,如果BitmapData对象是等效的,则返回数字0。

+0

您仍然必须循环检查像素数据,以检查像素颜色是否不同于0. – 3Devil 2011-03-25 17:17:26

+0

@ 3Devil不能,请阅读文档。它返回数字0. – 2011-03-25 18:06:49

+0

我并没有比较两个位图,而是试图在另一个较大的位图中找到一个较小的位图。比较没有为我完成。 – NickCSE 2011-03-25 18:38:53

1

您需要在大图像中找到像素序列。 BitmapData.getPixel为您提供像素值。因此,从小图像中获取第一个像素,找到大图像,然后继续比较,直到找到完全匹配。如果您在编码时遇到麻烦,请随时询问。

+0

这就是我的想法,但我不确定如何使它正常工作。我发布了下面的内容。 – NickCSE 2011-03-25 15:35:13