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

Dee*_*eeV 1 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);
Run Code Online (Sandbox Code Playgroud)

运行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;
Run Code Online (Sandbox Code Playgroud)

bmpOptions.inTargetDensity = getResources().getDisplayMetrics().densityDpi;
Run Code Online (Sandbox Code Playgroud)

bmpOptions.inTargetDensity = getResources().getDisplayMetrics().densityDpi;
bmpOptions.inDensity = getResources().getDisplayMetrics().densityDpi;
Run Code Online (Sandbox Code Playgroud)

bmpOptions.inTargetDensity = 0;
bmpOptions.inDensity = 0;
Run Code Online (Sandbox Code Playgroud)

我也尝试了相反的方法,并为解码的位图创建第二个BitmapFactory.Options,并告诉它根本不进行缩放.

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

Rus*_*hyn 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);
}
Run Code Online (Sandbox Code Playgroud)