1. 程式人生 > >如何優化圖片佔用的記憶體空間?

如何優化圖片佔用的記憶體空間?

對於載入圖片,一般為了儘可能避免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 實現 平移,旋轉等等。

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);