1. 程式人生 > >android 圖片壓縮的兩種方式

android 圖片壓縮的兩種方式

android系統在執行的過程中如果圖片過大會導致應用所佔記憶體快速增加致使記憶體溢位(OOM)所有在顯示圖片的過程中需要對較大圖片進行一定的壓縮處理,

壓縮方式有兩種,一是對圖片的質量進行壓縮,而是對圖片的寬高進行壓縮。

具體實現的時候會根據需求來設計不同的實現函式,下面列舉幾個可能用到的

1、

    /**
     * 質量壓縮法1:可以指定壓縮的比例
     *
     * @param image    要壓縮的圖片
     * @param filepath 檔案儲存路徑
     * @return
     */

    public static Bitmap compressImage(Bitmap image, String filepath) {
        //不設定壓縮比預設壓縮%50,經過測試%50圖片大小會減小3/4.如100K的檔案大概會壓縮到25K
        return compressImage(image, filepath, 50);
    }
    /**
     * 質量壓縮法1:可以指定壓縮的比例
     *
     * @param image    要壓縮的圖片
     * @param filepath 檔案儲存路徑    
     * @param quality  壓縮的質量比 
     * @return
     */

    public static Bitmap compressImage(Bitmap image, String filepath, int quality) {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            //質量壓縮方法,這裡100表示不壓縮,把壓縮後的資料存放到baos中
            image.compress(Bitmap.CompressFormat.JPEG, quality, baos);
            //壓縮好後寫入檔案中
            FileOutputStream fos = new FileOutputStream(filepath);
            fos.write(baos.toByteArray());
            fos.flush();
            fos.close();
            return image;//image大小沒有變,只是儲存的檔案變小了
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

這裡做一下解釋,

1、經過測試%50圖片大小會減小3/4.如100K的檔案大概會壓縮到25K。

2、compressImage(Bitmap image, String filepath, int quality),的第一個引數image如果大小為100K.,return image的大小也是100K,沒有減小,但是儲存的檔案大小被壓縮了。因為

image.compress(Bitmap.CompressFormat.JPEG, quality, baos);

將被壓縮的內容儲存在boos變數中,image大小不變。如果要讓返回的image也是被壓縮過的圖片。可以在返回之前更新image為壓縮後的內容。

//把壓縮後的資料baos存放到ByteArrayInputStream中
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
image.recycle();
image = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream資料生成圖片
return image;

2、設定輸出圖片的被壓縮後的最大大小。

    public static Bitmap compressImage2(Bitmap image, String filepath) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 質量壓縮方法,這裡100表示不壓縮,把壓縮後的資料存放到baos中
        int options = 90;
        while (baos.toByteArray().length / 1024 > 200) { // 迴圈判斷如果壓縮後圖片是否大於200kb,大於繼續壓縮
            baos.reset(); // 重置baos即清空baos
            image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 這裡壓縮options%,把壓縮後的資料存放到baos中
            options -= 10;// 每次都減少10
        }
        try {
            FileOutputStream fos = new FileOutputStream(filepath);
            fos.write(baos.toByteArray());
            fos.flush();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return image;
    }

3、壓縮圖片的寬高

public static Bitmap ResizeBitmap(Bitmap bitmap, int newWidth) {//拍照的圖片太大,設定格式大小
        //獲取原來圖片的寬高
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        //計算原來圖片的高寬之比
        float temp = ((float) height) / ((float) width);
        //根據傳入的新圖片的寬度計算新圖片的高度
        int newHeight = (int) ((newWidth) * temp);

        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        //Bitmap 通過matrix 矩陣變換生成新的Bitmap
        Matrix matrix = new Matrix();
        matrix.postScale(scaleWidth, scaleHeight);
        Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
        bitmap.recycle();
        return resizedBitmap;
    }