Android中BitmapFactory.Options详解

来源:互联网 发布:阿里云短信接口demo 编辑:程序博客网 时间:2024/05/22 03:46

 AndroidBitmapFactory.Options详解

Android中,BitmapFactory相信大家都很熟悉了,这个类里面的所有方法都是用来解码创建一个Bitmap,其中有一个重要的类是Options,此类用于解码Bitmap时的各种参数控制,那这里面的各种参数都是什么含义呢?今天我们就来重点解读几个参数。

inJustDecodeBounds

如果将这个值置为true,那么在解码的时候将不会返回bitmap,只会返回这个bitmap的尺寸。这个属性的目的是,如果你只想知道一个bitmap的尺寸,但又不想将其加载到内存时。这是一个非常有用的属性。

inSampleSize

这个值是一个int,当它小于1的时候,将会被当做1处理,如果大于1,那么就会按照比例(1 / inSampleSize)缩小bitmap的宽和高、降低分辨率,大于1时这个值将会被处置为2的倍数。例如,width=100height=100inSampleSize=2,那么就会将bitmap处理为,width=50height=50,宽高降为1 / 2,像素数降为1 / 4

inPreferredConfig

这个值是设置色彩模式,默认值是ARGB_8888,在这个模式下,一个像素点占用4bytes空间,一般对透明度不做要求的话,一般采用RGB_565模式,这个模式下一个像素点占用2bytes

inPremultiplied

这个值和透明度通道有关,默认值是true,如果设置为true,则返回的bitmap的颜色通道上会预先附加上透明度通道。

inDither

这个值和抖动解码有关,默认值为false,表示不采用抖动解码。如果想知道什么是抖动解码,请参看我另一篇文章:http://blog.csdn.net/haozipi/article/details/47185535

 

inDensity

表示这个bitmap的像素密度(对应的是DisplayMetrics中的densityDpi,不是density)。

inTargetDensity

表示要被画出来时的目标像素密度(对应的是DisplayMetrics中的densityDpi,不是density)。

inScreenDensity

表示实际设备的像素密度(对应的是DisplayMetrics中的densityDpi,不是density)。

inScaled

设置这个Bitmap是否可以被缩放,默认值是true,表示可以被缩放。

psinDensityinTargetDensityinScreenDensity三个值的具体关系请参看我的另一篇文章:http://blog.csdn.net/haozipi/article/details/47185917

inPurgeableinInputShareable

这两个值一般是一起使用,设置为true时,前者表示空间不够是否可以被释放,后者表示是否可以共享引用。这两个值在Android5.0后被弃用。

inPreferQualityOverSpeed

这个值表示是否在解码时图片有更高的品质,仅用于JPEG格式。如果设置为true,则图片会有更高的品质,但是会解码速度会很慢。

outWidthoutHeight

表示这个Bitmap的宽和高,一般和inJustDecodeBounds一起使用来获得Bitmap的宽高,但是不加载到内存。

,BitmapFactory.Options的使用是在加载图片时,就从图片的加载和使用说起

 

怎样获取图片的大小?

首先我们把这个图片转成Bitmap,然后再利用BitmapgetWidth()getHeight()方法就可以取到图片的宽高了。

新问题又来了,在通过BitmapFactory.decodeFile(String path)方法将突破转成Bitmap时,遇到大一些的图片,我们经常会遇到OOM(Out Of Memory)的问题。怎么避免它呢?

这就用到了我们上面提到的BitmapFactory.Options这个类。

 

BitmapFactory.Options这个类,有一个字段叫做 inJustDecodeBounds SDK中对这个成员的说明是这样的:

If set to true, the decoder will return null (no bitmap), but the out

也就是说,如果我们把它设为true,那么BitmapFactory.decodeFile(String path, Options opt)并不会真的返回一个Bitmap给你,它仅仅会把它的宽,高取回来给你,这样就不会占用太多的内存,也就不会那么频繁的发生OOM了。

示例代码如下:

 

BitmapFactory.Options options = new BitmapFactory.Options();  

options.inJustDecodeBounds = true;  

 

Bitmap bmp = BitmapFactory.decodeFile(path, options);/* 这里返回的bmpnull */  

这段代码之后,options.outWidth options.outHeight就是我们想要的宽和高了。

有了宽,高的信息,我们怎样在图片不变形的情况下获取到图片指定大小的缩略图呢?

比如我们需要在图片不变形的前提下得到宽度为200的缩略图。

那么我们需要先计算一下缩放之后,图片的高度是多少 ,代码如下

int height = options.outHeight * 200 / options.outWidth;  

options.outWidth = 200;  

options.outHeight = height;   

options.inJustDecodeBounds = false;  

Bitmap bmp = BitmapFactory.decodeFile(path, options);  

  

image.setImageBitmap(bmp);  

这样虽然我们可以得到我们期望大小的ImageView

但是在执行BitmapFactory.decodeFile(path, options);时,并没有节约内存。要想节约内存,还需要用到BitmapFactory.Options这个类里的inSampleSize 这个成员变量。

我们可以根据图片实际的宽高和我们期望的宽高来计算得到这个值。

options.inSampleSize = options.outWidth / 200; /*图片长宽方向缩小倍数*/  

另外,为了节约内存我们还可以使用下面的几个字段:

options.inDither=false;    /*不进行图片抖动处理*/  

options.inPreferredConfig=null;  /*设置让解码器以最佳方式解码*/  

/* 下面两个字段需要组合使用 */  

options.inPurgeable = true;  

options.inInputShareable = true;