1

我正在编写一个自定义类。在实际绘制之前,需要计算一个位图以进行一些预处理和调整大小。位图本身是经过预处理的 9-patch 图像。在构造函数中,有以下代码:

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" Samsung 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

位图的实际尺寸为:

分辨率:558 x 892

高清画质:836 x 1337

位图是经过预处理的 9-patch,这就是为什么尺寸相差 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 并告诉它根本不缩放。

所有这些都提供了相同的精确结果。

4

3 回答 3

5

要使用inJustDecodeBounds选项获取实际图像大小,您需要将返回的outWidthoutHeight乘以比例系数,即inTargetDensity/inDensity。示例代码是:

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);
}
于 2013-07-09T13:30:54.097 回答
2

前 3 行不影响第 4 行,因为第 4 行不使用它上面的任何变量。也根本没有使用或填充“bmpOptions”。也许您在发布此问题时重命名了变量?

另外,位图图像文件是否可能位于具有密度限定符(或默认值,如 mdpi)的文件夹中?

仅当您将文件放入 drawable-nodpi 时,您将始终获得相同数量的宽度和高度像素。

于 2013-03-02T10:39:17.367 回答
1

难道是 Nexus 7 屏幕是tv dpi并从drawable- h dpi加载位图的事实吗?但是,outXXXX值与位图的最终宽度/高度不匹配仍然很奇怪。

于 2013-03-01T22:32:07.030 回答