比较Android中的位图图像

有没有办法检查位图是否相同 ? 有人可以帮我吗?

取决于您如何定义相同。 如果你的意思是完全相同的文件 ,你可以做一个文件的md5sum。 对于我猜的每种types的文件,这都是相同的。

因为您专门区分位图文件,所以您可能对大小不同的文件感兴趣。 那有点难了。 如果它们的大小相同,但不完全相同(但看起来非常像彼此),您可以比较每个单独的像素,如果足够的像素(阈值1)在颜色(阈值2)上彼此足够接近,您可以声明他们是一样的。

您可以使用getPixel(int,int)来获取颜色,请参阅此页面

Bitmap类有方法“sameAs”,您可以使用该方法比较两个位图

http://developer.android.com/reference/android/graphics/Bitmap.html#sameAs%28android.graphics.Bitmap%29

它应该是这样的:

 public boolean equals(Bitmap bitmap1, Bitmap bitmap2) { ByteBuffer buffer1 = ByteBuffer.allocate(bitmap1.getHeight() * bitmap1.getRowBytes()); bitmap1.copyPixelsToBuffer(buffer1); ByteBuffer buffer2 = ByteBuffer.allocate(bitmap2.getHeight() * bitmap2.getRowBytes()); bitmap2.copyPixelsToBuffer(buffer2); return Arrays.equals(buffer1.array(), buffer2.array()); } 

这个问题看起来很旧,但我今天在这个问题上花了一些时间,这就是我所做的。

 private static boolean compare(Bitmap b1, Bitmap b2) { if (b1.getWidth() == b2.getWidth() && b1.getHeight() == b2.getHeight()) { int[] pixels1 = new int[b1.getWidth() * b1.getHeight()]; int[] pixels2 = new int[b2.getWidth() * b2.getHeight()]; b1.getPixels(pixels1, 0, b1.getWidth(), 0, 0, b1.getWidth(), b1.getHeight()); b2.getPixels(pixels2, 0, b2.getWidth(), 0, 0, b2.getWidth(), b2.getHeight()); if (Arrays.equals(pixels1, pixels2)) { return true; } else { return false; } } else { return false; } } 

少于12的API的主要问题是我们为大文件解析得到OutOfMemory错误。 我通过将位图分散成碎片(示例中为10)然后将它们按字节进行比较来解决它:

 private boolean compareBitmaps(Bitmap bitmap1, Bitmap bitmap2) { if (Build.VERSION.SDK_INT > 11) { return bitmap1.sameAs(bitmap2); } int chunkNumbers = 10; int rows, cols; int chunkHeight, chunkWidth; rows = cols = (int) Math.sqrt(chunkNumbers); chunkHeight = bitmap1.getHeight() / rows; chunkWidth = bitmap1.getWidth() / cols; int yCoord = 0; for (int x = 0; x < rows; x++) { int xCoord = 0; for (int y = 0; y < cols; y++) { try { Bitmap bitmapChunk1 = Bitmap.createBitmap(bitmap1, xCoord, yCoord, chunkWidth, chunkHeight); Bitmap bitmapChunk2 = Bitmap.createBitmap(bitmap2, xCoord, yCoord, chunkWidth, chunkHeight); if (!sameAs(bitmapChunk1, bitmapChunk2)) { recycleBitmaps(bitmapChunk1, bitmapChunk2); return false; } recycleBitmaps(bitmapChunk1, bitmapChunk2); xCoord += chunkWidth; } catch (Exception e) { return false; } } yCoord += chunkHeight; } return true; } private boolean sameAs(Bitmap bitmap1, Bitmap bitmap2) { // Different types of image if (bitmap1.getConfig() != bitmap2.getConfig()) return false; // Different sizes if (bitmap1.getWidth() != bitmap2.getWidth()) return false; if (bitmap1.getHeight() != bitmap2.getHeight()) return false; int w = bitmap1.getWidth(); int h = bitmap1.getHeight(); int[] argbA = new int[w * h]; int[] argbB = new int[w * h]; bitmap1.getPixels(argbA, 0, w, 0, 0, w, h); bitmap2.getPixels(argbB, 0, w, 0, 0, w, h); // Alpha channel special check if (bitmap1.getConfig() == Bitmap.Config.ALPHA_8) { final int length = w * h; for (int i = 0; i < length; i++) { if ((argbA[i] & 0xFF000000) != (argbB[i] & 0xFF000000)) { return false; } } return true; } return Arrays.equals(argbA, argbB); } private void recycleBitmaps(Bitmap bitmap1, Bitmap bitmap2) { bitmap1.recycle(); bitmap2.recycle(); bitmap1 = null; bitmap2 = null; }