亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解Android Bitmap的常用壓縮方式

 更新時間:2018年01月12日 15:55:44   作者:SeanMa  
這篇文章主要介紹了詳解Android Bitmap的常用壓縮方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、前言

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

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

二、圖片常用的壓縮格式

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

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

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

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

三、常用的壓縮方法:

1.質(zhì)量壓縮

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

質(zhì)量壓縮不會減少圖片的像素,它是在保持像素的前提下改變圖片的位深及透明度,來達到壓縮圖片的目的,圖片的長,寬,像素都不會改變,那么bitmap所占內(nèi)存大小是不會變的。

我們可以看到有個參數(shù):quality,可以調(diào)節(jié)你壓縮的比例,但是還要注意一點就是,質(zhì)量壓縮堆png格式這種圖片沒有作用,因為png是無損壓縮。

2.采樣率壓縮

  private void compressSampling() {
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 2;
    mSrcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test, options);
  }

采樣率壓縮其原理其實也是縮放bitamp的尺寸,通過調(diào)節(jié)其inSampleSize參數(shù),比如調(diào)節(jié)為2,寬高會為原來的1/2,內(nèi)存變回原來的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);
  }

這是通過壓縮像素占用的內(nèi)存來達到壓縮的效果,一般不建議使用ARGB_4444,因為畫質(zhì)實在是辣雞,如果對透明度沒有要求,建議可以改成RGB_565,相比ARGB_8888將節(jié)省一半的內(nèi)存開銷。

5.createScaledBitmap

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

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

四、效果圖


五、總結(jié)

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

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android實現(xiàn)截圖分享qq 微信功能

    Android實現(xiàn)截圖分享qq 微信功能

    在日常生活中,經(jīng)常用到qq,微信截圖分享功能,今天小編通過本文給大家介紹Android實現(xiàn)截圖分享qq 微信功能,具體實現(xiàn)代碼大家參考下本文
    2017-12-12
  • Android實現(xiàn)點擊AlertDialog上按鈕時不關閉對話框的方法

    Android實現(xiàn)點擊AlertDialog上按鈕時不關閉對話框的方法

    這篇文章主要介紹了Android實現(xiàn)點擊AlertDialog上按鈕時不關閉對話框的方法,涉及設置監(jiān)聽的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • android實現(xiàn)簡單的活動轉(zhuǎn)盤

    android實現(xiàn)簡單的活動轉(zhuǎn)盤

    這篇文章主要為大家詳細介紹了android實現(xiàn)簡單的活動轉(zhuǎn)盤,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Android顏色配置器配置方法

    Android顏色配置器配置方法

    這篇文章主要介紹了Android顏色配置器配置方法,非常不錯,具有參考解決價值,需要的朋友可以參考下
    2018-04-04
  • Flutter質(zhì)感設計之列表項

    Flutter質(zhì)感設計之列表項

    這篇文章主要為大家詳細介紹了Flutter質(zhì)感設計之列表項,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • android okhttp的基礎使用【入門推薦】

    android okhttp的基礎使用【入門推薦】

    本文主要總結(jié)了Android著名網(wǎng)絡框架-okhttp的基礎使用。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • 詳解Android四種存儲方式

    詳解Android四種存儲方式

    在Android程序開發(fā)中我們經(jīng)常遇到四種數(shù)據(jù)存儲方式,每種存儲方式都各不相同,下面通過本篇文章給大家介紹android四種存儲方式,對此感興趣的朋友一起學習吧
    2015-12-12
  • Android中捕獲TTextView文本中的鏈接點擊事件方法

    Android中捕獲TTextView文本中的鏈接點擊事件方法

    這篇文章主要介紹了Android中捕獲TTextView文本中的鏈接點擊事件方法,本文給出了實現(xiàn)代碼和使用方法以及實現(xiàn)自己控制的方法,需要的朋友可以參考下
    2015-01-01
  • android讀取raw文件示例

    android讀取raw文件示例

    這篇文章主要介紹了android讀取raw文件示例,需要的朋友可以參考下
    2014-02-02
  • android編程實現(xiàn)sd卡讀取數(shù)據(jù)庫的方法

    android編程實現(xiàn)sd卡讀取數(shù)據(jù)庫的方法

    這篇文章主要介紹了android編程實現(xiàn)sd卡讀取數(shù)據(jù)庫的方法,涉及Android權(quán)限控制及針對sd卡與數(shù)據(jù)庫的相關操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11

最新評論