Android 图片处理系列:图片压缩处理
由于公司主打的旅游产品,对图片处理的比较多,不仅要处理显示大批量的功能,还要有拍照上传和本地图片上传的功能,这就要求在上传之前需要对图片进行压缩处理,同时需要将照片的附加属性如:创建时间、经纬度等同时上传,所以就需要在把压缩前的图片属性写入压缩后的图片。
一般针对Android压缩图片 :
Android中有两种压缩图片的方法:
第一种是针对图片的长宽进行压缩,在将图片加载到内存过程中将图片的长宽进行压缩,获取长宽压缩版的的图片
第二种是针对图片的像素进行压缩,图片加载到内存后,针对图片质量进行压缩,会导致图片质量下降。
如果不了解上面两种该怎么去进行的可以看这篇文章,我就不再具体写了: http://www.jianshu.com/p/0f56f35068e2
如果不想用Android自带的压缩图片方式可以使用libjpeg库压缩,这就涉及到NDK方面,有兴趣可以看看这篇文章:http://blog.csdn.net/hqiong208/article/details/53667661
先进行长宽压缩:
/**
* 根据路径获得突破并压缩返回bitmap用于显示
* @param filePath 图片的路径 需要压缩图片的路径
* @param reqWidth 要求的图片的像素 根据主流一般720*1280
* @param reqHeight 要求的图片的像素
* @return
*/
public static Bitmap getBitmap(String filePath,int reqWidth, int reqHeight) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, options);
options.inSampleSize = inSampleSize(options, reqWidth, reqHeight);
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(filePath, options);
}
public static int inSampleSize(BitmapFactory.Options options,int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (width<=height){//竖屏拍照
if (height > reqHeight || width > reqWidth) {
final int heightRatio = Math.round((float) height
/ (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
}else {//横屏
if (height > reqWidth || width > reqHeight) {
final int heightRatio = Math.round((float) height
/ (float) reqWidth);
final int widthRatio = Math.round((float) width / (float) reqHeight);
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
}
return inSampleSize;
}
再进行质量压缩,quality(0~100) 自己指定,一般60到70就好,并不会太失真
/**
* @param file 压缩后的图片文件
* @param bm
* @return
*/
public static void saveBitmap(Bitmap bm, File file) {//质量
try {
FileOutputStream out = new FileOutputStream(file);
bm.compress(Bitmap.CompressFormat.JPEG, 70, out);
out.flush();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
写入图片属性:采用的是ExifInterface,代码有点多就不贴了,其实也很简单主要就是getAttribute,setAttribute,saveAttributes,不了解可以查查,非常简单。
当然具体情况具体分析,如果是拍照上传,一般都是1M以上,长宽质量都要压缩,但是本地图片上传,有的只有100多k或更小,那么质量压缩是否可以不要压缩或者 quality设置更高一点,这需要根据实际来判断。
实际达到的效果,拍照后2、3M的照片压缩后只有200k左右,基本不失真。
最后推荐一种压缩格式WebP,亲身体检在相同方式下WebP格式压缩会比Jpng更小接近一倍的体积,而且效果差不多。可以看看这篇文章:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0527/4302.html