基于
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.");
}
}
有一個 100MB 的硬性bitmap.getByteCount()限制ImageView。
我們有什么辦法可以弄清楚bitmap.getByteCount(),而不對影像檔案本身執行 I/O 讀取。
這將幫助我們確定我們希望如何將影像加載到ImageView中,而不會達到硬限制。
目前,在我們的資料庫中,我們存盤了影像檔案的以下元資料。
- Image file path
- Image type (PNG or JPG)
- Image file size in byte
- Image width
- Image height
謝謝。
uj5u.com熱心網友回復:
ImageView 記憶體沒有真正的限制,但加載/解碼的位圖有限制,它取決于設備/硬體。通常它是“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)并 moltiply W x H x 3_or_4 以獲得總位元組數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/450093.html
