我正在写一个自定义类。在实际绘制之前,需要为某些预处理和大小调整计算位图。位图本身是预处理的9补丁图像。在构造函数中,有以下代码:
BitmapFactory.Options bmpOptions = new BitmapFactory.Options();
bmpOptions.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), BITMAP_ID, bmpOptions);
Bitmap bmp = BitmapFactory.decodeResource(getResources(), BITMAP_ID);
Log.d(getClass().getSimpleName(), "width: " + bmp.getWidth() + " " + bmpOptions.outWidth + "; height: " + bmp.getHeight() + " " + bmpOptions.outHeight);
运行Android 3.2.2的7“三星Galaxy Tab 7上的输出:
宽度:556 556;身高:890 890
运行Android 4.1的10“Motorola Xoom上的输出:
宽度:556 556;身高:890 890
运行Android 4.2.2的7“Nexus 7上的输出:
宽度:740 834;高度; 1185 1335
位图的实际尺寸为:
mdpi:558 x 892
hdpi:836 x 1337
位图是预处理的9补丁,这就是尺寸偏离2个像素的原因。我无法理解为什么Nexus 7上的hdpi资产会产生这么大的差异。
我也试过这些配置:
bmpOptions.inScaled = false;
和
bmpOptions.inTargetDensity = getResources().getDisplayMetrics().densityDpi;
和
bmpOptions.inTargetDensity = getResources().getDisplayMetrics().densityDpi;
bmpOptions.inDensity = getResources().getDisplayMetrics().densityDpi;
和
bmpOptions.inTargetDensity = 0;
bmpOptions.inDensity = 0;
我也尝试过相反的方法,为解码后的位图创建第二个BitmapFactory.Options,并告诉它根本不进行缩放。
所有这些都提供了完全相同的结果。
答案 0 :(得分:5)
要使用 inJustDecodeBounds 选项获取实际图像大小,您需要将缩放系数乘以返回的 outWidth 和 outHeight ,等于<强> inTargetDensity /强度气体即可。 示例代码为:
public static void getBitmapDims(Resources res, int resId, Holder<Integer> width, Holder<Integer> height)
{
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, opts);
float scale = (float) opts.inTargetDensity / opts.inDensity;
width.value = (int) (opts.outWidth * scale + 0.5f);
height.value = (int) (opts.outHeight * scale + 0.5f);
}
答案 1 :(得分:2)
前3行不影响第4行,因为第4行不使用它上面的任何变量。 “bmpOptions”也没有被使用或填充。也许你在发布这个问题时重命名了变量?
另外,位图图像文件是否可能位于具有密度限定符(或默认值为mdpi)的文件夹中?
只有将文件放入drawable-nodpi时,宽度和高度才能获得相同的像素数。
答案 2 :(得分:1)
可能是Nexus 7屏幕 tv dpi ,并从 drawable- 加载位图h dpi ?但是, outXXXX 值与位图的最终宽度/高度不匹配仍然很奇怪。