Android小知識之圖片的3種壓縮方式小結

這篇文章主要給大家介紹了關於Android小知識之圖片的3種壓縮方式的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨着小編來一起學習學習吧

設置圖片格式

Android目前常用的圖片格式有png,jpeg和webp,

png:無損壓縮圖片格式,支持Alpha通道,Android切圖素材多采用此格式

jpeg:有損壓縮圖片格式,不支持背景透明,適用於照片等色彩豐富的大圖壓縮,不適合logo

webp:是一種同時提供了有損壓縮和無損壓縮的圖片格式,派生自視頻編碼格式VP8,從谷歌官網來看,無損webp平均比png小26%,有損的webp平均比jpeg小25%~34%,無損webp支持Alpha通道,有損webp在一定的條件下同樣支持,有損webp在Android4.0(API 14)之後支持,無損和透明在Android4.3(API18)之後支持

採用webp能夠在保持圖片清晰度的情況下,可以有效減小圖片所佔有的磁盤空間大小

Android中Bitmap所佔內存大小計算方式:圖片長度 x 圖片寬度 x 一個像素點佔用的字節數

1、Bitmap的Compress方法(質量壓縮):

public boolean compress(CompressFormat format, int quality, OutputStream stream)

參數format:表示圖像的壓縮格式,目前有CompressFormat.JPEG、CompressFormat.PNG、CompressFormat.WEBP。

參數quality: 圖像壓縮率,0-100。 0 壓縮100%,100意味着不壓縮。

參數stream: 寫入壓縮數據的輸出流。

常用的用法:

public static Bitmap compress(Bitmap bitmap){

 ByteArrayOutputStream baos = new ByteArrayOutputStream();

 bitmap.compress(Bitmap.CompressFormat.JPEG, 90, baos);

 byte[] bytes = baos.toByteArray();

 return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

}

上面方法中通過bitmap的compress方法對bitmap進行質量壓縮,10%壓縮,90%不壓縮。

圖片的大小是沒有變的,因爲質量壓縮不會減少圖片的像素,它是在保持像素的前提下改變圖片的位深及透明度等,來達到壓縮圖片的目的,這也是爲什麼該方法叫質量壓縮方法。圖片的長,寬,像素都不變,那麼bitmap所佔內存大小是不會變的。

quality值越小壓縮後的baos越小(使用場景:在微信分享時,需要對圖片的字節數組大小進行限制,這時可以使用bitmap的compress方法對圖片進行質量壓縮)。

2、BitmapFactory.Options的inJustDecodeBounds和inSampleSize參數(採樣壓縮率):

inJustDecodeBounds:當inJustDecodeBounds設置爲true的時候,BitmapFactory通過decodeXXXX解碼圖片時,將會返回空(null)的Bitmap對象,這樣可以避免Bitmap的內存分配,但是它可以返回Bitmap的寬度、高度以及MimeType。

inSampleSize: 當它小於1的時候,將會被當做1處理,如果大於1,那麼就會按照比例(1 / inSampleSize)縮小bitmap的寬和高、降低分辨率,大於1時這個值將會被處置爲2的倍數。例如,width=100,height=100,inSampleSize=2,那麼就會將bitmap處理爲,width=50,height=50,寬高降爲1 / 2,像素數降爲1 / 4。

常用用法:

public static Bitmap inSampleSize(Bitmap bitmap,int reqWidth,int reqHeight){

 final BitmapFactory.Options options = new BitmapFactory.Options();

 options.inJustDecodeBounds = true;

 BitmapFactory.decodeByteArray(data, 0, data.length, options);

 options.inSampleSize = calculateInSampleSize(options, reqWidth,

   reqHeight);

 options.inJustDecodeBounds = false;

 return BitmapFactory.decodeByteArray(data, 0, data.length, options);

}

public static int calculateInSampleSize(BitmapFactory.Options options,

          int reqWidth, int reqHeight) {

 final int picheight = options.outHeight;

 final int picwidth = options.outWidth;

 int targetheight = picheight;

 int targetwidth = picwidth;

 int inSampleSize = 1;

 if (targetheight > reqHeight || targetwidth > reqWidth) {

  while (targetheight >= reqHeight

    && targetwidth >= reqWidth) {

   inSampleSize += 1;

   targetheight = picheight / inSampleSize;

   targetwidth = picwidth / inSampleSize;

  }

 }

 return inSampleSize;

}
}

inSampleSize方法中先將inJustDecodeBounds設置爲false,在通過BitmapFactory的decodeXXXX方法解碼圖片,返回空(null)的Bitmap對象,同時獲取了bitmap的寬高,再通過calculateInSampleSize方法根據原bitmap的 寬高和目標寬高計算出合適的inSampleSize,最後將inJustDecodeBounds設置爲true,通過BitmapFactory的decodeXXXX方法解碼圖片(使用場景:比如讀取本地圖片時,防止Bitmap過大導致內存溢出)。

3、通過Matrix壓縮圖片

Matrix matrix = new Matrix();

matrix.setScale(0.5f, 0.5f);

bm = Bitmap.createBitmap(bit, 0, 0, bit.getWidth(),bit.getHeight(), matrix, true);

}

使用場景:自定義View時,對圖片進行縮放、旋轉、位移以及傾斜等操作,常見的就是對圖片進行縮放處理,以及圓角圖片等。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對神馬文庫的支持。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章