BitmapFactory.Options是Android用于加载图片的配置类,里面有一系列的配置参数,下面就这些参数一一介绍。
1,inPreferredConfig 图片解码参数
Android 通常使用一个32位的二进制数来表示图片的颜色和透明度,分别为A,R,G,B,范围为[0--256],inPreferredConfig 有四个值可以选择:
ALPHA_8: 每个像素用占8位,存储的是图片的透明值,占1个字节
RGB_565:每个像素用占16位,分别为5-R,6-G,5-B通道,占2个字节
ARGB-4444:每个像素占16位,即每个通道用4位表示,占2个字节
ARGB_8888:每个像素占32位,每个通道用8位表示,占4个字节
使用inPreferredConfig 的注意事项:
如果inPreferredConfig不为null,解码器会尝试使用此参数指定的颜色模式来对图片进行解码,如果inPreferredConfig为null或者在解码时无法满足此参数指定的颜色模式,解码器会自动根据原始图片的特征以及当前设备的屏幕位深,选取合适的颜色模式来解码,例如,如果图片中包含透明度,那么对该图片解码时使用的配置就需要支持透明度,默认会使用ARGB_8888来解码。
2,inBitmap
在Android 2.2 (API level 8)以及之前,当垃圾回收发生时,应用的线程是会被暂停的,这会导致一个延迟滞后,并降低系统效率。 从Android 2.3开始,添加了并发垃圾回收的机制, 这意味着在一个Bitmap不再被引用之后,它所占用的内存会被立即回收。
在Android 2.3.3 (API level 10)以及之前, 一个Bitmap的像素级数据(pixel data)是存放在Native内存空间中的。 这些数据与Bitmap本身所占内存是隔离的,Bitmap本身被存放在Dalvik堆中。我们无法预测在Native内存中的像素级数据何时会被释放,这意味着程序容易超过它的内存限制并且崩溃。 自Android 3.0 (API Level 11)开始, 像素级数据则是与Bitmap本身一起存放在Dalvik堆中。
在Android 2.3.3 (API level 10) 以及更低版本上,推荐使用recycle()方法。 如果在应用中显示了大量的Bitmap数据,我们很可能会遇到OutOfMemoryError的错误。 recycle()方法可以使得程序更快的释放内存。
从Android 3.0 (API Level 11)开始,引进了BitmapFactory.Options.inBitmap字段。如果这个值被设置了,decode方法会在加载内容的时候去reuse已经存在的bitmap. 这意味着bitmap的内存是被reused的,这样可以提升性能, 并且减少了内存的allocation与de-allocation。使用inBitmap需要注意以下几点:
1, reused的bitmap必须和原数据内容大小一致, 并且是JPEG 或者 PNG 的格式 (或者是某个resource 与 stream).
2,reused的bitmap的configuration值如果有设置,则会覆盖掉inPreferredConfig值.
3,你应该总是使用decode方法返回的bitmap, 因为你不可以假设reusing的bitmap是可用的(例如,大小不对)。
3,inJustDecodeBounds/inSampleSize
这两个参数主要是用来加载大图用的,如果图片很大,就先加载图片的边框,获取 图片大小,然后计算inSampleSize,inSampleSize是2的幂次方,表示的是图片单位大小内像素缩小几倍,比如说inSampleSize=4,那么长宽的像素各减少为原来的1/4,总的像素减少为原来的1/16。
4,inPremultiplied
1,如果设置了true(默认是true),那么返回的图片RGB都会预乘透明通道A后的颜色
2, 系统View或者Canvas绘制图片,不建议设置为fase,否则会抛出异常,这是因为系统会假定所有图像都预乘A通道的已简化绘制时间.
3, 设置inPremultiplied的同时,设置inScale会导致绘制的颜色不正确。
5,inDither
设置是否抖动处理图片。
6,inMutable
如果设置为true,将返回一个mutable的bitmap,可用于修改BitmapFactory加载而来的bitmap。
BitmapFactory.decodeResource(Resources res, int id)获取到的bitmap是mutable的,而BitmapFactory.decodeFile(String path)获取到的是immutable的。
可以使用Bitmap copy(Config config, boolean isMutable)获取mutable位图用于修改位图pixels。
7,inDesity
设置位图的像素密度,即每英寸有多少个像素
如果inScale设置了,同时inDensity的值和inTargetDensity不同时,这个时候图片将缩放位inTartgetDensity指定的值.
如果设置为0,则BitmapFactory.decodeResource(Resources,int)和BitmapFactory.decodeResource(Resources, int,BitmapFactory.Options),BitmapFactory.decodeResourceStream() 将inTargetDensity用DisplayMetrics.densityDpi来设置,其它函数则不会对bitmap进行任何缩放。
8, inTargetDensity
设置绘制位图的屏幕密度,与inScale和inDesity一起使用,来对位图进行放缩.
如果设置为0, BitmapFactory.decodeResource(Resources,int), BitmapFactory.decodeResource(Resources, int, BitmapFactory.Options),BitmapFactory.decodeResourceStream()将按照DisplayMetrics的density处理。
9,inScreenDensity
表示正在使用的实际屏幕的像素密度.纯粹用于运行在兼容性代码中的应用程序,其中inTargetDensity实际上是看到的应用程序的密度,而非真正的屏幕密度。
inDesity, inTargetDensity,inScreenDensity这三个参数主是确定是否需要对bitmap进行缩放处理,如果缩放,缩放后的W和H应该是多少,缩放比例主要是通过:InTargetDenisity/inDensity作为缩放比例。
10,inScale
当inScale设置为true时,且inDenstiy和inTargetDensity也不为0时,位图将在加载时(解码)时放缩去匹配inTargetDensity,在绘制到canvas时不会依赖图像系统放缩。
BitmapRegionDecoder会忽略这个标记。
此标记默认为true,如果需要非放缩的位图,可以设置为false,9-patch图片会忽略这标记而自动放缩适配。
如果inPremultipled设置为false,并且图片有A通道,设置这个标记为true,会导致位图出现不正确的颜色。
11,inTargetDensity,inScale,inDesity之间的关系:
inDesity: 位图使用的像素密度
inTargetDesity: 设备的屏幕密度
inScale: 是否需要放缩位图
清楚这三者的含义,就可以在加载图片时,根据图片在不同设备上的使用,可以放缩来加载位图:
放缩规则 scale= inTargetDensity/inDesity;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = true;
options.inDensity = getBitmapDensity();
options.inTargetDensity =Resources.getSystem().getDisplayMetrics().densityDpi ;
Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher, options);
参考:http://www.jianshu.com/p/c545f2a6cafc