項目中常常遇到文件壓縮問題,上傳文件大小限制
今天簡單的分享一點干貨,文件壓縮,圖片壓縮,壓縮Bitmap
主要通過尺寸壓縮和質量壓縮,以達到清晰度最優
效果圖
源碼地址: https://github.com/DickyQie/android-util
工具類代碼
public class CompressHelper { private static volatile CompressHelper INSTANCE; private Context context; /** * 最大寬度,默認為720 */ private float maxWidth = 720.0f; /** * 最大高度,默認為960 */ private float maxHeight = 960.0f; /** * 默認壓縮后的方式為JPEG */ private Bitmap.CompressFormat compressFormat = Bitmap.CompressFormat.JPEG; /** * 默認的圖片處理方式是ARGB_8888 */ private Bitmap.Config bitmapConfig = Bitmap.Config.ARGB_8888; /** * 默認壓縮質量為80 */ private int quality = 80; /** * 存儲路徑 */ private String destinationDirectoryPath; /** * 文件名前綴 */ private String fileNamePrefix; /** * 文件名 */ private String fileName; public static CompressHelper getDefault(Context context) { if (INSTANCE == null) { synchronized (CompressHelper.class) { if (INSTANCE == null) { INSTANCE = new CompressHelper(context); } } } return INSTANCE; } private CompressHelper(Context context) { this.context = context; destinationDirectoryPath = context.getCacheDir().getPath() + File.pathSeparator + FileUtil.FILES_PATH; } /** * 壓縮成文件 * @param file 原始文件 * @return 壓縮后的文件 */ public File compressToFile(File file) { return BitmapUtil.compressImage(context, Uri.fromFile(file), maxWidth, maxHeight, compressFormat, bitmapConfig, quality, destinationDirectoryPath, fileNamePrefix, fileName); } /** * 壓縮為Bitmap * @param file 原始文件 * @return 壓縮后的Bitmap */ public Bitmap compressToBitmap(File file) { return BitmapUtil.getScaledBitmap(context, Uri.fromFile(file), maxWidth, maxHeight, bitmapConfig); } /** * 采用建造者模式,設置Builder */ public static class Builder { private CompressHelper mCompressHelper; public Builder(Context context) { mCompressHelper = new CompressHelper(context); } /** * 設置圖片最大寬度 * @param maxWidth 最大寬度 */ public Builder setMaxWidth(float maxWidth) { mCompressHelper.maxWidth = maxWidth; return this; } /** * 設置圖片最大高度 * @param maxHeight 最大高度 */ public Builder setMaxHeight(float maxHeight) { mCompressHelper.maxHeight = maxHeight; return this; } /** * 設置壓縮的后綴格式 */ public Builder setCompressFormat(Bitmap.CompressFormat compressFormat) { mCompressHelper.compressFormat = compressFormat; return this; } /** * 設置Bitmap的參數 */ public Builder setBitmapConfig(Bitmap.Config bitmapConfig) { mCompressHelper.bitmapConfig = bitmapConfig; return this; } /** * 設置壓縮質量,建議80 * @param quality 壓縮質量,[0,100] */ public Builder setQuality(int quality) { mCompressHelper.quality = quality; return this; } /** * 設置目的存儲路徑 * @param destinationDirectoryPath 目的路徑 */ public Builder setDestinationDirectoryPath(String destinationDirectoryPath) { mCompressHelper.destinationDirectoryPath = destinationDirectoryPath; return this; } /** * 設置文件前綴 * @param prefix 前綴 */ public Builder setFileNamePrefix(String prefix) { mCompressHelper.fileNamePrefix = prefix; return this; } /** * 設置文件名稱 * @param fileName 文件名 */ public Builder setFileName(String fileName) { mCompressHelper.fileName = fileName; return this; } public CompressHelper build() { return mCompressHelper; } } }
使用
File oldFile = CompressHelper.getDefault(getApplicationContext()).compressToFile(file);
自定義屬性使用
File newFile = new CompressHelper.Builder(this) .setMaxWidth(720) // 默認最大寬度為720 .setMaxHeight(960) // 默認最大高度為960 .setQuality(80) // 默認壓縮質量為80 .setFileName(yourFileName) // 文件名稱 .setCompressFormat(CompressFormat.JPEG) // 設置默認壓縮為jpg格式 .setDestinationDirectoryPath(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES).getAbsolutePath())//路徑 .build() .compressToFile(oldFile);
該案例參考了: