如何高效的加载Bitmap

Bitmap是Android系统中的图像处理的最重要类之一。用它可以获取图像文件信息,对图像进行剪切、旋转、缩放等操作,并可以指定格式保存图像文件。

一、Bitmap的生成

BitmapFactory 类提供了一些decode的方法 
BitmapFactory.decodeByteArray(byte[] data, int offset, int length)
BitmapFactory.decodeFile(String pathName)
BitmapFactory.decodeFile(String pathName)
BitmapFactory.decodeFile(String pathName)
BitmapFactory.decodeResourceStream(Resources res, TypedValue value, InputStream is, Rect pad, Options opts)
BitmapFactory.decodeStream(InputStream is, Rect outPadding, Options opts)

可以从不同的资源中创建Bitmap. 根据你的图片数据源来选择合适的decode法. 

但是如何高效的加载Bitmap呢?同时又避免OOM呢?
 每 种decode法都提供了通过BitmapFactory.Options 来设置一些附加的标记来指定decode的 选项。
 设置inJustDecodeBounds 属性为true时,在加载的过程中可以避免内存的分配, 它会 返回一个空的bitmap即null, 但是 可以获取图片的宽度(outWidth), 高度(outHeight )与 类型(outMimeType) 。
 这个技 术片可以在构造bitmap之前优先读图片的尺寸与类型。


代码如下:

BitmapFactory.Options options = new BitmapFactory.Options();
 options.inJustDecodeBounds = true;
 BitmapFactory.decodeResource(getResources(), R.drawable.demo, options);
 int outHeight = options. outHeight;
 int outWidth= options. outWidth;
 String outMimeType = options. outMimeType;


接着我们可以 加载一个按照比例缩小的版本的图片到内存中:
我们通过设置BitmapFactory.Options 中设置 inSampleSize 的值,来告诉decoder去加载
多少比例的图片,举一个例子:
如果一个图片的分辨率为200*200像素,设置inSampleSize 的值为4,那么加载图片的大概为50*50像素,消耗的内存一定程度上得到优化。
下面有一段根据目标图片大小来计算Sample图片大小的Sample Code:(官网的例子)
public static int calculateInSampleSize(BitmapFactory.Options options,
   int reqWidth, int reqHeight) {
  // Raw height and width of image
  final int height = options.outHeight;
  final int width = options.outWidth;
  int inSampleSize = 1;
  if (height > reqHeight || width > reqWidth) {
   final int halfHeight = height / 2;
   final int halfWidth = width / 2;
   // Calculate the largest inSampleSize value that is a power of 2 and
   // keeps both
   // height and width larger than the requested height and width.
   while ((halfHeight / inSampleSize) > reqHeight
     && (halfWidth / inSampleSize) > reqWidth) {
    inSampleSize *= 2;
   }
  }
  return inSampleSize;
 }




你可能感兴趣的:(如何高效的加载Bitmap)