decode图片时BitmapFactory.Options中的inDensity和inTargetDensity

来源:互联网 发布:js手写bind实现原理 编辑:程序博客网 时间:2024/06/01 10:09

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    ----->  120mdpi    ----->  160hdpi    ----->  240xhdpi   ----->  320xxhdpi  ----->  480xxxhdpi ----->  640

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

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

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

最终:

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

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


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

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


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

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

0 0