我想比较两个不同图像的像素。我将第一个图像的像素与第二个图像的所有像素进行比较。这是我的代码:
for (int i = 0; i < bitmap.getWidth(); i++) {
for (int j = 0; j < bitmap.getHeight(); j++) {
for (int k = 0 ; k<bitmpa2.getWidth(); k++) {
for (int l = 0 ; l<bitmpa2.getHeight(); l++) {
if (bitmap.getPixel(i, j) == bitmap2.getPixel(k, l))
Counter++ ;
}
}
}
}
这里Counter的值是两个图像中相同的像素数。问题是这可以工作但是需要花费很多时间来执行它,因此时间约束是这里的问题,那么我有什么可以减少时间并获得精确结果。欢迎任何其他可能性。
答案 0 :(得分:3)
哦不,在Android中进行图像处理时请记住这一点。
永远不要连续使用getPixel()或setPixel(),就像循环一样 导致一个非常糟糕的表现,该死的慢。使用getPixels() 和setPixels()改为
好吧,请记住,您需要先阅读Android文档。
答案 1 :(得分:2)
如果您使用的是API级别12或更高版本,Bitmap
上有一个名为sameAs
的方法可以完全满足您的要求。否则,请使用getPixels
并执行以下操作:
int width = bitmap1.getWidth();
int height = bitmap1.getHeight();
int pixelCount = width * height;
int[] pixels1 = new int[pixelCount];
int[] pixels2 = new int[pixelCount];
bitmap1.getPixels(pixels1, 0, 0, 0, 0, width, height);
bitmap2.getPixels(pixels2, 0, 0, 0, 0, width, height);
for (int i = 0; i < pixelCount; i++) {
if (pixels1[i] != pixels2[i]) {
return false;
}
}
return true;
或者,如果你真的想做反击的事情,看看有多少像素相同,那就去做吧。
实际上,你也可以对缓冲区做些什么......也许像
这样的东西int width = bitmap1.getWidth();
int height = bitmap1.getHeight();
int pixelCount = width * height;
IntBuffer buffer1 = IntBuffer.allocate(pixelCount);
IntBuffer buffer2 = IntBuffer.allocate(pixelCount);
bitmap1.copyPixelsToBuffer(buffer1);
bitmap2.copyPixelsToBuffer(buffer2);
int result = buffer1.compareTo(buffer2);
我不确定这两种方法在性能方面有何比较,但如果你愿意,可以使用它。
答案 2 :(得分:0)
算法的顺序是n ^ 4.
我猜你可以把它推到n ^ 3,如果你
Counter
如果bitmap
和 中的颜色 我 出现 x 次y {/ em> 次bitmap2
,
Counter = Counter + x*y