Bitmap相关

一、存储格式

当界面显示图片时,不时按图片大小计算,而是按(像素点的多少*每个像素点占用的空间大小)来计算的。将图片加载到内存中,是将图片中的每个像素点都加载到内存中,下面我们就来看看config的三种像素ARGB_4444、ARGB_8888、RGB_565

(1)ARGB_4444:A(alpha)占4位,R(red)占4位,G(Green)占四位,B(Blue)占四位,每个像素点占16位,也就是2字节的内存,同时存储位图的透明度和颜色。但该精度的位图质量较差,官方不推荐

(2)ARGB_8888:A(alpha)占八位,R(red)占八位,G(Green)占八位,B(Blue)占八位,每个像素点占32位,也就是4字节的内存,同时存储透明度和颜色。如果一个480*800的位图设置了此类型,那它占用的内存空间480*800*4/1024*1024=1.46M

3)RGB_565:R(red)占5位,G(Green)占6位,B(Blue)占5位,每个像素点占16位,相当于2个字节的内存,只存储了颜色

二、inSampleSize(采样率),如下图,源码中已经有详细介绍

如采用ARGB8888的存储格式,一个1024*1024*4,也就是4M大小的图片,采样率为2,所占用内存为512*512*4大小,也就是占用了1M内存

《Bitmap相关》

如何选取inSampleSize的值呢?

如果ImageView要求的大小为100*100,如果图片大小为200*200,那么insampleSize设置为2,图片大小变为100*100;如果图片大小为200*300,inSampleSize=2的话,图片大小变为100*150,inSampleSize=3的话,图片大小变为66*100,那么相对于100*100,图片就有拉伸的效果,效果不好 

获取采样率,遵循如下流程:

1)将BitmapFactory.Options的inJustDecodeBounds参数设为true并加载图片

《Bitmap相关》

2)从BitmapFactory.Options中取出图片的原始宽高信息

3)根据采样率的规则并结合目标view的所需大小计算出采样率

4)将BitmapFactory.Options的inJustDecodeBounds设为false,然后重新加载图片

详细代码我会上传github,见https://github.com/wintersweett/App,里的BitmapUtis中方法

具体代码详见https://github.com/wintersweett/App.git中的BitmapUtils类

    原文作者:紫苑草
    原文地址: https://www.jianshu.com/p/779e1ba611f3
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞