我从本机的原始位图创建克隆位图。并尝试通过 api android.graphics.Bitmap.sameAs() 比较 java 层中的 2 位图,它在 Android O 中返回 false,但在其他 Android 版本中返回 true。此外,我还尝试在 android O 中通过 android 位图 API 比较配置、尺寸、像素数据,例如:
private boolean compareBitmap(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);
}
方法compareBitmap()在android O中也返回true。所以,我不知道为什么 android.graphics.Bitmap.sameAs() 在这种情况下返回 false,当 2 位图具有相同的配置、尺寸、像素数据时?
如果您有来自同一可绘制资源的位图,这可以为您提供帮助。我遇到了同样的问题,对我来说,通过将色调设置为可绘制(出于比较目的,我将其转换为位图)解决了这个问题。
我必须设置Tint使它们相似:
private fun getBitmap(drawable: Drawable): Bitmap {
val bitmap = Bitmap.createBitmap(drawable.intrinsicWidth,
drawable.intrinsicHeight, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
drawable.setBounds(0, 0, canvas.width, canvas.height)
drawable.setTint(Color.TRANSPARENT)
drawable.draw(canvas)
return bitmap
}
private fun compareBitMap(bitmap: Bitmap, otherBitmap: Bitmap): Boolean {
val bitMapAreSame = bitmap.sameAs(otherBitmap) &&
(bitmap.width == otherBitmap.width &&
bitmap.width == otherBitmap.width &&
bitmap.height == otherBitmap.height &&
bitmap.byteCount == otherBitmap.byteCount &&
bitmap.density == otherBitmap.density)
bitmap.recycle()
otherBitmap.recycle()
return bitMapAreSame
}
仔细检查传递的位图是否不为空。如果为 null,它将返回 false
。否则,我不明白为什么要退回它