Android日记androidandroid技术

浅谈BitmapFactory.Options

2017-01-12  本文已影响1393人  Showdy

BitmapFactory.options

BitmapFactory.Options类是BitmapFactory对图片进行解码时使用的一个配置参数类,其中定义了一系列的public成员变量,每个成员变量代表一个配置参数。

图片解码建议配置(inPreferredConfig)

优化Bitmap的内存使用(inBitmap)

高效加载大图片(inJustDecodeBounds / inSmapleSize)

inPremultiplied

inDither

设置是否抖动处理图片.

inMutable

如果设置为true,将返回一个mutable的bitmap,可用于修改BitmapFactory加载而来的bitmap.

inDesity

inTargetDensity:

inScreenDensity

inScale

inTargetDensity,inScale,inDesity之间的关系:

说三者之间的关系前,先谈下系统位图放缩规则,做个试验(使用小米3作为测试机):将一张144*144的ic_lanucher.png(系统默认在xxhdpi包下)分别放置在hdpi,xhdpi,xxhdpi三个文件夹,打印出位图的大小.


   Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.ic_launcher);
   Log.d(TAG, "size:" + bitmap.getByteCount());

   hdpi包size:331776
   xhdpi包size:186624
   xxhdpi包size:82944

我们知道一张144*144的 ic_lanucher.png所占的实际内存为 144*144*4=82944字节,那么为什么同一张图片放在不同包下表现不一样的大小?

屏幕密度与Drawable目录有着如下的关系:

目录 屏幕密度
drawable-ldpi 120dpi
drawable-mdpi 160dpi
drawable-hdpi 240dpi
drawable-xhdpi 320dpi
drawable-xxhdpi 480dpi

当使用decodeResuore()解码drawable目录下的图片时, 会根据手机的屏幕密度,到对应的文件夹中查找图片,如果图片存在于其他目录,则会对该图片进行放缩处理在显示,放缩处理的规则:

scale= 设备屏幕密度/drawable目录设定的屏幕密度

图片内存=int(图片长度*scale+0.5f)* int(图片宽度*scale)*单位像素占字节数

由于实验使用的小米3,屏幕密度为480,则当图片放入在hdpi时:scale= 480/240;
图片放入xhdpi:scale=480/320;
图片放入xxhdpi时:scale= 480/480;

说完系统加载位图使用的放缩规则后,再来说说这三个标记之间的关系:

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

参考资料

上一篇下一篇

猜你喜欢

热点阅读