android開發中,常常會遇到圖片的上傳後者下載等操做,可是系統分配給當前應用的最大可用內存有限,通常是16M,32M,因此加載大圖很容易出現OOM。所以須要對圖片進行壓縮處理android
先介紹一下圖片佔用內存的計算:服務器
一個圖片所佔內存 = 長 x 寬 x 一個像素點所佔字節數。(圖片像素 = 長 x 寬)code
Android中的Bitmap默認使用的是ARGB_8888。orm
因此一個1280*800的圖片所佔用的內存大小:1280*800*4/(1024*1024) = 3.9M。圖片
圖片壓縮目的就是要減小圖片所佔內存大小,明顯地,咱們能改變的是長 和 寬。內存
通常來講,圖片壓縮無外乎:質量壓縮,大小壓縮。開發
一、質量壓縮文檔
關鍵方法:bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);get
這種壓縮,圖片的長 ,寬 和 像素的字節數 都沒有變化,那麼是怎麼實現壓縮效果的呢?it
實際上,是經過該改變位深,透明度等犧牲圖片質量的方式來達到壓縮的目的。可是圖片所佔內存並無
改變。
解釋:
好比說圖片是500k,1280 * 800像素的,經過質量壓縮,File形式的圖片大小確實變小了,好比說變成100k,以便於上傳到服務器。
可是經過Bitmap.decodeFile到內存中,變成Bitmap時,它的像素仍然是:1280 * 800,圖片的像素 = bitmap.getWidth() x bitmap.getHeight();
圖片是由像素組成的,那麼像素是由什麼組成的呢?
像素是由位深(色深),透明度等組成。
該方法的官方文檔也解釋說, 它會讓圖片從新構造, 可是有可能圖像的位深(即色深)和每一個像素的透明度會變化,JPEG onlysupports opaque(不透明), 也就是說以jpeg格式壓縮後, 原來圖片中透明的元素將消失.因此這種格式極可能形成失真。
總結:經過改變圖片質量,達到了對File形式的圖片進行壓縮,圖片的像素並無變化,也就是所佔內存沒變。(上傳文件到服務器時,File要儘可能小)
備註:bitmap.getByteCount() 是計算它的像素所佔用的內存。
二、大小壓縮
經過設置採樣率,如:newOpts.inSampleSize = 2;來達到壓縮的目的。
採樣率改變的是圖片的長和寬,這樣就改變了圖片的像素,最終改變了圖片所佔的內存。這就達到了壓縮的目的。