2012-04-14 96 views
1

我有一個168.2KB和1991x1756的PNG圖像,並嘗試使用BitmapFactory.decodeStream()將它導入Bitmap。問題是我遇到了OutOfMemoryError,其中Bitmap大小最終爲13,657KB。
我不明白爲什麼文件在導入後如此之大,以及如何緩解這種情況。
似乎這個OutOfMemoryError問題與解碼的Bitmap圖像很常見,但無法找到解決問題的方法。有任何想法嗎?BitmapFactory.decodeStream()返回一個比原始圖像大100倍的位圖

Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, bitmapOptions);

E/AndroidRuntime(10744): java.lang.OutOfMemoryError: bitmap size exceeds VM budget(Heap Size=7815KB, Allocated=3279KB, Bitmap Size=13657KB)

回答

4

一個PNG文件被高度壓縮,這意味着磁盤上的文件大小遠遠小於當它包含的所有數據被加載到內存中的那樣。
位圖是一個非常簡單的圖像表示形式,其中每個像素都由一個值表示。此值的大小取決於當前的設置(您可能已經聽說過32位圖像,16位圖像或一些常見尺寸的8位圖像)。

要計算以位圖表示的圖像的真實大小,必須計算像素數,並將其與每個像素的位數相乘。
您的圖像是1991x1756像素(像素總數)。如果使用ARGB_8888格式(每個顏色一個字節/每個像素一個字節=每個像素4個字節)加載位圖,則會以3 496 196 * 4 =13 984 784字節結束。

您可以通過使用較少的字節/通道(例如RGB_565)來減小總大小,但這也會降低圖像的質量。更好的選擇很可能是減小圖像的大小,或者使用BitmapFactory.Options中的inSampleSize參數導入它們以加載較小的圖像。

1

我相信PNG圖像高度壓縮,但在Android的位圖有每像素4個字節(ARGB)不會被壓縮

所以1991 * 1756 *( 4字節)約爲13657 KB

因此,請嘗試使用較小的圖像或採樣大小選項以減小大小。

在這篇文章請看: Decoding bitmaps in Android with the right size

相關問題