已經很久沒有更新博客,大概有半年了,主要是博主這段時間忙於找工做,Android崗位的工做真的是愈來愈難找,好不容易在廣州找到一家,主要作海外產品,公司研發實力也不錯,因此就敲定了三方協議。如今已經在公司實習了一個月多,目前主要是負責公司某個產品的內存優化,恰好就總結了一下Android Bitmap經常使用的優化方式。git
Android中的圖片是以Bitmap方式存在的,繪製的時候也是Bitmap,直接影響到app運行時的內存,在Android,Bitmap所佔用的內存計算公式是:圖片長度 x 圖片寬度 x像素點的字節數github
Enum Values | |
---|---|
ALPHA_8 | 每一個像素都存儲爲一個半透明(alpha)通道 |
ARGB_4444 | 此字段已在API級別13中棄用。因爲此配置的質量較差,建議使用ARGB_8888 |
ARGB_8888 | 每一個像素存儲在4個字節。 |
RGB_565 | 每一個像素存儲在2個字節中,只有RGB通道被編碼:紅色以5位精度存儲(32個可能值),綠色以6位精度存儲(64個可能值),藍色存儲爲5位精確。 |
其中字母表明的意思咱們大概均可以理解,接下來咱們來算算它們單個像素點的字節數:bash
咱們在作壓縮處理的時候,能夠先經過改變Bitmap的圖片格式,來達到壓縮的效果,其實壓縮最主要就是要麼改變其寬高,要麼就經過減小其單個像素佔用的內存。app
private void compressQuality() {
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.test);
mSrcSize = bm.getByteCount() + "byte";
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);
byte[] bytes = bos.toByteArray();
mSrcBitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}
複製代碼
質量壓縮不會減小圖片的像素,它是在保持像素的前提下改變圖片的位深及透明度,來達到壓縮圖片的目的,圖片的長,寬,像素都不會改變,那麼bitmap所佔內存大小是不會變的。優化
咱們能夠看到有個參數:quality,能夠調節你壓縮的比例,可是還要注意一點就是,質量壓縮堆png格式這種圖片沒有做用,由於png是無損壓縮。編碼
private void compressSampling() {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
mSrcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test, options);
}
複製代碼
採樣率壓縮其原理其實也是縮放bitamp的尺寸,經過調節其inSampleSize參數,好比調節爲2,寬高會爲原來的1/2,內存變回原來的1/4.spa
private void compressMatrix() {
Matrix matrix = new Matrix();
matrix.setScale(0.5f, 0.5f);
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.test);
mSrcBitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);
bm = null;
}
複製代碼
放縮法壓縮使用的是經過矩陣對圖片進行裁剪,也是經過縮放圖片尺寸,來達到壓縮圖片的效果,和採樣率的原理同樣。code
private void compressRGB565() {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
mSrcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test, options);
}
複製代碼
這是經過壓縮像素佔用的內存來達到壓縮的效果,通常不建議使用ARGB_4444,由於畫質實在是辣雞,若是對透明度沒有要求,建議能夠改爲RGB_565,相比ARGB_8888將節省一半的內存開銷。orm
private void compressScaleBitmap() {
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.test);
mSrcBitmap = Bitmap.createScaledBitmap(bm, 600, 900, true);
bm = null;
}
複製代碼
將圖片的大小壓縮成用戶的指望大小,來減小佔用內存。cdn
以上5種就是咱們經常使用的壓縮方法了,這裏的壓縮也只是針對在運行加載的bitmap佔用內存的大小。咱們在作App內存優化的時候,通常能夠從這兩個方面入手,一個內存泄漏,另一個是Bitmap壓縮了,在要求像素不高的狀況下,能夠對Bitmap進行壓縮,而且針對一些只使用一次的bitmap,要作好recycle的處理。
博客就寫到這裏,如下是源碼地址。 ·