图片压缩分为质量压缩和尺寸压缩,前者更改图片分辨率,不改变图片尺寸,后者着重于更改图尺寸(宽高)
尺寸压缩:通过计算BitmapFactory.Options 的 inSampleSize 得到较大大小的压缩图片bitmap,这种很容易造成oom,压缩后也有1-2M
质量压缩:根据设置压缩质量可将5M图片压缩到100KB下,尺寸不会改变
ByteArrayOutputStream bStream = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 60, bStream);//60:图片压缩质量,100为不压缩,将压缩数据放到流中
通过尺寸压缩得到bitmap,.compress方法写入ByteArrayOutputStream中,.toByteArray()得到字节数组,写入文件
下面例子是通过将压缩后得到的流数据写入缓存文件,上传的文件
<span style="font-size:18px;">package com.bdyl.utils;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.util.Log;
import android.view.Display;
import com.bdyl.constance.Logs;
import com.loopj.android.http.Base64;
public class BitmapUtils {
//计算压缩比例
private static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
// 源图片的宽度
int width = options.outWidth;
int height = options.outHeight;
int inSampleSize = 3;
if (width > reqWidth && height > reqHeight) {
// 计算出实际宽度和目标宽度的比率
int widthRatio = Math.round((float) width / (float) reqWidth);
int heightRatio = Math.round((float) height / (float) reqHeight);
inSampleSize = Math.max(widthRatio, heightRatio);
}
return inSampleSize;
}
/*
* compress pic by bitmap.compress();and save to cacheFile </span>
<span style="font-size:18px;"><span style="white-space:pre"> </span> * pathName 选中图片的全路径
* return cacheFile path
*/
public static File compressToFile(Activity context, String pathName) {
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;//设置为true,调用decode不会被解析,直接得到他的原始尺寸
BitmapFactory.decodeFile(pathName, opts);
// 调用上面定义的方法计算inSampleSize值
Display display = context.getWindowManager().getDefaultDisplay();
opts.inSampleSize = calculateInSampleSize(opts, display.getHeight(),
display.getWidth());
// 使用获取到的inSampleSize值再次解析图片
opts.inJustDecodeBounds = false;//记得设置为false
Bitmap bitmap = BitmapFactory.decodeFile(pathName, opts);
ByteArrayOutputStream bStream = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 60, bStream);// 60:压缩质量100 代表不压缩
int option = 50;
while (bStream.toByteArray().length / 1024 > 100) {//压缩后图片大小大于100kb,降低压缩质量,重新压缩
bStream.reset();//清空流数据
option -= 10;
bitmap.compress(Bitmap.CompressFormat.JPEG, option, bStream);// 这里压缩options%,把压缩后的数据存放到baos中
}
File file = new File(context.getCacheDir(),
new File(pathName).getName());
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
fos.write(bStream.toByteArray());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
bStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return file;//返回文件
}
}
</span>