我正在尝试根据较小图像的构图将图像放在另一个图像的顶部。较小的图像是较大图像的剪切,我需要将其精确定位在较大的图像上,使其看起来像单个图像,但允许应用单独的滤镜和alpha。由于图像不是简单的矩形或圆形,而是复杂的卫星图像,我不能简单地在代码中重绘它们。我有很多图像,因此不想手动找到每个图像的位置,并在动作脚本中手动设置它们。有没有办法让我在较大的图像上采样一个5-10平方的小像素区域,如果找到完美的匹配则设置较小图像的x和y值?所有的图像都在一个数组中,并且已经设置了迭代它们,我只需要一种方法来对像素进行采样和匹配。我的第一个猜测是逐个像素地向上和向下循环图像,覆盖整个位图并在找到匹配后移动到阵列中的下一个子节点,将匹配的子节点保留在找到完美匹配时的位置。
答案 0 :(得分:1)
对于实际比较,如果BitmapData对象是等效的,则BitmapData.compare返回数字0。
答案 1 :(得分:1)
您需要在大图像中找到像素序列。 BitmapData.getPixel
为您提供像素值。因此,从小图像中获取第一个像素,在大图像中找到它,然后继续比较,直到找到完全匹配。如果您无法编写代码,请随时提问。
答案 2 :(得分:1)
我希望我能正确理解你的问题。
可能有一个选项使用copypixels来达到你想要的效果。您可以使用bitmapdata.rect值来确定所需样本的大小,并使用t矩形和移动点遍历更大的位图。让我们看看我是否可以编写代码......
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中blitting”找到一些好的教程。我目前正在开发一个使用这种技术的游戏项目,这是一个非常好的方法。
祝你好运!编辑:忘记在默认的return语句中编码。使用此方法,您必须返回一个无效点(如(-1,-1))并在函数外部检查它。或者,您可以将您的小位图复制到函数中的大位图,这将更合乎逻辑,但我不知道您的要求。