上次研究了安卓下面圖片通過縮放改變大小,這個變化是非常明顯,但是失幀的情況也挺嚴重,這次主要是研究一下如何在不失幀的情況下壓縮圖片,
一、基礎知識
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