国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

bitmap的六種壓縮方式,Android圖片壓縮

這篇具有很好參考價(jià)值的文章主要介紹了bitmap的六種壓縮方式,Android圖片壓縮。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

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

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

以下是圖片的壓縮格式:

bitmap的六種壓縮方式,Android圖片壓縮

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

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

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

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

出來的log是:

bitmap的六種壓縮方式,Android圖片壓縮

將取得的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是:

bitmap的六種壓縮方式,Android圖片壓縮

可以看到,圖片的大小是沒有變的,因?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還有一個屬性是,CompressFormat.WEBP格式,該格式是google自己推出來一個圖片格式,更多信息,文末會貼出地址。

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是

bitmap的六種壓縮方式,Android圖片壓縮

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

我上面的代碼沒用過options.inJustDecodeBounds = true; 因?yàn)槲沂枪潭▉砣拥臄?shù)據(jù),為什么這個壓縮方法叫采樣率壓縮,是因?yàn)榕浜蟟nJustDecodeBounds,先獲取圖片的寬、高【這個過程就是取樣】,然后通過獲取的寬高,動態(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的六種壓縮方式,Android圖片壓縮

可以看出來,bitmap的長度和寬度分別縮小了一半,圖片大小縮小了四分之一。
關(guān)于martix更多信息,文末會有一個參考文章。

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是:

bitmap的六種壓縮方式,Android圖片壓縮

我們看到圖片大小直接縮小了一半,長度和寬度也沒有變,相比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是

bitmap的六種壓縮方式,Android圖片壓縮

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

總結(jié)

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

android手機(jī)中,圖片的所占的內(nèi)存大小和很多因素相關(guān),計(jì)算起來也很麻煩。為了計(jì)算出一個圖片的內(nèi)存大小,可以將圖片當(dāng)做一個文件來間接計(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();
}

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

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

參考文章:
Android Bitmap 優(yōu)化(1) - 圖片壓縮http://anany.me/2015/10/15/bitmap1/

多圖比較谷歌WebP和JPEG圖像格式http://www.win7china.com/html/8668.html

Android-使用Matrix對Bitmap進(jìn)行處理http://blog.csdn.net/nupt123456789/article/details/24600055文章來源地址http://www.zghlxwxcb.cn/news/detail-486076.html

到了這里,關(guān)于bitmap的六種壓縮方式,Android圖片壓縮的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C語言實(shí)現(xiàn)排序算法的六種方式

    1、冒泡法 2、交換法 每次用當(dāng)前的元素一一的同其后的元素 3、選擇法 從數(shù)據(jù)中選擇最小的同第一個值交換,在從剩下的部分中選擇最小的與第二個交換,這樣往復(fù)下去 4、插入法 在前面的數(shù)中尋找相應(yīng)的位置插入, 然后繼續(xù)下一張 插入排序就是每一步都將一個待排數(shù)據(jù)按

    2024年01月25日
    瀏覽(18)
  • 【并發(fā)編程】SpringBoot創(chuàng)建線程池的六種方式

    1. 自定義線程池 1.1 示例代碼 ??控制臺打?。?2. 固定長度線程池 2.1 示例代碼 ??控制臺打印: ??前3個任務(wù)被同時(shí)執(zhí)行,因?yàn)閯偤糜?個核心線程。后2個任務(wù)會被存放到阻塞隊(duì)列,當(dāng)執(zhí)行前3個任務(wù)的某個線程空閑時(shí)會從隊(duì)列中獲取任務(wù)并執(zhí)行。 2.2 源碼剖析 ??該類型

    2024年02月16日
    瀏覽(27)
  • SpringBoot接受前臺參數(shù)的六種方式以及統(tǒng)一響應(yīng)

    SpringBoot接受前臺參數(shù)的六種方式以及統(tǒng)一響應(yīng)

    請求 SpringBoot接受前臺參數(shù)的六種方式,首先因?yàn)閺那芭_發(fā)送的請求沒有界面的話只能是從地址欄發(fā)送并且只能是Get請求,為了測試其他的請求,所以我們使用一個工具-Postman,Postman是一款功能強(qiáng)大的網(wǎng)頁調(diào)試與發(fā)送網(wǎng)頁HTTP請求的Chrome插件。 對于前臺傳過來的參數(shù)大致分為六

    2024年02月08日
    瀏覽(25)
  • Java面試之單例模式的六種實(shí)現(xiàn)方式

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 由于設(shè)計(jì)模式在面向?qū)ο笾衅鹬e足輕重的作用,在面試中很多公司都喜歡問一下有關(guān)設(shè)計(jì)模式的問題。在常用的設(shè)計(jì)模式中,Singleton單例模式是唯一一個能用短短幾十行代碼完整實(shí)現(xiàn)的模式,因此,寫

    2024年02月10日
    瀏覽(21)
  • web前端html+css頁面內(nèi)容的六種隱藏方式

    一、使用透明度 語法:opacity:0 注意:元素消失,但是還會占據(jù)空間,只是視覺看不出來 ? 二、使用display 語法:display:none 注意:元素消失,不會占據(jù)空間 ? 三、scale 縮放 語法:transform:scale(0)? ? 值大于1放大,小于1縮小 注意:元素消失,但是還會占據(jù)空間 ? 四、使用vis

    2024年02月08日
    瀏覽(31)
  • 探究Spring Bean的六種作用域:了解適用場景和使用方式

    探究Spring Bean的六種作用域:了解適用場景和使用方式

    主要對單例作用域與原型作用域進(jìn)行重點(diǎn)說明,其余四個了解即可 單例作用域一般是默認(rèn)的Bean作用域。Spring容器在第一次獲取Bean時(shí)創(chuàng)建實(shí)例,并在后續(xù)請求中返回同一個實(shí)例。 例如: 我們現(xiàn)在創(chuàng)建一個公共的Bean供用戶一與用戶二使用,用戶一再使用完后對其內(nèi)容進(jìn)行修改

    2024年02月15日
    瀏覽(36)
  • 圖片模塊封裝:Glide高級使用+使用設(shè)計(jì)模式圖片框架封裝+Bitmap尺寸壓縮和質(zhì)量壓縮+Bitmap加載大圖長圖

    圖片模塊封裝:Glide高級使用+使用設(shè)計(jì)模式圖片框架封裝+Bitmap尺寸壓縮和質(zhì)量壓縮+Bitmap加載大圖長圖

    框架設(shè)計(jì)過程中對于對于架構(gòu)要求高內(nèi)聚低耦合,圖片加載框架中引 入三方框架提示開發(fā)效率,對于技術(shù)選型后的方案可能后面需求的變更原三方 sdk無法滿足當(dāng)前業(yè)務(wù)需求,故而需要更換原有sdk,為了將更改降到最低,所 有前面設(shè)計(jì)圖片加載框架時(shí)要考慮當(dāng)前這個風(fēng)險(xiǎn)點(diǎn)

    2024年02月06日
    瀏覽(20)
  • Bean 的六種作用域

    Bean 的六種作用域

    ? 目錄 一、作用域是什么? 1、singleton(單例作用域) 2、prototype(原型作用域) 3、request(請求作用域) 4、session(回話作用域) 5、application(全局作用域) 6、websocket( HTTP WebSocket 作用域) 二、單例作?域VS 全局作?域 三、設(shè)置作用域 Bean的作用域是指Bean實(shí)例的生命周

    2024年02月10日
    瀏覽(31)
  • 關(guān)于Bean的六種作用域

    在JavaSE中,我們學(xué)習(xí)過了全局變量以及局部變量,這里就涉及到了作用域問題,那么什么是作用域呢? 限定程序中變量的使用范圍叫做作用域,或者說在源代碼中定義變量的某個區(qū)域就叫做作用域。 而Bean的作用域指的是 Bean在Spring整個框架中的某種行為模式 , 比如singleto

    2024年02月08日
    瀏覽(26)
  • Python中的六種基本數(shù)據(jù)類型

    Python中分為六種基本數(shù)據(jù)類型 不可變類型(又叫靜態(tài)數(shù)據(jù)類型,沒有增刪改操作):數(shù)字(number)、字符串(string)、元組(tuple) 可變類型(又叫動態(tài)數(shù)據(jù)類型,支持增刪改操作):列表(list)、字典(dictionary)、集合(set) 1. 數(shù)字類型(numbers): 數(shù)字類型下還可分為整數(shù)(int)、浮點(diǎn)數(shù)(f

    2024年02月04日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包