首页 > 其他 > 详细

高效地加载图片(一) 高效地加载大图

时间:2014-04-29 01:24:13      阅读:340      评论:0      收藏:0      [点我收藏+]

1.Read Bitmap Dimensions and Type 读取图片的尺寸和类型

  1. //创建一个Options,用于保存图片的参数   
  2.   
  3. BitmapFactory.Options options = new BitmapFactory.Options();   
  4.   
  5. //设置是否只读取图片的参数信息   
  6.   
  7. options.inJustDecodeBounds = true;   
  8.   
  9. //由于inJustDecodeBounds被设置为了true,此处只会获得图片的参数信息   
  10.   
  11. //而不会读取到Bitmap对象,也就不会占用内存   
  12.   
  13. BitmapFactory.decodeResource(getResources(), R.id.myimage, options);   
  14.   
  15. //获得图片的宽高以及类型   
  16.   
  17. int imageHeight = options.outHeight;   
  18.   
  19. int imageWidth = options.outWidth;   
  20.   
  21. String imageType = options.outMimeType;   

为了避免java.lang.OutOfMemory异常,在将一张图片解析为Bitmap对象之前,一定要检查它的尺寸.

2.Load a Scaled Down Version into Memory 加载经过缩放的图片到内存中

既然我们已经知道了图片的尺寸,我们就知道是否有必要将原图加载到内存中.我们可以有选择的将图片经过缩放后再加载到内存中.

需要考虑的因素有以下几点:

1.预估加载原图需要的内存大小

2.你愿意给这张图片分配的内存大小

3.要显示这张图片的控件的尺寸大小

4.手机屏幕的大小以及当前设备的屏幕密度

举例说明,如果你想要显示一张128×96像素的缩略图,则加载一张1024×768像素的图片是没有必要的.

为了告诉解码器去加载一张经过缩放的图片,需要设置BitmapFactory.Options的inSampleSize参数.

例如:一张图片的原始大小是2048×1536,如果将inSampleSize设置为4,则此时加载的图片大小为512×384,加载经过缩放后的图片只需要0.75MB的内存控件而不是加载全图时需要的12MB.

以下是一个计算inSampleSize的方法:

  1. public static int calculateInSampleSize(  
  2.             BitmapFactory.Options options, int reqWidth, int reqHeight) {  
  3.     // Raw height and width of image  
  4.     // 图片的原始宽高  
  5.     final int height = options.outHeight;  
  6.     final int width = options.outWidth;  
  7.     // 默认缩放比例为1  
  8.     int inSampleSize = 1;  
  9.   
  10.     // 如果原始宽高其中之一大于指定的宽高,则需要计算缩放比例  
  11.     // 否则,直接使用原图  
  12.     if (height > reqHeight || width > reqWidth) {  
  13.   
  14.         // 将图片缩小到一半  
  15.         final int halfHeight = height / 2;  
  16.         final int halfWidth = width / 2;  
  17.   
  18.         // Calculate the largest inSampleSize value that is a power of 2 and keeps both  
  19.         // height and width larger than the requested height and width.  
  20.         // 计算inSampleSize的值,该值是2的次方,并且能够保证图片的宽高大于指定的宽高  
  21.         while ((halfHeight / inSampleSize) > reqHeight  
  22.                 && (halfWidth / inSampleSize) > reqWidth) {  
  23.             inSampleSize *= 2;  
  24.         }  
  25.     }  
  26.   
  27.     return inSampleSize;  
  28. }  

要想使用上述方法,首先要讲inJustDecodeBounds设置为true,读取到图片的尺寸信息,再经过计算得到的inSampleSize去解析图片

  1. public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,  
  2.         int reqWidth, int reqHeight) {  
  3.   
  4.     // First decode with inJustDecodeBounds=true to check dimensions  
  5.     // 此处将inJustDecodeBounds设置为true,则只解析图片的尺寸等信息,而不生成Bitmap  
  6.     final BitmapFactory.Options options = new BitmapFactory.Options();  
  7.     options.inJustDecodeBounds = true;  
  8.     BitmapFactory.decodeResource(res, resId, options);  
  9.   
  10.     // Calculate inSampleSize  
  11.     // 此处计算需要的缩放值inSampleSize  
  12.     options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);  
  13.   
  14.     // Decode bitmap with inSampleSize set  
  15.     //将inJustDecodeBounds设置为false,以便于解析图片生成Bitmap  
  16.     options.inJustDecodeBounds = false;  
  17.     return BitmapFactory.decodeResource(res, resId, options);  
  18. }  


高效地加载图片(一) 高效地加载大图,布布扣,bubuko.com

高效地加载图片(一) 高效地加载大图

原文:http://www.cnblogs.com/chenchong/p/3692554.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!