Android有效處理Bitmap,減少記憶體

來源:互聯網
上載者:User

標籤:bitmap   outofmemory   記憶體   溢出   效能   

Android有效處理Bitmap,減少記憶體

  圖片可能會有不同的大小。在許多情況下,圖片的大小會超出我們需要的大小。例如,我們的Camera應用,我們所拍的照片的大小遠大於螢幕顯示的大小

  假如你的應用被限制了記憶體使用量,顯而易見,你會選擇載入一個低解析度的圖片。這張低解析度的圖片應該匹配螢幕的尺寸。更高解析度的映像沒有提供任何可見的好處,但仍佔用寶貴的記憶體,而且由於額外的動態縮放,會帶來額外的效能開銷。

  本篇文章教你通過載入一個小尺寸的圖片樣本,來修飾一張大圖,並且沒有超過應用的記憶體限制。

原文地址http://wear.techbrood.com/training/displaying-bitmaps/load-bitmap.html

擷取圖片的類型尺寸  BitmapFactory這個類提供了幾種解碼方法(例如:decodeByteArray(),decodeFile(),decodeResource());我們在載入圖片的額時候,圖片可能有很多種來源,我們選擇合適的一種方法解碼圖片。下面提供了方法:為已經建立好的Bitmap重新分配記憶體,這樣就可以很好的解決記憶體溢出(OutOfMemory Exception) 的問題。每種解碼方法都有一些標識位,你可以通過配置BitmapFactory.Options這些標識位來實現。設定inJustDecodeBounds的屬性為true的時候,我們解碼的時候不分配記憶體,返回的Bitmap為null,但是我們設定了outWidth,outHeight和outMimeType。這種技術可以預先擷取到Bitmap的大小資料和類型資料。
BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;BitmapFactory.decodeResource(getResources(), R.id.myimage, options);int imageHeight = options.outHeight;int imageWidth = options.outWidth;String imageType = options.outMimeType;
  為了避免 java.lang.OutOfMemory exceptions,在解碼圖片之前,預先檢查Bitmap的大小,除非你有絕對的把握你的bitmap有合適的大小,並且在記憶體限制大小範圍之內。
載入縮放的圖片到記憶體  現在,我們知道了圖片的尺寸,我們就可以決定是使用該尺寸的圖片,還是使用另外一個樣本。線面有一些因素是我們要注意的:
  •   估計載入整個映像所佔用的記憶體
  •  你可以接收的記憶體使用量量和你程式可以使用的記憶體
  •  你放該圖片的ImageView的尺寸或者其他UI組件的尺寸
  •  螢幕的大小
  例如,我們不值得將大小為1024x768 pixel的圖片放到128*96 pixel的縮圖控制項(ImageVIew)裡面。  我們得使用圖片的一個更小的樣本載入到記憶體裡面,在BitmapFactory.Options裡面設定inSampleSize為true。例如,我們想把一張2048*1536的圖片解碼為只有1/4大小的圖片512*384,載入到記憶體裡賣年只有0.75MB的大小,遠遠小宇原圖12MB的大小(使用ARGB_8888通道的圖片)。這裡有一種計算樣本圖片的方法,根據靶心圖表片的寬度和高度width和height:
public static int calculateInSampleSize(            BitmapFactory.Options options, int reqWidth, int reqHeight) {    // Raw height and width of image    final int height = options.outHeight;    final int width = options.outWidth;    int inSampleSize = 1;    if (height > reqHeight || width > reqWidth) {        final int halfHeight = height / 2;        final int halfWidth = width / 2;        // Calculate the largest inSampleSize value that is a power of 2 and keeps both        // height and width larger than the requested height and width.        while ((halfHeight / inSampleSize) > reqHeight                && (halfWidth / inSampleSize) > reqWidth) {            inSampleSize *= 2;        }    }    return inSampleSize;}

Note: A power of two value is calculated because the decoder uses a final value by rounding down to the nearest power of two, as per the inSampleSize documentation.

我們在使用該方法的時候,首先設定 inJustDecodeBounds為true,然後我們計算inSample的值,然後設定inJustDecodeBounds為false,最後解碼圖片
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,        int reqWidth, int reqHeight) {    // First decode with inJustDecodeBounds=true to check dimensions    final BitmapFactory.Options options = new BitmapFactory.Options();    options.inJustDecodeBounds = true;    BitmapFactory.decodeResource(res, resId, options);    // Calculate inSampleSize    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);    // Decode bitmap with inSampleSize set    options.inJustDecodeBounds = false;    return BitmapFactory.decodeResource(res, resId, options);}

 這種方法可以協助我們輕鬆有效載入一張100*100的縮圖片:
mImageView.setImageBitmap(    decodeSampledBitmapFromResource(getResources(), R.id.myimage, 100, 100));

  你也可以通過相同的方法解碼一張從其他路徑擷取到的圖片,通過使用 BitmapFactory.decode* as need。 下面還有幾篇從android Developer上面翻譯過來的,感覺挺有用的,加個關注吧,(*^__^*) 嘻嘻 

Android有效處理Bitmap,減少記憶體

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.