Android中如何进行图片压缩处理
一、我遇到的问题
工作中遇到的问题,有天领导让我把工程中所有需要上传图片的部分都要进行优化,把图片压缩后上传。我上网查了下发现有两种方式。一、质量压缩二、尺寸压缩。
二、网上的错误之处
关于这两个压缩的具体定义我就不多描述了,但是我查阅资料的时候发现网上好多文章都存在误解。大多数就认为先进行尺寸压缩后再进行质量压缩,后一步是无效。其实,这个说法是错误的,我为什么这样说呢?因为就算是先进行尺寸压缩再进行质量压缩也是有效的。
三、Android中图片的存在形式。
一、文件形式(即以二进制形式存于硬盘上)二、流的形式三、bitmap形式。三种形式的区别:文件和流的形式对图片体积大小并没有影响,也就是说,如果你手机SD卡上的如果是100K,那么通过流的形式都到内存也是100K。但是当图片以bitmap形式存在时,其占用的内存会瞬间变大。这也就造成了当进行质量压缩后return bitmap形式后觉得压缩无效的错觉。重点就在于你return的是bitmap!
四、下面贴出我写的图片压缩代码(用了两种压缩方式)
public class BitmapCompress {
public static byte[] BitmapCompressToString(String srcPath) {
Bitmap bmp = compressImageFromFile(srcPath);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
int options = 100;
while (baos.toByteArray().length / 1024 > 150) {
options -= 10;// 每次都减少10
// 循环判断如果压缩后图片是否大于150kb,大于继续压缩
baos.reset();// 重置baos即清空baos
bmp.compress(Bitmap.CompressFormat.JPEG, options, baos);
Log.d("ROTK","baos"+baos.toByteArray().length);
// 这里压缩options%,把压缩后的数据存放到baos中
}
byte[] b = baos.toByteArray();
return b;
}
private static Bitmap compressImageFromFile(String srcPath) {
BitmapFactory.Options newOpts = new BitmapFactory.Options();
newOpts.inJustDecodeBounds =true;// 只读边,不读内容
Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
newOpts.inJustDecodeBounds =false;
int w = newOpts.outWidth;
int h = newOpts.outHeight;
float hh = 800f;//
float ww = 480f;//压缩为800*480的尺寸
int be = 1;
if (w > h && w > ww) {
be = (int) (newOpts.outWidth / ww);
} else if (w < h && h > hh) {
be = (int) (newOpts.outHeight / hh);
}
if (be <= 0)
be = 1;
newOpts.inSampleSize = be;// 设置采样率
newOpts.inPreferredConfig = Config.ARGB_8888;// 该模式是默认的,可不设
newOpts.inPurgeable =true;// 同时设置才会有效
newOpts.inInputShareable =true;// 。当系统内存不够时候图片自动被回收
bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
return bitmap;//这里输出的事bitmap因为我们还要进行质量压缩的
}
}
恩,以上!