《android开发艺术探索》笔记之Bitmap的加载和Cache

《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。
今天就写这么多,想吐槽的是段落首行缩进竟然没用


你可能感兴趣的:(《android开发艺术探索》笔记之Bitmap的加载和Cache)