如何高效的加载Bitmap

来源:互联网 发布:python 异步http请求 编辑:程序博客网 时间:2024/05/16 09:08

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;
 }




2 0
原创粉丝点击