Android图片加载须知

图片尺寸过大


获取图片大小、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实现剪切、旋转、缩放


Android图像处理之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压缩

  1. Android资源打包工具(AAPT),会对PNG进行压缩处理
  2. 如果图像色彩较单一,可降低色彩位数
  3. 搜索PNG压缩优化软件
  4. 通过代码描绘图像
  5. 矢量图代替PNG,进一步,矢量图转换为VectorDrawable

VectorDrawable

矢量图形的好处是放大不会失真,可以适应不同分辨率的屏幕,尽量使用。

JPG压缩

一般不推荐JPG
1. 降低JPG图像的质量
2. JPG 压缩优化工具

WebP

强烈推荐使用WebP图像来替换PNG和JPG图像,可以使用WebpifyYourAndroidApp来把PNG和JPG转为WebP

总结

Android图片加载须知_第1张图片

整体来说:VectorDrawable>WebP>PNG>JPG
相关阅读:图像压缩

Bitmap内存优化


Android性能优化之Bitmap的内存优化

你可能感兴趣的:(Android进阶)