@946898963
2022-11-10T10:50:00.000000Z
字数 3931
阅读 1027
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(是否可变)
if (!bitmap.isMutable()) {
throw new IllegalStateException("Immutable bitmap passed to Canvas constructor");
}
如果不可变,将会抛出异常信息,另外在我们通过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。
15.public String outMimeType
图片的mime类型,这个属性标识了文件的具体mimeType类型,它的值是这种格式的 ”image/png”、”image/jpeg”、”image/gif”。我们根据这个mimeType就可以获取文件类型。
假设我们获取到了某个文件在本地的完整路径,那么,我们就可以根据下面的示例代码获知该文件的具体类型。
示例代码如下:
//文件在本地的路径
String filePath = file.getPath();
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, options);
String mimeType = options.outMimeType;
LogUtils.d(TAG, "图片类型1:" + mimeType);
16.public boolean inDither
如果为true,解码器尝试抖动解码,默认值为false,表示不采用抖动解码(Android N Deprecated)。
17.public boolean inPreferQualityOverSpeed
为true则优先保证Bitmap质量,其次是解码速度,(Android N Deprecated)
18.public boolean inPremultiplied
这个值和透明度通道有关,默认值是true,如果设置为true,则返回的bitmap的颜色通道上会预先附加上透明度通道,一般不改变其值。
19.public boolean mCancel
表明,取消已经对这个对象调用的标志(Android N Deprecated)。
参考链接:
android使用inSampleSize、inScaled、inDensity、inTargetDensity对图片进行缩放(有关于使用inScaled、inDensity、inTargetDensity的代码)
Android中BitmapFactory.Options详解
图片加载<第二篇>:BitmapFactory.Options详解(不错,讲的很详细)