比较Android中的位图图像

CMA*_*CMA 16 android bitmap

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

Ket*_*mar 62

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

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

  • 请注意,在API v12(即Android 3.1)之前不会引入sameAs方法,因此对于旧版本来说这不是很有用. (7认同)
  • minSdk 14所有的事情 (6认同)

alt*_*ano 14

它应该是这样的:

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());
}
Run Code Online (Sandbox Code Playgroud)

  • 内存不足异常 (3认同)
  • 内存异常甚至在星系S3上 (3认同)
  • 上述方法非常耗费内存.对于存储在ARGB中的20万像素图像,它将尝试使用_at至160 MB RAM来比较它们(每个图像80 MB =每个像素20 MP*4个字节). (2认同)

Kyl*_* O. 9

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 你可以简化语句来返回Arrays.equals(pixels1,pixels2); 而是"if(Arrays.equals(pixels1,pixels2)){return true;} else {return false;}" (3认同)

Nan*_*nne 2

取决于你如何定义。如果您指的是完全相同的文件,您可以对文件进行 md5sum。我猜对于每种类型的文件来说都是一样的。

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

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