有没有办法根据图像的宽度、高度和文件大小来确定Bitmap.getByteCount?

Is there a way to determine Bitmap.getByteCount based on the image width, height and file size?

基于

https://android.googlesource.com/platform/frameworks/base/+/master/graphics/java/android/graphics/RecordingCanvas.java

/** @hide */
private static int getPanelFrameSize() {
    final int DefaultSize = 100 * 1024 * 1024; // 100 MB;
    return Math.max(SystemProperties.getInt("ro.hwui.max_texture_allocation_size", DefaultSize),
            DefaultSize);
}
/** @hide */
public static final int MAX_BITMAP_SIZE = getPanelFrameSize();

/** @hide */
@Override
protected void throwIfCannotDraw(Bitmap bitmap) {
    super.throwIfCannotDraw(bitmap);
    int bitmapSize = bitmap.getByteCount();
    if (bitmapSize > MAX_BITMAP_SIZE) {
        throw new RuntimeException(
                "Canvas: trying to draw too large(" + bitmapSize + "bytes) bitmap.");
    }
}

ImageView 有 100MB 的硬限制 bitmap.getByteCount()

有没有什么方法我们可以找出 bitmap.getByteCount(),而不需要对图像文件本身执行 I/O 读取。

这将帮助我们确定如何将图像加载到 ImageView,而不会达到硬限制。

目前,在我们的数据库中,我们存储了图像文件的以下元数据。

- Image file path
- Image type (PNG or JPG)
- Image file size in byte
- Image width
- Image height

谢谢。

ImageView 内存没有真正的限制,但 loaded/decoded 位图有限制,这取决于 Device/hardware。通常它是“4096 x 4096 像素 x 4 (argb)”= 接近 70MB,但某些设备可能有 8192x8192x4。

你可以使用这个(伪代码):

options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filepath, options)
final int H = options.outHeight;
final int W = options.outWidth;

然后检查其 ColorSpace(ARGB 或只是 RGB)并乘以 W x H x 3_or_4 以获得总字节数。