【Android開發(fā)基礎(chǔ)系列】圖片專題

1 圖片編輯處理

1.1 圖片裁切

轉(zhuǎn)載自:bitmap的六種壓縮方式靶病,Android圖片壓縮

http://blog.csdn.net/harryweasley/article/details/51955467


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

????????圖片長(zhǎng)度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來(lái)測(cè)試的楼眷,從sd卡取出一個(gè)照片铲汪,如下所示:

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

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

????? 出來(lái)的log是:

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

1.1.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改變张吉,這里出來(lái)的log是:

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

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

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

????????CompressFormat還有一個(gè)屬性是尺借,CompressFormat.WEBP格式,該格式是google自己推出來(lái)一個(gè)圖片格式精拟,更多信息燎斩,文末會(huì)貼出地址。

1.1.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());

????????出來(lái)的log是

????????設(shè)置inSampleSize的值(int類型)后蜂绎,假如設(shè)為2栅表,則寬和高都為原來(lái)的1/2,寬高都減少了师枣,自然內(nèi)存也降低了怪瓶。

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

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

1.1.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());

????????出來(lái)的log是

????????可以看出來(lái)解阅,bitmap的長(zhǎng)度和寬度分別縮小了一半落竹,圖片大小縮小了四分之一。關(guān)于martix更多信息货抄,文末會(huì)有一個(gè)參考文章述召。

1.1.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());

????????出來(lái)的log是:

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

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

1.1.5 createScaledBitmap

bm = Bitmap.createScaledBitmap(bit, 150, 150, true);

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

????????的log是

????????這里是將圖片壓縮成用戶所期望的長(zhǎng)度和寬度,但是這里要說遍愿,如果用戶期望的長(zhǎng)度和寬度和原圖長(zhǎng)度寬度相差太多的話存淫,圖片會(huì)很不清晰。

????????Filter參數(shù)作用:如果是放大圖片沼填,filter決定是否平滑桅咆,如果是縮小圖片,filter無(wú)影響

1.1.6 總結(jié)

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

????????android手機(jī)中,圖片的所占的內(nèi)存大小和很多因素相關(guān)却邓,計(jì)算起來(lái)也很麻煩。為了計(jì)算出一個(gè)圖片的內(nèi)存大小院水,可以將圖片當(dāng)做一個(gè)文件來(lái)間接計(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 = newFileInputStream(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è)來(lái)做文章:Bitmap所占用的內(nèi)存=圖片長(zhǎng)度x圖片寬度x一個(gè)像素點(diǎn)占用的字節(jié)數(shù)。3個(gè)參數(shù)恢恼,任意減少一個(gè)的值民傻,就達(dá)到了壓縮的效果。

2 參考鏈接

Android Bitmap優(yōu)化(1) -圖片壓縮

http://anany.me/2015/10/15/bitmap1/


多圖比較谷歌WebP和JPEG圖像格式

http://www.win7china.com/html/8668.html


Android-使用Matrix對(duì)Bitmap進(jìn)行處理

http://blog.csdn.net/nupt123456789/article/details/24600055


android圖片壓縮總結(jié)

http://blog.csdn.net/cherry609195946/article/details/9264409


Android壓縮圖片到100K以下并保持不失真的高效方法

http://blog.csdn.net/jdsjlzx/article/details/44229169


Android圖片壓縮(質(zhì)量壓縮和尺寸壓縮)&Bitmap轉(zhuǎn)成字符串上傳

http://blog.csdn.net/jdsjlzx/article/details/44228935

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末场斑,一起剝皮案震驚了整個(gè)濱河市漓踢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌漏隐,老刑警劉巖喧半,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異青责,居然都是意外死亡挺据,警方通過查閱死者的電腦和手機(jī)取具,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)扁耐,“玉大人暇检,你說我怎么就攤上這事⊥癯疲” “怎么了占哟?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)酿矢。 經(jīng)常有香客問我榨乎,道長(zhǎng),這世上最難降的妖魔是什么瘫筐? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任蜜暑,我火速辦了婚禮,結(jié)果婚禮上策肝,老公的妹妹穿的比我還像新娘肛捍。我一直安慰自己,他們只是感情好之众,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布拙毫。 她就那樣靜靜地躺著,像睡著了一般棺禾。 火紅的嫁衣襯著肌膚如雪缀蹄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天膘婶,我揣著相機(jī)與錄音缺前,去河邊找鬼。 笑死悬襟,一個(gè)胖子當(dāng)著我的面吹牛衅码,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播脊岳,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼逝段,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了割捅?” 一聲冷哼從身側(cè)響起奶躯,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棺牧,沒想到半個(gè)月后巫糙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡颊乘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年参淹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了醉锄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浙值,死狀恐怖恳不,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情开呐,我是刑警寧澤烟勋,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站筐付,受9級(jí)特大地震影響卵惦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瓦戚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一沮尿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧较解,春花似錦畜疾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至奸焙,卻和暖如春瞎暑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忿偷。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工金顿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鲤桥。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像渠概,于是被迫代替她去往敵國(guó)和親茶凳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容