記憶體最佳化:顯示大圖

來源:互聯網
上載者:User

Java代碼 
public Bitmap optimizeBitmap(byte[] source, int maxWidth, int maxHeight) { 
    Bitmap result = null; 
    int length = source.length; 
    BitmapFactory.Options options = new BitmapFactory.Options();     
    options.inJustDecodeBounds = true; 
    result = BitmapFactory.decodeByteArray(source, 0, length, options); 
    int widthRatio = (int) Math.ceil(options.outWidth / maxWidth); 
    int heightRatio = (int) Math.ceil(options.outHeight / maxHeight); 
    if(widthRatio > 1 || heightRatio > 1) { 
        if(widthRatio > heightRatio) { 
            options.inSampleSize = widthRatio; 
        } else { 
            options.inSampleSize = heightRatio; 
        } 
    } 
    options.inJustDecodeBounds = false; 
    result = BitmapFactory.decodeByteArray(source, 0, length, options); 
    return result; 

 
 
Android Emulator的記憶體只有8M,當需要顯示較多大圖時,極易拋出“bitmap size exceeds VM budget ”的異常。
BitmapFactory.Options的公有boolean型成員變數inJustDecodeBounds,當值設定為true時,解碼器返回NULL,我們可以在映像未載入記憶體的情況下查詢映像。
範例程式碼中,我們通過Options對象執行個體options獲得了映像的寬度和高度。
BitmapFactory.Options的公有int型成員變數inSampleSize用於設定映像的縮小比例,例如當inSampleSize設定為4時,編碼器將返回原始1/4大小的映像。
 
注意:需要編碼器返回映像時,記得將inJustDecodeBounds的值設為false。

作者“Dyingbleed”
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.