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
如果你放置图片的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;
最终:
输出图片的宽高= 原图片的宽高 / inSampleSize * (inTargetDensity / inDensity)
(注意inSampleSize只能是2的幂,如不是2的幂下转到最大的2的幂,而且inSampleSize>=1)
这个计算仅针对于drawable文件夹的图片来说
而对于一个file或者stream那么inDensity和inTargetDensity是不考虑的!他们默认就是0
自此我终于明白drawable为什么要分那么多中分辨率的文件夹了
如果将图片放入默认drawable文件夹(不指定分辨率,即文件夹名后不跟分辨率),则默认的inDensity就是160