如何高效的加载Bitmap

本文详细介绍了如何使用BitmapFactory类高效地加载图像并利用BitmapFactory.Options进行内存优化,包括生成Bitmap的方法、如何避免OOM错误及计算Sample图片大小的技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值