Android三種常見的圖片壓縮方式
下面就為大家?guī)?種比較常見的壓縮方式
先給出一組數(shù)據(jù)
原圖: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
壓縮效果:魯班壓縮 > 按比例壓縮 > 質量壓縮
1、質量壓縮
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;
}
2、按比例壓縮(尺寸壓縮、采樣率壓縮)
/**
* 按比例壓縮
*
* @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;
}
3、魯班壓縮(推薦)
魯班壓縮是根據(jù)一種算法得出來的,壓縮效果基本上和微信一致,差不多在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 當壓縮過程出現(xiàn)問題時調用
Log.i(TAG, "onError: 魯班壓縮出錯");
}
}).launch(); //啟動壓縮
}
源碼地址:
https://github.com/zhouxu88/ImgCompress
到這里就結束啦~
以上就是Android三種常見的圖片壓縮方式的詳細內容,更多關于Android 圖片壓縮的資料請關注腳本之家其它相關文章!
相關文章
Android獲取應用程序名稱(ApplicationName)示例
本文以實例方式為大家介紹下獲取應用程序名稱(ApplicationName)的具體實現(xiàn),感興趣的各位可以參考下哈2013-06-06
Android通過自定義Activity實現(xiàn)懸浮的Dialog詳解
Android ImageView實現(xiàn)圖片裁剪和顯示功能
Android音頻開發(fā)之SurfaceView的使用詳解

