您好,登錄后才能下訂單哦!
小編給大家分享一下Android常見的圖片壓縮方式有哪些,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
先給出一組數據
原圖:width:2976; height:2976
原圖實際:--->byte:2299820 Mb:2.19328
質量壓縮 size--->:byte:1599831 kb:1562.33496
按比例壓縮 size--->:byte:191707 kb:187.21387
魯班壓縮 size--->:byte:143792 kb:140.42188
壓縮效果:魯班壓縮 > 按比例壓縮 > 質量壓縮
public void getBitmap(String imgPath, String outPath) { BitmapFactory.Options newOpts = new BitmapFactory.Options(); newOpts.inJustDecodeBounds = false; newOpts.inPurgeable = true; newOpts.inInputShareable = true; // Do not compress newOpts.inSampleSize = 1; newOpts.inPreferredConfig = Config.RGB_565; storeImage(bitmap, outPath); //保存圖片 }
注意
質量壓縮不會減少圖片的像素,它是在保持像素的前提下改變圖片的位深及透明度等,來達到壓縮圖片的目的,這也是為什么該方法叫質量壓縮方法。所以這種方法,很可能不會減少圖片的大小
如果是bit.compress(CompressFormat.PNG, quality, baos);這樣的png格式,quality就沒有作用了,bytes.length不會變化,因為png圖片是無損的,不能進行壓縮
保存圖片
/** * 把bitmap轉化成圖片存儲在本地 * * @param bitmap * @param outPath 本地的存儲路徑 * @throws FileNotFoundException */ public static boolean storeImage(Bitmap bitmap, String outPath) throws FileNotFoundException { FileOutputStream os = new FileOutputStream(outPath); boolean compressResult = bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os); return compressResult; }
/** * 按比例壓縮 * * @param path 原圖片路徑 * @param targetW 壓縮后寬度 * @param targetH 壓縮后高度 * @return 壓縮后的圖片的保存路徑 */ public static String compressScale(String path,, String outPath, int targetW, int targetH) throws FileNotFoundException { // 獲取option BitmapFactory.Options options = new BitmapFactory.Options(); // inJustDecodeBounds設置為true,這樣使用該option decode出來的Bitmap是null, // 只是把長寬存放到option中 options.inJustDecodeBounds = true; // 此時bitmap為null Bitmap bitmap = BitmapFactory.decodeFile(path, options); int inSampleSize = 1; // 1是不縮放 // 計算寬高縮放比例 int inSampleSizeW = options.outWidth / targetW; int inSampleSizeH = options.outHeight / targetH; // 最終取大的那個為縮放比例,這樣才能適配,例如寬縮放3倍才能適配屏幕,而 // 高不縮放就可以,那樣的話如果按高縮放,寬在屏幕內就顯示不下了 if (inSampleSizeW > inSampleSizeH) { inSampleSize = inSampleSizeW; } else { inSampleSize = inSampleSizeH; } // 一定要記得將inJustDecodeBounds設為false,否則Bitmap為null options.inJustDecodeBounds = false; // 設置縮放比例(采樣率) options.inSampleSize = inSampleSize; bitmap = BitmapFactory.decodeFile(path, options); boolean isSuccess = storeImage(bitmap, outPath); if (isSuccess) { return outPath; } return ""; }
這種方法是設置圖片的采樣率,降低圖片像素,通過縮放圖片像素來減少圖片大小。
那么我又是如何來獲取圖片壓縮前后的大小的呢?
注意:這里的圖片的大小是指圖片的實際大小,不是bitmap在內存中所占的大小,看壓縮效果,就得看圖片在文件中所占的大小。
/** * 獲取本地文件大小 * * @param imgPath 圖片的路徑 * @return 圖片實際的大小,單位byte */ public static int getFileSize(String imgPath) { int size = 0; try { FileInputStream fis = new FileInputStream(new File(imgPath)); size = fis.available(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return size; }
魯班壓縮是根據一種算法得出來的,壓縮效果基本上和微信一致,差不多在200k以內,圖片不失真。
魯班壓縮:
https://github.com/Curzibn/Luban
build.gradle添加依賴
compile 'top.zibin:Luban:1.1.3'
private void lunBanPress(String path) { String pressPath = Environment.getExternalStorageDirectory().getPath(); Luban.with(this) .load(path) // 傳人要壓縮的圖片列表 .ignoreBy(100) // 忽略不壓縮圖片的大小 .setTargetDir(pressPath) // 設置壓縮后文件存儲位置 .setCompressListener(new OnCompressListener() { //設置回調 @Override public void onStart() { // TODO 壓縮開始前調用,可以在方法內啟動 loading UI Log.i(TAG, "onStart:開始魯班壓縮 "); } @Override public void onSuccess(File file) { // TODO 壓縮成功后調用,返回壓縮后的圖片文件 Glide.with(activity).load(file).into(iv2); Log.i(TAG, "onSuccess: 魯班壓縮成功 :"); try { int size = new FileInputStream(file).available(); Log.i("tag", "魯班壓縮 size--->:" + "byte:" + size + " kb:" + (float) size / 1024); } catch (IOException e) { e.printStackTrace(); } } @Override public void onError(Throwable e) { // TODO 當壓縮過程出現問題時調用 Log.i(TAG, "onError: 魯班壓縮出錯"); } }).launch(); //啟動壓縮 }
Android是一種基于Linux內核的自由及開放源代碼的操作系統,主要使用于移動設備,如智能手機和平板電腦,由美國Google公司和開放手機聯盟領導及開發。
看完了這篇文章,相信你對“Android常見的圖片壓縮方式有哪些”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。