[关闭]
@946898963 2022-11-10T02:50:00.000000Z 字数 3931 阅读 904

BitmapFactory.Option

Bitmap


1.public boolean inJustDecodeBounds

  • true,只是会解析图片的原始高度opt.outHeight、原始宽度信息opt.outWidth,并不会真正的加载图片(不会分配内存空间,避免内存溢出OOM),是一个轻量级的操作。
  • false,将申请分配内存,获取得到Bitmap对象。

当inJustDecodeBounds设置为true的时候,BitmapFactory通过decodeResource或者decodeFile解码图片时,将会返回空(null)的Bitmap对象,这样可以避免Bitmap的内存分配,但是它可以返回Bitmap的宽度、高度以及MimeType。

2.public int inSampleSize

默认或最小值为1,一般大于1,为2的幂,若不为2的幂,将会向下取整选择最接近的2的幂。该参数设置图片的缩放大小(压缩比)。如果面试被问到加载缩略图,要能回答到inSampleSize。

3.public boolean inPurgeable

当存储Pixel的内存空间在系统内存不足时是否可以被回收,(Android L Deprecated)

  • true,系统内存不足时,可以被回收
  • false,不能被回收

4.public boolean inInputShareable

inPurgeable为true情况下才生效,是否可以共享一个InputStream,(Android L Deprecated)。

设置是否深拷贝,与 inPurgeable 搭配使用。

  • inPurgeable - false ,该参数没有意义,被忽略。
  • inPurgeable - true,该参数为true,可以共享一个引用给输入数据(流、数组等);false-深拷贝

inPurgeable和inInputShareable这两个需要一起使用,BitmapFactory.java的源码里面有注释,大致意思是表示在系统内存不足时是否可以回收这个bitmap,有点类似软引用,但是实际在5.0(Android N)以后这两个属性已经被忽略,因为系统认为回收后再解码实际会反而可能导致性能问题。

5.public inPreferredConfig

表示图片解码时使用的颜色模式,也就是图片中每个像素颜色的表示方式。

参数inpreferredconfig的可选值有四个,分别为ALPHA_8,RGB_565,ARGB_4444,ARGB_8888。它们的含义列举如下。

参数取值 含义
ALPHA_8 图片中每个像素用一个字节(8位)存储,该字节存储的是图片8位的透明度值
RGB_565 图片中每个像素用两个字节(16位)存储,两个字节中高5位表示红色通道,中间6位表示绿色通道,低5位表示蓝色通道
ARGB_4444 图片中每个像素用两个字节(16位)存储,Alpha,R,G,B四个通道每个通道用4位表示
ARGB_8888 图片中每个像素用四个字节(32位)存储,Alpha,R,G,B四个通道每个通道用8位表示

Bitmap内存占用:拿一张1024*1024像素的图片来说,假定采用ARGB8888格式存储,那么它占用的内存为1024*1024*4,即4MB。

在对图片的要求不高的时候,我们可以使用RGB_565可以提高性能。

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

注意,如果inPreferredConfig不为null,解码器会尝试使用此参数指定的颜色模式来对图片进行解码,如果inPreferredConfig为null或者在解码时无法满足此参数指定的颜色模式,解码器会自动根据原始图片的特征以及当前设备的屏幕位深,选取合适的颜色模式来解码,例如,如果图片中包含透明度,那么对该图片解码时使用的配置就需要支持透明度,默认会使用ARGB_8888来解码。

关于Bitmap.Config的更多知识,建议阅读:Bitmap.Config

6.public int outWidth

获取图片的宽度值

7.public int outHeight

获取图片的高度值

8.public int inDensity

inDensity就Bitmap的像素密度,也就是Bitmap的成员变量mDensity,可以通过Bitmap#setDensity(int)设置。

9.public int inTargetDensity

是图片的目标像素密度

关于inDensity和inTargetDensity,建议阅读:BitmapFactory.Options中的inDensity和inTargetDensity

10.public boolean inScaled

设置这个Bitmap是否可以被缩放,默认值是true,表示可以被缩放,从inDensity到inTargetDensity

11.public boolean inMutable

配置Bitmap是否可以更改,比如:在Bitmap上隔几个像素加一条线段。

在Android开发中有时候我们需要获取一张图片为Bitmap,然后在这个bitmap上进行二次开发,比如new Canvas(Bitmap),然后再次在画布上进行绘制时就是对bitmap的二次开发,但是在newCanvas的时候,系统会判定bitmap对象是否是isMutable(是否可变)

  1. if (!bitmap.isMutable()) {
  2. throw new IllegalStateException("Immutable bitmap passed to Canvas constructor");
  3. }

如果不可变,将会抛出异常信息,另外在我们通过getPixel()获取图片信息后,在提过setPixel()设置时,如果bitmap是imMutable的也会抛出异常。

如果一个Bitmap不是Mutable的,可以通过相应的方法转换成Mutable的,或者在加载的时候就设置成Mutable的。

Android开发中的Bitmap的mutable和imMutable详解

12.public int inScreenDensity

当前屏幕的像素密度

13.public Bitmap inBitmap

这个参数用来实现Bitmap内存的复用,使用inBitmap参数前,每创建一个Bitmap对象都会分配一块内存供其使用,而使用了inBitmap参数后,多个Bitmap可以复用一块内存,这样可以提高性能。

务必阅读:BitmapFactory.Option中的inBitmap

14.public byte[] inTempStorage

创建临时文件,将图片存储,当在android设备中载入较大图片资源时,可以创建一些临时空间,将载入的资源载入到临时空间中,建议16K。

android BitmapFactory的内存溢出

15.public String outMimeType

图片的mime类型,这个属性标识了文件的具体mimeType类型,它的值是这种格式的 ”image/png”、”image/jpeg”、”image/gif”。我们根据这个mimeType就可以获取文件类型。

假设我们获取到了某个文件在本地的完整路径,那么,我们就可以根据下面的示例代码获知该文件的具体类型。
示例代码如下:

  1. //文件在本地的路径
  2. String filePath = file.getPath();
  3. BitmapFactory.Options options = new BitmapFactory.Options();
  4. options.inJustDecodeBounds = true;
  5. BitmapFactory.decodeFile(filePath, options);
  6. String mimeType = options.outMimeType;
  7. LogUtils.d(TAG, "图片类型1:" + mimeType);

Android:加载网图时精确获取图片格式

16.public boolean inDither

如果为true,解码器尝试抖动解码,默认值为false,表示不采用抖动解码(Android N Deprecated)。

Android中的抖动解码(inDither)

17.public boolean inPreferQualityOverSpeed

为true则优先保证Bitmap质量,其次是解码速度,(Android N Deprecated)

18.public boolean inPremultiplied

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

19.public boolean mCancel

表明,取消已经对这个对象调用的标志(Android N Deprecated)。

参考链接:

Android Bitmap最全面详解

深入理解Android Bitmap的各种操作

android使用inSampleSize、inScaled、inDensity、inTargetDensity对图片进行缩放(有关于使用inScaled、inDensity、inTargetDensity的代码)

Android中BitmapFactory.Options详解

Android BitmapFactory.Options

BitmapFactory.Options详解

图片加载<第二篇>:BitmapFactory.Options详解(不错,讲的很详细)

Bitmap 的四种压缩方式详解

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注