BitmapFactory.decodeResource() 忽略 inScaled

BitmapFactory.decodeResource() ignoring inScaled

当 inJustDecodeBounds 也是 "true" 时,BitmapFactory.decodeResource() 似乎忽略了 inScaled。

在这段代码中:

Resources res = getResources ();
DisplayMetrics metrics = res.getDisplayMetrics ();

BitmapFactory.Options options = new BitmapFactory.Options ();
options.inScaled = true;
options.inDensity = DisplayMetrics.DENSITY_HIGH; // resolution of bitmap in resources
options.inTargetDensity = metrics.densityDpi; // screen resolution

options.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeResource (res, srcId, options);
logD ("IVH decodeBitmapResource.1: " + options.outWidth + "," + options.outHeight + " - " + srcId);

options.inJustDecodeBounds = false;
bitmap = BitmapFactory.decodeResource (getResources(), srcId, options);
logD ("IVH decodeBitmapResource.2: " + options.outWidth + "," + options.outHeight + " - " + srcId);

我在日志文件中得到以下输出:

IVH decodeBitmapResource.1: 420,747 - 2130837613
IVH decodeBitmapResource.2: 840,1494 - 2130837613

我所做的只是将 inJustDecodeBounds 从 true 更改为 false。我错过了什么?

也许答案应该很明显:inJustDecodeBounds 应该忽略所有 其他指令,甚至缩放。

下面的代码,将inJustDecodeBounds设置为"true"时解决了问题:

float scale = (float)metrics.densityDpi / (float)DisplayMetrics.DENSITY_HIGH;

imageWidth = (int) (options.outWidth * scale + 0.5);
imageHeight = (int) (options.outHeight * scale + 0.5);

话虽如此,加油Google。您已获得此 API 中的所有代码;你为什么要让我重写它。只需提供一个不同的标志即可完成除渲染位图之外的所有操作。然后,使用一个标志,我可以计算边界,并通过翻转标志,渲染位图以完全适合。