package com.movitech.johnson.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
public class ImageCompressUtils {
public static final int FILE_SIZE = 3 * 1024; // kb
public static final int FILE_SIZE_BYTE = 3 * 1024 * 1024;
public static String getThumbUploadPath(String oldPath, int bitmapMaxWidth) throws Exception {
if (getFileSize(oldPath) < FILE_SIZE_BYTE) {
return oldPath;
}
String newPath = oldPath.substring(0, oldPath.lastIndexOf(".")) + "_resize"
+ oldPath.substring(oldPath.lastIndexOf("."), oldPath.length());
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(oldPath, options);
int height = options.outHeight;
int width = options.outWidth;
int reqHeight = 0;
int reqWidth = bitmapMaxWidth;
reqHeight = (reqWidth * height) / width;
// 在内存中创建bitmap对象,这个对象按照缩放大小创建
options.inSampleSize = calculateInSampleSize(options, bitmapMaxWidth, reqHeight);
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(oldPath, options);
Bitmap bbb = compressImage(Bitmap.createScaledBitmap(bitmap, bitmapMaxWidth, reqHeight, false));
return saveImg(bbb, newPath);
}
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
if (width > height) {
inSampleSize = Math.round((float) height / (float) reqHeight);
} else {
inSampleSize = Math.round((float) width / (float) reqWidth);
}
}
return inSampleSize;
}
public static Bitmap compressImage(Bitmap image) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 80, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
int options = 100;
while ((baos.toByteArray().length / 1024 > FILE_SIZE) && options > 10) { // 循环判断如果压缩后图片是否大于3
// *
// 1024
// kb,大于继续压缩
options -= 10;// 每次都减少10
baos.reset();// 重置baos即清空baos
image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options%,把压缩后的数据存放到baos中
}
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把压缩后的数据baos存放到ByteArrayInputStream中
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);// 把ByteArrayInputStream数据生成图片
return bitmap;
}
public static String saveImg(Bitmap b, String newPath) throws Exception {
File mediaFile = new File(newPath);
mediaFile.createNewFile();
FileOutputStream fos = new FileOutputStream(mediaFile);
b.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.flush();
fos.close();
b.recycle();
b = null;
System.gc();
return mediaFile.getPath();
}
public static int getFileSize(String path) {
int fileSize = 0;
FileInputStream fis;
try {
fis = new FileInputStream(path);
fileSize = fis.available();
return fileSize;
} catch (FileNotFoundException e) {
e.printStackTrace();
return fileSize;
} catch (IOException e) {
e.printStackTrace();
return fileSize;
}
}
}