是的,所以我想说我要比较两个BitmapDatas。一个是背景图像(不是实体,它有不同的像素),另一个是完全相同背景之上的某种东西(如精灵)。现在我要做的是通过比较两个图像,从第二个图像中删除背景,并从背景中删除第二个图像中存在的所有像素。 为清楚起见,基本上我想在AS3中做this。
现在我提出了两种方法来做到这一点,它们都完美无缺。一个直接比较像素,而另一个首先使用BitmapData.compare()
方法,然后将适当的像素复制到结果中。我想知道的是哪种方式更快。</ p>
以下是我的两种做法:
方法1
for (var j:int = 0; j < layer1.height; j++)
{
for (var i:int = 0; i < layer1.width; i++)
{
if (layer1.getPixel32(i, j) != layer2.getPixel32(i, j))
{
result.setPixel32(i, j, layer2.getPixel32(i, j));
}
}
}
方法2
result = layer1.compare(layer2) as BitmapData;
for (var j:int = 0; j < layer1.height; j++)
{
for (var i:int = 0; i < layer1.width; i++)
{
if (result.getPixel32(i, j) != 0x00000000)
{
result.setPixel32(i, j, layer2.getPixel32(i, j));
}
}
}
layer1
是背景,layer2
是背景将被移除的图片,result
只是BitmapData
,结果将会出现。< / p>
这些非常相似,我个人没有注意到速度上的任何差异,但我只是想知道是否有人知道哪个会更快。我可能会使用方法1,因为BitmapData.compare()
不会比较像素alpha,除非颜色相同,但我仍然认为这不会有问题。
答案 0 :(得分:2)
这可能不是100%适用于你的情况,但FWIW我对此做了一些研究,这是我当时写的:
我一直想尝试授予skinners性能测试的东西,所以这是我的机会。
我测试了原生比较,迭代比较,反向迭代比较(因为我知道它们有点快),最后使用blendmode DIFFERENCE进行比较。
反向迭代比较如下所示:
for (var bx:int = _base.width - 1; bx >= 0; --bx) {
for (var by:int = _base.height - 1; by >= 0; --by) {
if (_base.getPixel32(bx, by) != compareTo.getPixel32(bx, by)) {
return false;
}
}
}
return true;
blendmode比较如下所示:
var test:BitmapData = _base.clone();
test.draw(compareTo, null, null, BlendMode.DIFFERENCE);
var rect:Rectangle = test.getColorBoundsRect(0xffffff, 0x000000, false);
return (rect.toString() != _base.rect.toString());
我不是100%确定这是完全可靠的,但似乎有效。
我在500x500图像上运行了50次迭代的每个测试。
不幸的是我的像素弯曲工具包是不可靠的,所以我无法尝试这种方法。
每个测试都在调试和发布播放器中进行比较,注意到巨大的差异!
完整代码在此处:http://webbfarbror.se/dump/bitmapdata-compare.zip
答案 1 :(得分:1)
您可以尝试使用着色器检查两个图像是否匹配,如果没有,则将图像的一个点保存为输出。像这样:
kernel NewFilter
< namespace : "Your Namespace";
vendor : "Your Vendor";
version : 1;
description : "your description";
>
{
input image4 srcOne;
input image4 srcTwo;
output pixel4 dst;
void evaluatePixel()
{
float2 positionHere = outCoord();
pixel4 fromOne = sampleNearest(srcOne, positionHere);
pixel4 fromTwo = sampleNearest(srcTwo, positionHere);
float4 difference=fromOne-fromTwo;
if (abs(difference.r)<0.01&&abs(difference.g)<0.01&&abs(difference.b)<0.01) dst=pixel4(0,0,0,1);
else dst = fromOne;
}
}
如果匹配则返回黑色像素,不匹配时返回第一个图像的像素。使用Pixel Bender使其在Flash中运行。一些教程是here。着色器通常比普通AS3代码更快。