1. 程式人生 > >壓縮圖片工具類(在保證圖片清晰度的情況下 儘可能的壓縮圖片的大小)

壓縮圖片工具類(在保證圖片清晰度的情況下 儘可能的壓縮圖片的大小)

倒入類庫 

compile 'me.shaohui.advancedluban:library:1.3.1'

封裝的工具類
package com.wisdomschool.stu.utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.text.TextUtils;

import com.wisdomschool.stu.presenter.MyTask;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import me.shaohui.advancedluban.Luban;
import me.shaohui.advancedluban.OnCompressListener;
import me.shaohui.advancedluban.OnMultiCompressListener;

/**
* Created by zhangyanjiao
* on 16/12/21
* name 壓縮指定大小的圖片
*/
public class ImgCompressUtils {
private static ImgCompressUtils imgCompressUtils = new ImgCompressUtils();

private ImgCompressUtils() {
}

public static ImgCompressUtils getInstance() {
return imgCompressUtils;
}

public void compress(final Context context, int maxSize, final List<String> photoPathList, final CompressFinishCallBack callBack) {
if ((photoPathList == null || photoPathList.size() == 0) && callBack != null) {
callBack.compressFinish(null);
return;
}
final long startTime = System.currentTimeMillis();
if (photoPathList != null && photoPathList.size() > 0) {
List<File> tempFiles = new ArrayList<>();
for (int i = 0; i < photoPathList.size(); i++) {
tempFiles.add(new File(photoPathList.get(i)));
}

Luban.compress(context, tempFiles)
.putGear(Luban.CUSTOM_GEAR)
.setMaxSize(maxSize)
.setCompressFormat(Bitmap.CompressFormat.JPEG)
.launch(new OnMultiCompressListener() {

@Override
public void onStart() {
if (callBack != null)
callBack.compressStart("開始壓縮圖片");
}

@Override
public void onSuccess(List<File> fileList) {
if (callBack != null)
callBack.compressFinish(fileList);
final long finishTime = System.currentTimeMillis();
LogUtils.e("壓縮時間:" + (finishTime - startTime) / 1000);
}

@Override
public void onError(Throwable e) {
if (callBack != null)
callBack.compressError("部分檔案不存在或已被刪除");
}

});
}
}

/**
* 壓縮單張圖片
*
* @param context
* @param maxSize
* @param photoPath
* @param callBack
*/

public void compress(final Context context, int maxSize, final String photoPath, final CompressFinishCallBack callBack) {
if (TextUtils.isEmpty(photoPath)) {
callBack.compressFinish(null);
return;
}
final long startTime = System.currentTimeMillis();
Luban.compress(context, new File(photoPath))
.putGear(Luban.CUSTOM_GEAR)
.setMaxSize(maxSize)
.setCompressFormat(Bitmap.CompressFormat.JPEG)
.launch(new OnCompressListener() {

@Override
public void onStart() {
if (callBack != null)
callBack.compressStart("開始壓縮圖片");
}

@Override
public void onSuccess(File fileList) {
callBack.compressFinish(fileList);
final long finishTime = System.currentTimeMillis();
LogUtils.e("壓縮時間:" + (finishTime - startTime) / 1000);
}

@Override
public void onError(Throwable e) {
if (callBack != null)
callBack.compressError("壓縮圖片失敗");
}

});
}

/**
* 圖片壓縮完畢 刪除壓縮的檔案
*
* @param files
*/
public void delFile(final Map<String, File> files, final DelComPressCallBack callBack) {
if (files == null || files.size() <= 0)
return;
MyTask.runInBackground(true, new Runnable() {
@Override
public void run() {
for (String key : files.keySet()) {
if (files.get(key).exists())
if (!files.get(key).delete())
callBack.fail();

}
callBack.success();
}
});
}

public void delFile(final Map<String, File> files) {
if (files == null || files.size() <= 0)
return;
MyTask.runInBackground(true, new Runnable() {
@Override
public void run() {
for (String key : files.keySet()) {
if (files.get(key).exists())
files.get(key).delete();
}
}
});
}

public void delFile(final File files, final DelComPressCallBack callBack) {
if (files == null)
return;
MyTask.runInBackground(true, new Runnable() {
@Override
public void run() {
if (!files.delete())
callBack.fail();
callBack.success();
}
});
}

public void delFile(final File files) {
if (files == null)
return;
MyTask.runInBackground(true, new Runnable() {
@Override
public void run() {
files.delete();
}
});
}

public interface CompressFinishCallBack<T> {
/**
* 開始壓縮圖片
*
* @param msg 提示
*/
void compressStart(String msg);

/**
* 圖片壓縮完成
*
* @param files
*/
void compressFinish(T files);

/**
* 圖片壓縮失敗
*
* @param msg 提示
*/
void compressError(String msg);
}

public interface DelComPressCallBack {
void success();

void fail();
}
}

使用方法
使用工具類 ImgCompressUtils
使用方法
ImgCompressUtils.getInstance().compress(context, 300, photoPathList, files, new ImgCompressUtils.CompressFinishCallBack() {
@Override
public void compressStart(String msg) {
LogUtils.i(msg);
context.showMsg(msg);
}

@Override
public void compressFinish(List<File> files) {
Map<String, File> compressFiles = new HashMap<String, File>();
if (files != null && files.size() > 0) {
LogUtils.i("壓縮完圖片集合為:");
context.showMsg("圖片壓縮完成");

for (File temp : files) {
LogUtils.i("圖片大小:" + temp.length() / 1000 + "K");
compressFiles.put(temp.getAbsolutePath(), temp);
}
context.showMsg("圖片開始上傳");
LogUtils.e("圖片開始上傳");
}
//上傳資料
}

@Override
public void compressError(String msg) {
LogUtils.i(msg);
context.showMsg(msg);
}
});

//上傳資料成功回撥(刪除壓縮的圖片)
方式一:
ImgCompressUtils.getInstance().delFile(compressFiles, new ImgCompressUtils.DelComPressCallBack() {
@Override
public void success() {
LogUtils.i("刪除成功");
}

@Override
public void fail() {
LogUtils.i("刪除失敗");
}
});
方式二:
ImgCompressUtils.getInstance().delFile(compressFiles);
封裝的工具類
package com.wisdomschool.stu.utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.text.TextUtils;

import com.wisdomschool.stu.presenter.MyTask;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import me.shaohui.advancedluban.Luban;
import me.shaohui.advancedluban.OnCompressListener;
import me.shaohui.advancedluban.OnMultiCompressListener;

/**
* Created by zhangyanjiao
* on 16/12/21
* name 壓縮指定大小的圖片
*/
public class ImgCompressUtils {
private static ImgCompressUtils imgCompressUtils = new ImgCompressUtils();

private ImgCompressUtils() {
}

public static ImgCompressUtils getInstance() {
return imgCompressUtils;
}

public void compress(final Context context, int maxSize, final List<String> photoPathList, final CompressFinishCallBack callBack) {
if ((photoPathList == null || photoPathList.size() == 0) && callBack != null) {
callBack.compressFinish(null);
return;
}
final long startTime = System.currentTimeMillis();
if (photoPathList != null && photoPathList.size() > 0) {
List<File> tempFiles = new ArrayList<>();
for (int i = 0; i < photoPathList.size(); i++) {
tempFiles.add(new File(photoPathList.get(i)));
}

Luban.compress(context, tempFiles)
.putGear(Luban.CUSTOM_GEAR)
.setMaxSize(maxSize)
.setCompressFormat(Bitmap.CompressFormat.JPEG)
.launch(new OnMultiCompressListener() {

@Override
public void onStart() {
if (callBack != null)
callBack.compressStart("開始壓縮圖片");
}

@Override
public void onSuccess(List<File> fileList) {
if (callBack != null)
callBack.compressFinish(fileList);
final long finishTime = System.currentTimeMillis();
LogUtils.e("壓縮時間:" + (finishTime - startTime) / 1000);
}

@Override
public void onError(Throwable e) {
if (callBack != null)
callBack.compressError("部分檔案不存在或已被刪除");
}

});
}
}

/**
* 壓縮單張圖片
*
* @param context
* @param maxSize
* @param photoPath
* @param callBack
*/

public void compress(final Context context, int maxSize, final String photoPath, final CompressFinishCallBack callBack) {
if (TextUtils.isEmpty(photoPath)) {
callBack.compressFinish(null);
return;
}
final long startTime = System.currentTimeMillis();
Luban.compress(context, new File(photoPath))
.putGear(Luban.CUSTOM_GEAR)
.setMaxSize(maxSize)
.setCompressFormat(Bitmap.CompressFormat.JPEG)
.launch(new OnCompressListener() {

@Override
public void onStart() {
if (callBack != null)
callBack.compressStart("開始壓縮圖片");
}

@Override
public void onSuccess(File fileList) {
callBack.compressFinish(fileList);
final long finishTime = System.currentTimeMillis();
LogUtils.e("壓縮時間:" + (finishTime - startTime) / 1000);
}

@Override
public void onError(Throwable e) {
if (callBack != null)
callBack.compressError("壓縮圖片失敗");
}

});
}

/**
* 圖片壓縮完畢 刪除壓縮的檔案
*
* @param files
*/
public void delFile(final Map<String, File> files, final DelComPressCallBack callBack) {
if (files == null || files.size() <= 0)
return;
MyTask.runInBackground(true, new Runnable() {
@Override
public void run() {
for (String key : files.keySet()) {
if (files.get(key).exists())
if (!files.get(key).delete())
callBack.fail();

}
callBack.success();
}
});
}

public void delFile(final Map<String, File> files) {
if (files == null || files.size() <= 0)
return;
MyTask.runInBackground(true, new Runnable() {
@Override
public void run() {
for (String key : files.keySet()) {
if (files.get(key).exists())
files.get(key).delete();
}
}
});
}

public void delFile(final File files, final DelComPressCallBack callBack) {
if (files == null)
return;
MyTask.runInBackground(true, new Runnable() {
@Override
public void run() {
if (!files.delete())
callBack.fail();
callBack.success();
}
});
}

public void delFile(final File files) {
if (files == null)
return;
MyTask.runInBackground(true, new Runnable() {
@Override
public void run() {
files.delete();
}
});
}

public interface CompressFinishCallBack<T> {
/**
* 開始壓縮圖片
*
* @param msg 提示
*/
void compressStart(String msg);

/**
* 圖片壓縮完成
*
* @param files
*/
void compressFinish(T files);

/**
* 圖片壓縮失敗
*
* @param msg 提示
*/
void compressError(String msg);
}

public interface DelComPressCallBack {
void success();

void fail();
}

}

使用工具類 ImgCompressUtils
使用方法
ImgCompressUtils.getInstance().compress(context, 300, photoPathList, files, new ImgCompressUtils.CompressFinishCallBack() {
@Override
public void compressStart(String msg) {
LogUtils.i(msg);
context.showMsg(msg);
}

@Override
public void compressFinish(List<File> files) {
Map<String, File> compressFiles = new HashMap<String, File>();
if (files != null && files.size() > 0) {
LogUtils.i("壓縮完圖片集合為:");
context.showMsg("圖片壓縮完成");

for (File temp : files) {
LogUtils.i("圖片大小:" + temp.length() / 1000 + "K");
compressFiles.put(temp.getAbsolutePath(), temp);
}
context.showMsg("圖片開始上傳");
LogUtils.e("圖片開始上傳");
}
//上傳資料
}

@Override
public void compressError(String msg) {
LogUtils.i(msg);
context.showMsg(msg);
}
});

//上傳資料成功回撥(刪除壓縮的圖片)
方式一:
ImgCompressUtils.getInstance().delFile(compressFiles, new ImgCompressUtils.DelComPressCallBack() {
@Override
public void success() {
LogUtils.i("刪除成功");
}

@Override
public void fail() {
LogUtils.i("刪除失敗");
}
});
方式二:
ImgCompressUtils.getInstance().delFile(compressFiles);