android 下圖片的Bitmap.compress()佔用內存的大小分析

       上次研究了安卓下面圖片通過縮放改變大小,這個變化是非常明顯,但是失幀的情況也挺嚴重,這次主要是研究一下如何在不失幀的情況下壓縮圖片,

     一、基礎知識

           1.1如果使用BitmapFactory.decodeResource()圖片後會對圖片進行縮放,造成圖片變大的問題

                   圖片在windows下顯示大小爲大概是374k(374,077 字節),在通過BitmapFactory.decodeResource()加載後分爲以下兩種情況

                  1.1.1、如果options.inScaled=false;表示使用原圖大小,在內存中佔用的空間是3.68M(3686400字節)

                  1.1.2、如果使用options.inScaled=true;則安卓系統會根據當前所在的hdpi中用到的比例,對圖片進行縮放,如果圖片小於當前的尺寸則會放大,如果大於則會縮小,這樣子小的圖片會被放大8.29M(8294400)

         1.2 舉例說明:

                  我的圖片在windows上顯示爲374k字節,寬爲720,高爲1280,如果放到了xhdpi文件夾下,如果使用第一種寬度和高度不變,佔用內存3.68M,如果使用第二種方法,寬爲1080,高爲1920,大小爲8.29M,這也和手機的分辨率有關係。

這是根據options.inScaled=true時,對圖片進行縮放時的對比

圖片格式 圖片存儲大小 圖片寬和高 手機mDensity 存放位置 安卓中分配內存大小
jpg 365k 720*1280 320 xhdpi 720*1280 3,686,400
jpg 365k 720*1280 480 xhdpi 1080*1920 8,294,400
           

     二、壓縮算法(compress壓縮是存儲壓縮,不是內存壓縮,所以在內存中並沒有改變大小)

           2.1、使用Bitmap.compress()進行壓縮,壓縮的格式爲PNG,如果圖片質量是60大小爲2.3M,如果質量是20大小爲1.3M

           2.2、使用Bitmap.compress()進行壓縮,壓縮的格式爲JPEG,如果圖片質量是60大小爲98.6K

所以目前得出的結論是質量壓縮對於內存來說是沒有用的

 

   三、 android studio 圖片內存佔用分析

 下面是我對這個jpg圖片的內存監控,這個圖片是放到了一個ImageQualityActivity類中,然後在初始化時加載圖片,我一共點了三次ImageQualityActivity的打開,並點擊了返回按鈕 ,並在onDestroy中調用了圖片的回收方法,可是監控到仍然是三個圖片,在內存中並沒有立即回收(將不用的對象顯式地設爲null,有利於GC收集器判定垃圾,從而提高了GC的效率),這應該涉及到安卓的回收算法。需要到一定內存數量纔去回收。

  BitmapFactory.Options options = new BitmapFactory.Options();
            //設置壓縮的尺寸,值爲2的冪次方,如果爲1表示不壓縮
            options.inSampleSize = 1;

            tagBitmap = BitmapFactory.decodeStream(getAssets().open("bg"), null, options);
            ByteArrayOutputStream stream = new ByteArrayOutputStream();


            tagBitmap.compress(Bitmap.CompressFormat.JPEG, 60, stream);
            tagBitmap.recycle();

回收圖片的代碼段

   @Override
    protected void onDestroy() {
        tagBitmap=null;
        super.onDestroy();
    }

 

  四、android下的內存優化

      只能在加載圖片時的Options上下功夫了

一、如果圖片非常大,建議還是先進行綻放吧,這個畢竟是改變圖片最有效的方法了

    //設置壓縮的尺寸,值爲2的冪次方,如果爲1表示不壓縮
            options.inSampleSize = 1;

         二、如果自己知道圖片的大小(比如資源文件),並且不是很大,Options.inScaled=false,這樣子,可以避免根據手機的不同來自動縮放在內存中的大小,

 

 

 

 

 

參考:

https://segmentfault.com/q/1010000007053170/a-1020000007074735

內存分析工具http://www.cnblogs.com/keke-xiaoxiami/p/6187864.html

圖片查看工具https://www.jianshu.com/p/cdf185ca9045

Bitmap爲null的描述https://blog.csdn.net/a2241076850/article/details/52221701

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章