BitmapFactory.Options #outWidth返回与实际位图不同的大小

时间:2013-03-01 22:16:19

标签: android android-image bitmapfactory

我正在写一个自定义类。在实际绘制之前,需要为某些预处理和大小调整计算位图。位图本身是预处理的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,并告诉它根本不进行缩放。

所有这些都提供了完全相同的结果。

3 个答案:

答案 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 值与位图的最终宽度/高度不匹配仍然很奇怪。