package com.sxjs.common.util.imagecompress; import android.content.Context; import android.graphics.Bitmap; import android.net.Uri; import java.io.File; import java.util.concurrent.Callable; import io.reactivex.Observable; import io.reactivex.ObservableSource; /** * Created on : June 18, 2016 */ public class ImageCompressor { private static volatile ImageCompressor INSTANCE; private Context context; //max width and height values of the compressed image is taken as 612x816 private float maxWidth = 1280.0f; private float maxHeight = 1280.0f; private Bitmap.CompressFormat compressFormat = Bitmap.CompressFormat.JPEG; private Bitmap.Config bitmapConfig = Bitmap.Config.ARGB_8888; private int quality = 70; private String destinationDirectoryPath; private String fileNamePrefix; private String fileName; private ImageCompressor(Context context) { this.context = context.getApplicationContext(); destinationDirectoryPath = context.getExternalCacheDir().getAbsolutePath() + File.pathSeparator + FileUtil.FILES_PATH; } public static ImageCompressor getDefault(Context context) { if (INSTANCE == null) { synchronized (ImageCompressor.class) { if (INSTANCE == null) { INSTANCE = new ImageCompressor(context); } } } return INSTANCE; } /** * 默认在UI线程执行 请在子线程执行此方法 * @param file * @return */ public File compressToFile(File file) { return ImageUtil.compressImage(context, Uri.fromFile(file), maxWidth, maxHeight, compressFormat, bitmapConfig, quality, destinationDirectoryPath, fileNamePrefix, fileName); } /** * 默认在UI线程执行 请在子线程执行此方法 * @param file * @return */ public Bitmap compressToBitmap(File file) { return ImageUtil.getScaledBitmap(context, Uri.fromFile(file), maxWidth, maxHeight, bitmapConfig); } /** * 使用defer操作符 待订阅后再开始压缩任务 * @param file * @return */ public Observable<File> compressToFileAsObservable(final File file) { return Observable.defer(new Callable<ObservableSource<? extends File>>() { @Override public Observable<File> call() { return Observable.just(compressToFile(file)); } }); } public Observable<Bitmap> compressToBitmapAsObservable(final File file) { return Observable.defer(new Callable<ObservableSource<? extends Bitmap>>() { @Override public Observable<Bitmap> call() { return Observable.just(compressToBitmap(file)); } }); } public static class Builder { private ImageCompressor imageCompressor; public Builder(Context context) { imageCompressor = new ImageCompressor(context); } public Builder setMaxWidth(float maxWidth) { imageCompressor.maxWidth = maxWidth; return this; } public Builder setMaxHeight(float maxHeight) { imageCompressor.maxHeight = maxHeight; return this; } public Builder setCompressFormat(Bitmap.CompressFormat compressFormat) { imageCompressor.compressFormat = compressFormat; return this; } public Builder setBitmapConfig(Bitmap.Config bitmapConfig) { imageCompressor.bitmapConfig = bitmapConfig; return this; } public Builder setQuality(int quality) { imageCompressor.quality = quality; return this; } public Builder setDestinationDirectoryPath(String destinationDirectoryPath) { imageCompressor.destinationDirectoryPath = destinationDirectoryPath; return this; } public Builder setFileNamePrefix(String prefix) { imageCompressor.fileNamePrefix = prefix; return this; } public Builder setFileName(String fileName) { imageCompressor.fileName = fileName; return this; } public ImageCompressor build() { return imageCompressor; } } }