BitmapFactory.Options中的inDensity和inTargetDensity

本文深入探讨了BitmapFactory.Options中inDensity与inTargetDensity的作用及计算原理。解释了这两个参数如何影响图片加载尺寸,并给出了不同屏幕密度下的具体数值对照。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BitmapFactory.Options中的inDensity和inTargetDensity

今天在写一个小软件的时候,加载一个bitmap,每次加载出来,发现比原图的宽高大了一倍…

后来经过一番搜索和调试,终于发现问题所在,本以为影响BitmapFactory的decode图片的大小的只有inSampleSize

事实证明我too young too simple,some times naive…..

BitmapFactory在decode的时候还会参考inDensity和inTargetDensity两个属性


因为我用的图片放在drawable文件夹中,所以

++Options中的inDensity属性会根据drawable文件夹的分辨率来赋值++

++inTartgetDensity会根据屏幕的像素密度来赋值++

对应关系如下

ldpi    ----->  120
mdpi    ----->  160
hdpi    ----->  240
xhdpi   ----->  320
xxhdpi  ----->  480
xxxhdpi ----->  640
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

**如果你放置图片的drawable文件夹后跟”-xxxhdpi”字样, 
那么你decode这张图片时候inDensity属性就是640**

如果你用的手机是nexus4,那么你decode这张图片的时候inTargetDensity是320

//屏幕的density可由此代码获得,这个就是inTargetDensity
DisplayMetrics metrics = new DisplayMetrics();
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(metrics);
int inTargetDensity = metircs.densityDpi;
  • 1
  • 2
  • 3
  • 4
  • 5

最终:

输出图片的宽高= 原图片的宽高 / inSampleSize * (inTargetDensity / inDensity)

(注意inSampleSize只能是2的幂,如不是2的幂下转到最大的2的幂,而且inSampleSize>=1)


这个计算仅针对于drawable文件夹的图片来说

而对于一个file或者stream那么inDensity和inTargetDensity是不考虑的!他们默认就是0


自此我终于明白drawable为什么要分那么多中分辨率的文件夹了

如果将图片放入默认drawable文件夹(不指定分辨率,即文件夹名后不跟分辨率),则默认的inDensity就是160

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值