1.可以直接拷贝用的代码
private void encode(String path) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//输出流baos
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;//整体宽高压缩到1/4
// options.inPreferredConfig = Bitmap.Config.RGB_565;//测试没有生效
Bitmap bm = BitmapFactory.decodeFile(path, options);
bm.compress(Bitmap.CompressFormat.JPEG, 20, baos);//图片质量20,效果可以
}
2.前言
如果着急使用代码,上面可以满足你了,具体学习可以看下了。
最近项目中和h5交互需要拍照上传图片,选择的方法是直接图片转换成base64作为一个参数上传。于是悲剧了。android手机拍照一般2M起步了。用户拍照然后上传2M,如果美图拍照更美丽就完全悲剧。
必须压缩必须丧心病狂的压缩。
3.android图片压缩原理
Bitmap所占用的内存 = 图片长度 x 图片宽度 x 一个像素点占用的字节数。
3个参数,任意减少一个的值,就达到了压缩的效果。
4.像素点减少
bm.compress(Bitmap.CompressFormat.JPEG, 20, baos);
此方法最有用,可以从0–100改变。测试20时候压缩效果可以,看到的图片清晰度也可以接受。
注意:JPEG可以压缩 ,png是不可以压缩的,所以必须保证图片是JPEG。具体文档如下
质量压缩20。压缩后剩余2%很强大
11-22 16:05:41.285 5119-5337/com.picc.nmms I/wechat: 压缩后图片的大小768k 宽度为502高度为392bytes.length= 9KB quality=20
11-22 16:05:41.285 5119-5337/com.picc.nmms I/wechat: file.length()=12k
RGB_565法
核心:选择RGB_565占用少的字节
其中,A代表透明度;R代表红色;G代表绿色;B代表蓝色。
ALPHA_8
表示8位Alpha位图,即A=8,一个像素点占用1个字节,它没有颜色,只有透明度
ARGB_4444
表示16位ARGB位图,即A=4,R=4,G=4,B=4,一个像素点占4+4+4+4=16位,2个字节
ARGB_8888
表示32位ARGB位图,即A=8,R=8,G=8,B=8,一个像素点占8+8+8+8=32位,4个字节
RGB_565
表示16位RGB位图,即R=5,G=6,B=5,它没有透明度,一个像素点占5+6+5=16位,2个字节
5.减少图片宽高。
采样率压缩;整体缩小图片的宽高缩小。例子中4。就是宽高都*1/4.
下面测试数据
1倍
11-22 15:58:57.985 32493-32668/com.picc.nmms I/wechat: 压缩后图片的大小768k宽度为502高度为392
11-22 15:58:58.035 32493-32668/com.picc.nmms I/wechat: 压缩后图片的大小768k 宽度为502高度为392bytes.length= 144KB
11-22 15:58:58.035 32493-32668/com.picc.nmms I/wechat: file.length()=194k
2倍 压缩后1/2
11-22 15:48:50.525 24633-25581/com.picc.nmms I/wechat: 压缩后图片的大小192k宽度为251高度为196
11-22 15:48:50.535 24633-25581/com.picc.nmms I/wechat: 压缩后图片的大小192k 宽度为251高度为196bytes.length= 46KB
11-22 15:48:50.545 24633-25581/com.picc.nmms I/wechat: file.length()=62k
4倍 压缩后1/4
11-22 15:50:36.375 26370-26720/com.picc.nmms I/wechat: 压缩后图片的大小47k宽度为125高度为98
11-22 15:50:36.385 26370-26720/com.picc.nmms I/wechat: 压缩后图片的大小47k 宽度为125高度为98bytes.length= 15KB
11-22 15:50:36.385 26370-26720/com.picc.nmms I/wechat: file.length()=20k
缩放法压缩:手动等比例压缩宽高
指定宽高:如果宽高比例知道,可以宽高设置10*10一定很小,前提是可以接受。
6.最终使用
最后使用的是
降低图片质量+采样率压缩
11-22 16:10:49.665 8695-9426/com.picc.nmms I/wechat: 压缩后图片的大小23k 宽度为125高度为98 bytes.length= 1KB quality=10
11-22 16:10:49.675 8695-9426/com.picc.nmms I/wechat: file.length()=2k
原始图片数据386k 宽度为502高度为392
压缩后上传的base64数据2k。压缩了99.5%太丧心病狂了。
不过图片质量就很难接受了
最后效果
使用手机拍照2.9M,最后上传34k。压缩了99%不过效果也不错。
11-22 17:11:03.236 19978-24506/com.picc.nmms I/wechat: 压缩前图片的大小2916k
11-22 17:11:03.310 19978-24506/com.picc.nmms I/wechat: file.length()=46k 宽度为648高度为1152 bytes.length= 34KB quality=10
压缩好强大,好厉害。以后自己保存图片也可以考虑这样压缩下了,又不是美女风景图那么高清完全就是浪费存储资源和网速了,压缩压缩在压缩,哈哈。