如何優化圖片佔用的記憶體空間?
阿新 • • 發佈:2019-01-09
對於載入圖片,一般為了儘可能避免OOM都會按照如下做法:
對於圖片顯示:根據需要顯示圖片控制元件的大小對圖片進行壓縮顯示(取樣率inSampleSize及矩陣Matrix)。 如果圖片數量非常多:則會使用LruCache等快取機制,將所有圖片佔據的內容維持在一個範圍內。
其實對於圖片載入還有種情況,就是單個圖片非常巨大,並且還不允許壓縮。比如顯示:世界地圖、清明上河圖等。
需要使用Android系統自帶的BitmapRegionDecoder。
1 矩陣Matrix 實列程式碼 ps:使用Matrix進行放大,雖然影象大了,但並沒有佔用更多的記憶體。
放大縮小
private Bitmap imageSale(Bitmap b,float salex, float saley){
Matrix matrix = new Matrix();
matrix.postScale(salex,saley);
return Bitmap.createBitmap(b,0,0,b.getWidth(),b.getHeight(),matrix,true);
}
還有利用 Matrix 實現 平移,旋轉等等。
2 BitmapRegionDecoder 簡單例子。在此基礎上可以進行圖片的拖拽,放大縮小。
InputStream inputStream = getAssets().open(tangyan.jpg); //獲得圖片的寬、高 BitmapFactory.Options tmpOptions = new BitmapFactory.Options(); tmpOptions.inJustDecodeBounds = true; BitmapFactory.decodeStream(inputStream, null, tmpOptions); int width = tmpOptions.outWidth; int height = tmpOptions.outHeight; //設定顯示圖片的中心區域 BitmapRegionDecoder bitmapRegionDecoder = BitmapRegionDecoder.newInstance(inputStream, false); BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = Bitmap.Config.RGB_565; Bitmap bitmap = bitmapRegionDecoder.decodeRegion(new Rect(width / 2 - 100, height / 2 - 100, width / 2 + 100, height / 2 + 100), options); mImageView.setImageBitmap(bitmap);