最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android實(shí)現(xiàn)圖片壓縮(bitmap的六種壓縮方式)

 更新時(shí)間:2017年02月06日 10:49:02   作者:HarryWeasley  
Android中圖片是以bitmap形式存在的,這篇文章主要介紹了Android實(shí)現(xiàn)圖片壓縮(bitmap的六種壓縮方式),有興趣的可以了解一下。

Android中圖片是以bitmap形式存在的,那么bitmap所占內(nèi)存,直接影響到了應(yīng)用所占內(nèi)存大小,首先要知道bitmap所占內(nèi)存大小計(jì)算方式:

圖片長度 x 圖片寬度 x 一個(gè)像素點(diǎn)占用的字節(jié)數(shù)

以下是圖片的壓縮格式:

這里寫圖片描述

其中,A代表透明度;R代表紅色;G代表綠色;B代表藍(lán)色。

ALPHA_8

表示8位Alpha位圖,即A=8,一個(gè)像素點(diǎn)占用1個(gè)字節(jié),它沒有顏色,只有透明度

ARGB_4444

表示16位ARGB位圖,即A=4,R=4,G=4,B=4,一個(gè)像素點(diǎn)占4+4+4+4=16位,2個(gè)字節(jié)

ARGB_8888

表示32位ARGB位圖,即A=8,R=8,G=8,B=8,一個(gè)像素點(diǎn)占8+8+8+8=32位,4個(gè)字節(jié)

RGB_565

表示16位RGB位圖,即R=5,G=6,B=5,它沒有透明度,一個(gè)像素點(diǎn)占5+6+5=16位,2個(gè)字節(jié)

我是用的小米手機(jī)2s來測試的,從sd卡取出一個(gè)照片,如下所示:

bit = BitmapFactory.decodeFile(Environment
        .getExternalStorageDirectory().getAbsolutePath()
        + "/DCIM/Camera/test.jpg");

    Log.i("wechat", "壓縮前圖片的大小" + (bit.getByteCount() / 1024 / 1024)
        + "M寬度為" + bit.getWidth() + "高度為" + bit.getHeight());

出來的log是:

這里寫圖片描述

將取得的bitmap進(jìn)行壓縮,下面開始說,bitmap的幾種壓縮方式。

1.質(zhì)量壓縮

      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      int quality = Integer.valueOf(editText.getText().toString());
      bit.compress(CompressFormat.JPEG, quality, baos);
      byte[] bytes = baos.toByteArray();
      bm = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
      Log.i("wechat", "壓縮后圖片的大小" + (bm.getByteCount() / 1024 / 1024)
          + "M寬度為" + bm.getWidth() + "高度為" + bm.getHeight()
          + "bytes.length= " + (bytes.length / 1024) + "KB"
          + "quality=" + quality);

其中quality是從edittext獲取的數(shù)字,可以從0–100改變,這里出來的log是:

這里寫圖片描述

可以看到,圖片的大小是沒有變的,因?yàn)橘|(zhì)量壓縮不會減少圖片的像素,它是在保持像素的前提下改變圖片的位深及透明度等,來達(dá)到壓縮圖片的目的,這也是為什么該方法叫質(zhì)量壓縮方法。那么,圖片的長,寬,像素都不變,那么bitmap所占內(nèi)存大小是不會變的。

但是我們看到bytes.length是隨著quality變小而變小的。這樣適合去傳遞二進(jìn)制的圖片數(shù)據(jù),比如微信分享圖片,要傳入二進(jìn)制數(shù)據(jù)過去,限制32kb之內(nèi)。

這里要說,如果是bit.compress(CompressFormat.PNG, quality, baos);這樣的png格式,quality就沒有作用了,bytes.length不會變化,因?yàn)閜ng圖片是無損的,不能進(jìn)行壓縮。

CompressFormat還有一個(gè)屬性是,CompressFormat.WEBP格式,該格式是google自己推出來一個(gè)圖片格式,更多信息,文末會貼出地址。

2.采樣率壓縮

BitmapFactory.Options options = new BitmapFactory.Options();
      options.inSampleSize = 2;

      bm = BitmapFactory.decodeFile(Environment
          .getExternalStorageDirectory().getAbsolutePath()
          + "/DCIM/Camera/test.jpg", options);
      Log.i("wechat", "壓縮后圖片的大小" + (bm.getByteCount() / 1024 / 1024)
          + "M寬度為" + bm.getWidth() + "高度為" + bm.getHeight());

出來的log是

這里寫圖片描述

設(shè)置inSampleSize的值(int類型)后,假如設(shè)為2,則寬和高都為原來的1/2,寬高都減少了,自然內(nèi)存也降低了。

我上面的代碼沒用過options.inJustDecodeBounds = true; 因?yàn)槲沂枪潭▉砣拥臄?shù)據(jù),為什么這個(gè)壓縮方法叫采樣率壓縮,是因?yàn)榕浜蟟nJustDecodeBounds,先獲取圖片的寬、高【這個(gè)過程就是取樣】,然后通過獲取的寬高,動(dòng)態(tài)的設(shè)置inSampleSize的值。

當(dāng)inJustDecodeBounds設(shè)置為true的時(shí)候,BitmapFactory通過decodeResource或者decodeFile解碼圖片時(shí),將會返回空(null)的Bitmap對象,這樣可以避免Bitmap的內(nèi)存分配,但是它可以返回Bitmap的寬度、高度以及MimeType。

3.縮放法壓縮(martix)

Matrix matrix = new Matrix();
      matrix.setScale(0.5f, 0.5f);
      bm = Bitmap.createBitmap(bit, 0, 0, bit.getWidth(),
          bit.getHeight(), matrix, true);
      Log.i("wechat", "壓縮后圖片的大小" + (bm.getByteCount() / 1024 / 1024)
          + "M寬度為" + bm.getWidth() + "高度為" + bm.getHeight());

出來的log是

這里寫圖片描述

可以看出來,bitmap的長度和寬度分別縮小了一半,圖片大小縮小了四分之一。

關(guān)于martix更多信息,文末會有一個(gè)參考文章。

4.RGB_565法

BitmapFactory.Options options2 = new BitmapFactory.Options();
      options2.inPreferredConfig = Bitmap.Config.RGB_565;

      bm = BitmapFactory.decodeFile(Environment
          .getExternalStorageDirectory().getAbsolutePath()
          + "/DCIM/Camera/test.jpg", options2);
      Log.i("wechat", "壓縮后圖片的大小" + (bm.getByteCount() / 1024 / 1024)
          + "M寬度為" + bm.getWidth() + "高度為" + bm.getHeight());

出來的log是:

這里寫圖片描述

我們看到圖片大小直接縮小了一半,長度和寬度也沒有變,相比argb_8888減少了一半的內(nèi)存。

注意:由于ARGB_4444的畫質(zhì)慘不忍睹,一般假如對圖片沒有透明度要求的話,可以改成RGB_565,相比ARGB_8888將節(jié)省一半的內(nèi)存開銷。

5.createScaledBitmap

bm = Bitmap.createScaledBitmap(bit, 150, 150, true);
      Log.i("wechat", "壓縮后圖片的大小" + (bm.getByteCount() / 1024) + "KB寬度為"
          + bm.getWidth() + "高度為" + bm.getHeight());

出來的log是

這里寫圖片描述

這里是將圖片壓縮成用戶所期望的長度和寬度,但是這里要說,如果用戶期望的長度和寬度和原圖長度寬度相差太多的話,圖片會很不清晰。

總結(jié)

以上就是5種圖片壓縮的方法,這里需要強(qiáng)調(diào),他們的壓縮僅僅只是對android中的bitmap來說的。如果將這些壓縮后的bitmap另存為sd中,他們的內(nèi)存大小并不一樣。

android手機(jī)中,圖片的所占的內(nèi)存大小和很多因素相關(guān),計(jì)算起來也很麻煩。為了計(jì)算出一個(gè)圖片的內(nèi)存大小,可以將圖片當(dāng)做一個(gè)文件來間接計(jì)算,用如下的方法:

 File file = new File(Environment.getExternalStorageDirectory()
     .getAbsolutePath() + "/DCIM/Camera/test.jpg");
     Log.i("wechat", "file.length()=" + file.length() / 1024);

或者

FileInputStream fis = null;
    try {
      fis = new FileInputStream(file);
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }
    try {
      Log.i("wechat", "fis.available()=" + fis.available() / 1024);
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

上面兩個(gè)方法計(jì)算的結(jié)果是一樣的。

看完了這篇內(nèi)容,其實(shí)說白了,Bitmap壓縮都是圍繞這個(gè)來做文章:Bitmap所占用的內(nèi)存 = 圖片長度 x 圖片寬度 x 一個(gè)像素點(diǎn)占用的字節(jié)數(shù)。3個(gè)參數(shù),任意減少一個(gè)的值,就達(dá)到了壓縮的效果。

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

相關(guān)文章

  • Android 自定義view實(shí)現(xiàn)水波紋動(dòng)畫效果

    Android 自定義view實(shí)現(xiàn)水波紋動(dòng)畫效果

    這篇文章主要介紹了 Android 自定義view實(shí)現(xiàn)水波紋動(dòng)畫效果的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-01-01
  • monkeyrunner之夜神模擬器的安裝與使用(2)

    monkeyrunner之夜神模擬器的安裝與使用(2)

    這篇文章主要為大家詳細(xì)介紹了monkeyrunner之夜神模擬器安裝與使用的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • android 實(shí)現(xiàn)側(cè)邊彈窗特效代碼

    android 實(shí)現(xiàn)側(cè)邊彈窗特效代碼

    側(cè)邊彈窗是在左邊,需要定位好位置,實(shí)現(xiàn)原理其實(shí)就是進(jìn)出動(dòng)效,用位移加透明度效果來控制,下面通過代碼給大家介紹android 實(shí)現(xiàn)側(cè)邊彈窗,需要的朋友參考下吧
    2021-06-06
  • Android實(shí)現(xiàn)仿今日頭條點(diǎn)贊動(dòng)畫效果實(shí)例

    Android實(shí)現(xiàn)仿今日頭條點(diǎn)贊動(dòng)畫效果實(shí)例

    我想看到今日頭條的點(diǎn)贊效果,應(yīng)該都覺得很絢麗吧,下面這篇文章主要給大家介紹了關(guān)于Android實(shí)現(xiàn)仿今日頭條點(diǎn)贊動(dòng)畫效果的相關(guān)資料,文中通過示例代價(jià)介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02
  • 詳解Android中BroadCastReceiver組件

    詳解Android中BroadCastReceiver組件

    這篇文章主要為大家詳細(xì)介紹了Android中BroadCastReceiver組件,Broadcast Receiver是Android的五大組件之一,使用頻率也很高,用于異步接收廣播Intent,感興趣的小伙伴們可以參考一下
    2016-02-02
  • android AsynTask處理返回?cái)?shù)據(jù)和AsynTask使用get,post請求

    android AsynTask處理返回?cái)?shù)據(jù)和AsynTask使用get,post請求

    本文主要介紹了android AsynTask處理返回?cái)?shù)據(jù)和AsynTask使用get,post請求方法。具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • Android開發(fā)Jetpack組件DataBinding用例詳解

    Android開發(fā)Jetpack組件DataBinding用例詳解

    這篇文章主要為大家介紹了Android開發(fā)Jetpack組件DataBinding的使案用例詳解說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • android實(shí)現(xiàn)字體閃爍動(dòng)畫的方法

    android實(shí)現(xiàn)字體閃爍動(dòng)畫的方法

    這篇文章主要介紹了android實(shí)現(xiàn)字體閃爍動(dòng)畫的方法,涉及Android中線程調(diào)用和Timer計(jì)時(shí)器的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Android集成Unity的兩種方案

    Android集成Unity的兩種方案

    現(xiàn)在市面上的形形色色Android客戶端,為了更優(yōu)的用戶體驗(yàn),我們開發(fā)的上游產(chǎn)品和交互往往會在界面里設(shè)計(jì)很多動(dòng)效,傳統(tǒng)的一頁頁的靜態(tài)展示頁面已經(jīng)不足以滿足用戶的審美需求了,本文將給大家分享Android集成Unity的兩種方案,感興趣的朋友可以參考下
    2024-05-05
  • Android實(shí)現(xiàn)簡易的柱狀圖和曲線圖表實(shí)例代碼

    Android實(shí)現(xiàn)簡易的柱狀圖和曲線圖表實(shí)例代碼

    柱狀圖是統(tǒng)計(jì)圖表中經(jīng)常用到的一種圖表,比如降雨量之類的統(tǒng)計(jì)展示。這篇文章主要給大家介紹了關(guān)于利用Android如何實(shí)現(xiàn)簡易的柱狀圖和曲線圖表的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-12-12

最新評論

江西省| 孟州市| 龙陵县| 清镇市| 汽车| 萝北县| 炉霍县| 正蓝旗| 封丘县| 宁远县| 黄浦区| 宁武县| 四川省| 文昌市| 黄陵县| 松滋市| 泗阳县| 高雄县| 勃利县| 唐海县| 大兴区| 西吉县| 岳池县| 平南县| 文昌市| 荔浦县| 武义县| 孟村| 米林县| 莱芜市| 原平市| 泌阳县| 锡林郭勒盟| 大理市| 华安县| 甘泉县| 塘沽区| 临颍县| 同江市| 沙雅县| 扎鲁特旗|