圖片壓縮

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;來達到壓縮的目的。

              採樣率改變的是圖片的長和寬,這樣就改變了圖片的像素,最終改變了圖片所佔的內存。這就達到了壓縮的目的。

相關文章
相關標籤/搜索