android.graphics.Bitmap.sameas in android O 在比较 2 个位图相同的配置、尺



我从本机的原始位图创建克隆位图。并尝试通过 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 。否则,我不明白为什么要退回它

相关内容

  • 没有找到相关文章

最新更新