国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

詳解Android Bitmap的常用壓縮方式

2019-10-22 18:17:06
字體:
來源:轉載
供稿:網友

一、前言

已經好久沒有更新博客,大概有半年了,主要是博主這段時間忙于找工作,Android崗位的工作真的是越來越難找,好不容易在廣州找到一家,主要做海外產品,公司研發實力也不錯,所以就敲定了三方協議。現在已經在公司實習了一個月多,目前主要是負責公司某個產品的內存優化,剛好就總結了一下Android Bitmap常用的優化方式。

Android中的圖片是以Bitmap方式存在的,繪制的時候也是Bitmap,直接影響到app運行時的內存,在Android,Bitmap所占用的內存計算公式是:圖片長度 x 圖片寬度 x像素點的字節數

二、圖片常用的壓縮格式

 

Enum Values  
ALPHA_8 每個像素都存儲為一個半透明(alpha)通道
ARGB_4444 此字段已在API級別13中棄用。由于此配置的質量較差,建議使用ARGB_8888
ARGB_8888 每個像素存儲在4個字節。
RGB_565 每個像素存儲在2個字節中,只有RGB通道被編碼:紅色以5位精度存儲(32個可能值),綠色以6位精度存儲(64個可能值),藍色存儲為5位精確。

 

其中字母代表的意思我們大概都可以理解,接下來我們來算算它們單個像素點的字節數:

  1. ALPHA_8:表示8位Alpha位圖,即透明度占8個位,一個像素點占用1個字節,它沒有顏色,只有透明度。
  2. ARGB_4444:表示16位ARGB位圖,即A=4,R=4,G=4,B=4,一個像素點占4+4+4+4=16位,2個字節。
  3. ARGB_8888:表示32位ARGB位圖,即A=8,R=8,G=8,B=8,一個像素點占8+8+8+8=32位,4個字節。
  4. RGB_565 :表示16位RGB位圖,即R=5,G=6,B=5,它沒有透明度,一個像素點占5+6+5=16位,2個字節

我們在做壓縮處理的時候,可以先通過改變Bitmap的圖片格式,來達到壓縮的效果,其實壓縮最主要就是要么改變其寬高,要么就通過減少其單個像素占用的內存。

三、常用的壓縮方法:

1.質量壓縮

  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是無損壓縮。

2.采樣率壓縮

  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.

3.放縮法壓縮

  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;  }

放縮法壓縮使用的是通過矩陣對圖片進行裁剪,也是通過縮放圖片尺寸,來達到壓縮圖片的效果,和采樣率的原理一樣。

4.RGB_565壓縮

  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將節省一半的內存開銷。

5.createScaledBitmap

  private void compressScaleBitmap() {    Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.test);    mSrcBitmap = Bitmap.createScaledBitmap(bm, 600, 900, true);    bm = null;  }

將圖片的大小壓縮成用戶的期望大小,來減少占用內存。

四、效果圖

Android,Bitmap壓縮,Bitmap壓縮方式

五、總結

以上5種就是我們常用的壓縮方法了,這里的壓縮也只是針對在運行加載的bitmap占用內存的大小。我們在做App內存優化的時候,一般可以從這兩個方面入手,一個內存泄漏,另外一個是Bitmap壓縮了,在要求像素不高的情況下,可以對Bitmap進行壓縮,并且針對一些只使用一次的bitmap,要做好recycle的處理。

源碼地址:https://github.com/codingma/BitmapCompress

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阳朔县| 崇阳县| 菏泽市| 泰来县| 新余市| 武鸣县| 安多县| 安义县| 白玉县| 图木舒克市| 高台县| 班玛县| 罗田县| 克什克腾旗| 涿鹿县| 高密市| 石楼县| 彭州市| 大港区| 义乌市| 和田市| 丰镇市| 田林县| 洱源县| 泽普县| 望谟县| 饶平县| 津南区| 班玛县| 镇江市| 临潭县| 邻水| 通榆县| 栾川县| 石台县| 巍山| 苏尼特左旗| 闻喜县| 新巴尔虎右旗| 宁晋县| 关岭|