《Android开发艺术探索》笔记之Bitmap的加载和Cache<一>
我放暑假前,就在图书馆借了一本《Android开发艺术探索》,这也是我看到很多人推荐的。之前我看的Android入门的书是郭婶的《第一行代码》,确实适合入门。进阶的书就选择了《Android开发艺术探索》,其实还有一本进阶的书也有很多人推荐,叫《Android群英传》。我之所以首先选择《Android开发艺术探索》,是因为这本书的作者是任玉刚,硕士毕业于中科大,而我在合肥上学。好吧,废话说的有点多。下面进入正题。
《Android开发艺术探索》总共有十五章,今天记的笔记是第12章Bitmap的加载和Cache,之所以先记这章是因为我刚好在学习图片处理和缓存,在写这篇博客之前,我也在网上看了其他人的讲解,各有侧重点。下面是我自己的理解。
Bitmap的高效加载
通过BitmapFactory.Options的inSampleSize参数(即采样率)来缩放图片。当inSampleSize大于1时,比如为2,那么采样后的图片的宽/高均为原图大小的1/2,像素数为原图的1/4.
官方给出代码是:
/**
* 获取压缩后的图片
* @param res
* @param resId
* @param reqWidth 所需图片压缩尺寸最小宽度
* @param reqHeight 所需图片压缩尺寸最小高度
* @return
*/
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int reqWidth, int reqHeight) {
// 首先不加载图片,仅获取图片尺寸
final BitmapFactory.Options options = new BitmapFactory.Options();
// 当inJustDecodeBounds设为true时,不会加载图片仅获取图片尺寸信息
options.inJustDecodeBounds = true;
// 此时仅会将图片信息会保存至options对象内,decode方法不会返回bitmap对象
BitmapFactory.decodeResource(res, resId, options);
// 计算压缩比例,如inSampleSize=4时,图片会压缩成原图的1/4
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// 当inJustDecodeBounds设为false时,BitmapFactory.decode...就会返回图片对象了
options. inJustDecodeBounds = false;
// 利用计算的比例值获取压缩后的图片对象
return BitmapFactory.decodeResource(res, resId, options);
}
/**
* 计算压缩比例值
* @param options 解析图片的配置信息
* @param reqWidth 所需图片压缩尺寸最小宽度
* @param reqHeight 所需图片压缩尺寸最小高度
* @return
*/
public static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
// 保存图片原宽高值
final int height = options. outHeight;
final int width = options. outWidth;
// 初始化压缩比例为1
int inSampleSize = 1;
// 当图片宽高值任何一个大于所需压缩图片宽高值时,进入循环计算系统
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
// 压缩比例值每次循环两倍增加,
// 直到原图宽高值的一半除以压缩值后都~大于所需宽高值为止
while ((halfHeight / inSampleSize) >= reqHeight
&& (halfWidth / inSampleSize) >= reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
inJustDecodeBounds参数:为true时,BitmapFactory只会解析图片的原始宽/高信息,并不会去真正的加载图片,这个操作是轻量级的;为false时,则会完全加载图片。
总结一下四种色彩样式:
ALPHA_8每个像素只要1字节,只能代表透明度,没有颜色属性
ARGB_4444每个像素要2字节,带透明的颜色
ARGB_8888 每个像素要4字节,带透明的颜色,默认色样
RGB_565每个像素要2字节,不带透明的颜色
例如:假定一张1024*1024像素的图片采用ARGB_8888格式存储,那么它占有的内存大小为1024*1024*4,即4MB,如果inSampleSize为2,那么采样后的图片其内存为512*512*4,即1MB。
今天就写这么多,想吐槽的是段落首行缩进竟然没用