我想根据较小图像的构成将图像定位在另一图像上。较小的图像是较大图像的切出部分,我需要将其精确定位在较大的图像上,以使其看起来像单个图像,但允许应用单独的滤镜和alpha。由于图像不是简单的矩形或圆形,而是复杂的卫星图像,我不能简单地用代码重新绘制它们。我有相当多的图像,因此不想手动找到每个图像的位置,并在动作中手动设置它们。如果找到完美匹配,我有什么办法可以在较大的图像上采样一个5-10平方的小像素区域,并设置较小图像的x值和y值?所有图像都在一个数组中,并且已经设置了它们,我只需要一种方法来对像素进行采样和匹配。我的第一个猜测是将图像逐像素地向右和向下循环,覆盖整个位图并在找到匹配时移动到数组中的下一个孩子,将匹配的孩子留在发现完美匹配时的位置。比较两个相互匹配的位图匹配as3
回答
我希望我能正确理解你的问题。
可能有一个选项使用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)),并在函数外检查它。或者,你可以将你的小位图复制到函数中的大位图,这会更合理,但我不知道你的要求。
在您回答之前,我刚刚完成了一些与此类似的事情。我进一步尝试确保它的采样点不是较小位图中的空像素,因为它们通常是不带拐角的不规则形状。谢谢一堆。 – NickCSE 2011-03-26 17:18:21
@ Shammr0ck嗯,你正在使用每像素的方法。如果你必须走这条路线,如果你的图像支持透明度,你可以只检查像素的第一个字节 - 如果第一个字节是0x00,则跳过检查。这样,你只会对颜色检查颜色。不过,我仍然认为,对于你似乎在做的事情,真正的blitting会是更好的答案,因为你可以在幕后进行颜色更改,并放置图像而不必担心偏移和重叠。也许你可以详细说明你的项目?听起来很有趣。 – 2011-03-26 19:17:52
还没有机会看blitting,所以我现在就把它留在它的位置。我正在为不同的公司创建交互式地图,并且不希望在主要主图像的顶部加载外部图像时手动设置图像位置。我并没有完全为我的需求制定出完美的解决方案,因为图像是从主地图中剪切出来的,图像编辑器尝试对它们进行反锯齿,然后边缘无法匹配原始图像中的任何内容。我打算使用黑名单数组来防止检查者匹配那个位置,如果找不到匹配的话。 – NickCSE 2011-03-26 20:01:22
对于实际比较,有BitmapData.compare,如果BitmapData对象是等效的,则返回数字0。
您需要在大图像中找到像素序列。 BitmapData.getPixel
为您提供像素值。因此,从小图像中获取第一个像素,找到大图像,然后继续比较,直到找到完全匹配。如果您在编码时遇到麻烦,请随时询问。
这就是我的想法,但我不确定如何使它正常工作。我发布了下面的内容。 – NickCSE 2011-03-25 15:35:13
- 1. 如何比较两个相同的表来匹配或不匹配行?
- 2. 比较和匹配图像
- 3. 熊猫比较两列匹配文本和打印全匹配的匹配
- 4. 尝试比较两个位置时不匹配
- 5. 比较完成和部分匹配的两个地图的值
- 6. 比较两个csv使用powershell并返回匹配和不匹配的值
- 7. SQL比较不匹配值
- 8. String.equals比较匹配失败
- 9. R:最佳匹配比较
- 10. SQL-比较列匹配集
- 11. Python - 列表比较/匹配
- 12. 比较两个文件并在匹配后用一些行打印匹配行
- 13. 比较两列与其他两列,并找到匹配以及不匹配
- 14. 比较两张图片/匹配一个复杂手势
- 15. 匹配两个图像
- 16. Nginx的位置相匹配
- 17. 如何比较两栏中数据匹配(或不匹配)的数据?
- 18. 在比较图像之前匹配图像位置
- 19. 比较哈希映射的匹配和不匹配
- 20. 比较两个数组,并导致匹配的一个
- 21. 与两个匹配和非匹配图案至REGx图案
- 22. 比较最近匹配的两个文件中的字段
- 23. 比较两个字符串并找到多个匹配
- 24. 比较两个阵列并打印匹配元素的数量
- 25. 比较两个dataframes和过滤匹配的值
- 26. 比较和计数两个关联阵列的匹配值 - PHP
- 27. 使用awk比较两个文件并打印匹配的行
- 28. 比较excel中的两个表,看看列是否匹配
- 29. for循环比较两个数组寻找匹配的值
- 30. 比较两个数据表以找到匹配的值
为什么不发布至少伪代码为你正在做什么,并告诉我们什么不按预期工作。 – jswolf19 2011-03-25 02:22:11