图片尺寸过大
获取图片大小、MIME
BitmapFactory提供了多个解析方法(decodeByteArray, decodeFile, decodeResource,decodeStream等)用于从网络、文件、资源文件等中解析Bitmap对象。这些方法都可以传入BitmapFactory.Options对象来来设置解析时的参数,把Options对象的inJustDecodeBounds设为true,解析时就只会把图片的长宽和MIME值保存到Options对象,而不解析Bitmap对象。
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;
计算压缩比例,并压缩
获取了图片的大小后,与要显示的控件如ImageView的大小进行比较,计算压缩比例,把比例赋值给Options对象的inSampleSize字段,然后把inJustDecodeBounds置为false,继续使用BitmapFactory的对应的decodeXXX方法,应用Options对象的参数,就可以得到压缩后的Bitmap。
注意,计算压缩比例时要向上取整,int/int会取整,很可能导致缩放比例没有变!
Math.floor,Math.ceil,Math.rint,Math.round用法详解
缓存图片
LruCache,可以分为内存缓存,磁盘缓存
相关阅读:Android高效加载大图、多图解决方案,有效避免程序OOM
Bitmap实现剪切、旋转、缩放
位图格式
private static Config sConfigs[] = {
null, ALPHA_8, null, RGB_565, ARGB_4444, ARGB_8888
};
- APLAHA_8:透明频段、高效、No color imfomation、每像素一字节
- RGB_565:每像素2字节、RGB频段、5bits存red、6bits存green、5bits存blue、适用不透明、不要求高色彩保真度
- ARGB_8888:每像素4字节、每个频段(ARGB)占8bits
- ARGB_4444:每像素2字节,已被ARGB_8888取代
图片下载隐患
这个隐患是下载通用的,从输入流读取数据,不要直接全写入内存(ByteArrayOutputStream),文件或图片过大会导致OOM。一般定义一个合适缓冲区,直接写到文件里面,虽然增加IO,影响性能,但其实也是一种以时间换空间的方法。
图像压缩
图像格式主要有四种:PNG、VectorDrawable、JPG、WebP
PNG压缩
- Android资源打包工具(AAPT),会对PNG进行压缩处理
- 如果图像色彩较单一,可降低色彩位数
- 搜索PNG压缩优化软件
- 通过代码描绘图像
- 矢量图代替PNG,进一步,矢量图转换为VectorDrawable
VectorDrawable
矢量图形的好处是放大不会失真,可以适应不同分辨率的屏幕,尽量使用。
JPG压缩
一般不推荐JPG
1. 降低JPG图像的质量
2. JPG 压缩优化工具
WebP
强烈推荐使用WebP图像来替换PNG和JPG图像,可以使用WebpifyYourAndroidApp来把PNG和JPG转为WebP
总结
整体来说:VectorDrawable>WebP>PNG>JPG
相关阅读:图像压缩