Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 之 圖片壓縮

Android 之 圖片壓縮

編輯:關於Android編程

在上一篇文章中(Android之圖片變換)主要說明了bitmap的使用,當然其中也包括一點圖片壓縮的內容,但是沒有詳細描述,這篇文章就來闡述一下平時Android使用的圖片壓縮技術

從圖片的壓縮方式區分:質量壓縮和尺寸壓縮。

質量壓縮是在保持像素的前提下改變圖片的位深及透明度等,來達到壓縮圖片的目的,經過它壓縮的圖片文件大小會有改變,但是導入成bitmap後占得內存是不變的。因為要保持像素不變,所以它就無法無限壓縮,到達一個值之後就不會繼續變小了。顯然這個方法並不適用與縮略圖,其實也不適用於想通過壓縮圖片減少內存的適用,僅僅適用於想在保證圖片質量的同時減少文件大小的情況而已

尺寸壓縮是壓縮圖片的像素,一張圖片所占內存的大小 圖片類型*寬*高,通過改變三個值減小圖片所占的內存,防止OOM,當然這種方式可能會使圖片失真

質量壓縮:

public Bitmap compressImage(Bitmap image,int imageSize) {  

        ByteArrayOutputStream baos = new ByteArrayOutputStream();  
        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//質量壓縮方法,這裡100表示不壓縮,把壓縮後的數據存放到baos中  
        int options = 100;  
        while ( baos.toByteArray().length / 1024>imageSize) {  //循環判斷如果壓縮後圖片是否大於100kb,大於繼續壓縮         
            baos.reset();//重置baos即清空baos  
            image.compress(Bitmap.CompressFormat.JPEG, options, baos);//這裡壓縮options%,把壓縮後的數據存放到baos中  
            options -= 10;//每次都減少10  
        }  
        ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把壓縮後的數據baos存放到ByteArrayInputStream中  
        Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream數據生成圖片  
        return bitmap;  
    } 

尺寸壓縮:

public void scalePic(int reqWidth,int reqHeight) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(getResources(), R.mipmap.demo, options);
        options.inSampleSize = PhotoUtil.calculateInSampleSize(options, reqWidth,reqHeight);
        options.inJustDecodeBounds = false;
        bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.demo, options);

        postInvalidate();
    }
public static int calculateInSampleSize(BitmapFactory.Options options,int reqWidth, int reqHeight) {
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;
        if (height > reqHeight || width > reqWidth) {
            final int heightRatio = Math.round((float) height / (float) reqHeight);
            final int widthRatio = Math.round((float) width / (float) reqWidth);
            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
        }
        return inSampleSize;
    }

根據具體需求也可以兩種壓縮方式結合使用

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved