问题来了,客户端拍出来的照片太大,普遍是2M-5M,所以客户端拍出来的照片需要经过压缩才能上传给服务器。
在网上寻找图像压缩的解决方案,最终暂定有三种方案:
第一种方案
由于PC端运行时用的是DGI图像接口,不能调用System.Drawing库,所以暂时否定第一种方案
第二种方案
理论
第三种方案由于需要付费,并且服务器稳定性不可控,暂定为优先级最低的方案,目前正在研究第二种方案
一、支持自定义配置、不失真和批量处理
二、图片上传为什么要压缩
1、图片服务器空间限制,磁盘昂贵
2、网络不稳定,大文件需要断点续传
3、尽可能避免安卓OOM异常
4、后台约定的规则<200KB
5、需要上传原图的应用有医院临床项目、金融银行
三、图片压缩流程
1、递归每张图片
2、设置图片格式 Bitmap.CompressFormat.JPG
png, jpg,webp
3、质量压缩bitmap.compress(format,quality,baos)
由于png是无损压缩,所以设置quality无效(不适合作为缩略图)
采样率压缩BitmapFactory.Options.inSampleSize
缩小图片分辨率,减少所占用磁盘空间和内存大小
缩放压缩canvas.drawBitmap(bitmap, null,rectF,null)
减少图片的像素,降低所占用磁盘空间大小和内存大小,可用于缓存缩略图
JNI调用JPEG库
Android的图片引擎使用的是阉割版的skia引擎,去掉了图片压缩中的哈夫曼算法
4、像素修复
5、返回压缩
6、完成压缩
demo: https://github.com/ApeCold/Learn_Compress_Sample
参考:
Luban框架 https://github.com/Curzibn/Luban
缺点
1、当没有设定压缩路径时,抛异常无闪退
2、源码中,压缩比率固定值60,无法修改
3、压缩配置,参数不太适应真实项目需求
4、不能指定压缩大小,比如100KB以内
https://github.com/zetbaitsu/Compressor
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)