Android圖片壓縮總結

通常開發中會對一張圖片進行壓縮,通常有三種方式:質量壓縮,尺寸壓縮,採樣率壓縮。

一.質量壓縮通常通過設置bitmap的options屬性來降低圖片的質量,但圖片的像素不會減少,所佔內存也不會減少

public static void compressImageToFile(Bitmap bmp,File file) {//bmp需要壓縮的bitmap圖片對象 file壓縮後圖片保存的位置
	        // 0-100 100爲不壓縮
	        int options = 20;
	        ByteArrayOutputStream baos = new ByteArrayOutputStream();
	        // 把壓縮後的數據存放到baos中
	        bmp.compress(Bitmap.CompressFormat.JPEG, options, baos);
	        try {
	            FileOutputStream fos = new FileOutputStream(file);
	            fos.write(baos.toByteArray());
	            fos.flush();
	            fos.close();
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	    }

二.尺寸壓縮,通過縮放圖片像素減少佔用內存大小

public static void compressBitmapToFile(Bitmap bmp, File file){
// 尺寸壓縮倍數,值越大,圖片尺寸越小
int ratio = 8;
// 壓縮Bitmap到對應尺寸
Bitmap result = Bitmap.createBitmap(bmp.getWidth() / ratio, bmp.getHeight() / ratio, Config.ARGB_8888);
Canvas canvas = new Canvas(result);
Rect rect = new Rect(0, 0, bmp.getWidth() / ratio, bmp.getHeight() / ratio);
canvas.drawBitmap(bmp, null, rect, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 把壓縮後的數據存放到baos中
result.compress(Bitmap.CompressFormat.JPEG, 100 ,baos);
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(baos.toByteArray());
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}

三.採樣率壓縮

 /**
	     * 設置圖片的採樣率,降低圖片像素
	     * @param filePath
	     * @param file
	     */
	    public static void compressBitmap(String filePath, File file){
	        // 數值越高,圖片像素越低
	        int inSampleSize = 8;
	        BitmapFactory.Options options = new BitmapFactory.Options();
	        options.inJustDecodeBounds = false;
//	        options.inJustDecodeBounds = true;//爲true的時候不會真正加載圖片,而是得到圖片的寬高信息。
	        //採樣率
	        options.inSampleSize = inSampleSize;
	        Bitmap bitmap = BitmapFactory.decodeFile(filePath, options);

	        ByteArrayOutputStream baos = new ByteArrayOutputStream();
	        // 把壓縮後的數據存放到baos中
	        bitmap.compress(Bitmap.CompressFormat.JPEG, 100 ,baos);
	        try {
	            if(file.exists())
	            {
	                file.delete();
	            }
	            else {
	                file.createNewFile();
	            }
	            FileOutputStream fos = new FileOutputStream(file);
	            fos.write(baos.toByteArray());
	            fos.flush();
	            fos.close();
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	    }

附加:工具類 計算縮放比:

/**
	     * 計算縮放比
	     *
	     * @param bitWidth  當前圖片寬度
	     * @param bitHeight 當前圖片高度
	     * @return
	     * @Description:函數描述
	     */
	    public static int getRatioSize(int bitWidth, int bitHeight) {
	        // 圖片最大分辨率
	        int imageHeight = 1920;
	        int imageWidth = 1080;
	        // 縮放比
	        int ratio = 1;
	        // 縮放比,由於是固定比例縮放,只用高或者寬其中一個數據進行計算即可
	        if (bitWidth > bitHeight && bitWidth > imageWidth) {
	            // 如果圖片寬度比高度大,以寬度爲基準
	            ratio = bitWidth / imageHeight;
	        } else if (bitWidth < bitHeight && bitHeight > imageHeight) {
	            // 如果圖片高度比寬度大,以高度爲基準
	            ratio = bitHeight / imageHeight;
	        }
	        // 最小比率爲1
	        if (ratio <= 0)
	            ratio = 1;
	        return ratio;
	    }


發佈了88 篇原創文章 · 獲贊 18 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章