Bitmap降低內(nèi)存使用方式

bitmap是每個(gè)Android都會(huì)接觸到的,雖然大部分情況下我們都會(huì)用圖片框架來(lái)加載圖片如glide,fresco等。當(dāng)然推薦都使用對(duì)應(yīng)框架來(lái)加載,官方也推薦使用glide來(lái)加載。

偶爾有時(shí)候我們也會(huì)直接從資源里加載,沒(méi)用框架去加載它常用是從BitmapFactory類的三方方式來(lái)獲取bitmap。

一. 采用適當(dāng)壓縮降低內(nèi)存使用

  1. decodeByteArray(),從byte數(shù)組中解析出bitmap
Bitmap bitmap = BitmapFactory.decodeByteArray(imgByte, 0, imgByte.length);
  1. decodeFile(),從指定文件路徑解析出bitmap
Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
  1. decodeResource(), 從資源文件中解析出bitmap
Bitmap bitmap = BitmapFactory.decodeResource(res, resId);

初此之外,我們還可以在方法最后加一個(gè)BitmapFactory.Options參數(shù),該參數(shù)會(huì)用于指定操作,比如縮放啊,抖動(dòng)啊,寬高。

在我們沒(méi)有指定option的時(shí)候,默認(rèn)是沒(méi)有這些處理的,會(huì)直接加載,在內(nèi)存比較小的機(jī)器上,就可能出現(xiàn)OOM了,而且也造成了內(nèi)存浪費(fèi),一個(gè)大分辨率的圖片,沒(méi)必要在一個(gè)小控件上完全展示,看起來(lái)也并沒(méi)有特別的優(yōu)點(diǎn)。所以咱們可以根據(jù)展示控件寬高來(lái)選擇解析出的圖片大小縮放,達(dá)到適度的降低內(nèi)存使用。

  1. 處理方式:
/**
     * 從資源文件中獲取壓縮后的bitmap,根據(jù)寬高方式壓縮
     *
     * @param res       資源
     * @param resId     資源id
     * @param reqWidth  需要的寬度
     * @param reqHeight 需要的高度
     * @return 壓縮后的bitmap
     */
    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);

        Log.i(TAG, "inSampleSize:" + options.inSampleSize);
        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeResource(res, resId, options);
    }
    
    /**
     * 計(jì)算壓縮大小
     *
     * @param options
     * @param reqWidth
     * @param reqHeight
     * @return
     */
    private 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;
    }

參考自官方文檔:
有效裝載大圖

二. 采用重用降低內(nèi)存分配

通過(guò)設(shè)置inBitmap參數(shù),達(dá)到可以重用效果。記錄下,不多講,官方貌似也不推薦使用,地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容