有没有办法根据图像的宽度、高度和文件大小来确定Bitmap.getByteCount?
Is there a way to determine Bitmap.getByteCount based on the image width, height and file size?
基于
/** @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 以获得总字节数。
基于
/** @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 以获得总字节数。