为什么BitmapFactory.decodeResource会扩展我的图像?

时间:2014-04-13 20:01:56

标签: android bitmap drawable android-resources bitmapfactory

我的/res/drawable/目录中有一张120x120px的图像。这是所有设备所需的大小。

要加载此位图,我使用以下内容:

Bitmap tmpBmp = BitmapFactory.decodeResource(getResources(), R.drawable.myimage);

问题在于,当我衡量tmpBmp时,尺寸为360x360px。我知道如何将其缩小到我需要的120x120,但这是浪费处理时间,尽管很少。

我假设这与屏幕密度有关,因为我的资源位于无密度目录中。

decodeResource缩放图片的原因是什么?我该如何阻止它这样做呢?

2 个答案:

答案 0 :(得分:14)

默认的drawable目录假定图像需要从默认的mdpi大小进行缩放。如果要禁用资源缩放,请将图像放在drawable-nodpi中。

请注意,与mdpi设备相比,xxhdpi设备上的120x120px图像(如果显示在屏幕上)将小3倍(因为每英寸像素数是原来的三倍)。

答案 1 :(得分:2)

这是因为您的屏幕密度和图像不同。然后,如果您未指定Options系统将为您执行此操作。在BitmapFactory的来源,您可以看到:

public static Bitmap decodeResourceStream(Resources res, TypedValue value, InputStream is, Rect pad, Options opts) {

    if (opts == null) {
        opts = new Options();
    }

    if (opts.inDensity == 0 && value != null) {
        final int density = value.density;
        if (density == TypedValue.DENSITY_DEFAULT) {
            opts.inDensity = DisplayMetrics.DENSITY_DEFAULT;
        } else if (density != TypedValue.DENSITY_NONE) {
            opts.inDensity = density;
        }
    }

    if (opts.inTargetDensity == 0 && res != null) {
        opts.inTargetDensity = res.getDisplayMetrics().densityDpi;
    }

    return decodeStream(is, pad, opts);
}

因此,为防止缩放,您需要使用Options参数指定inScaled=false参数。或者将图像放到res/drawable-nodpi文件夹中。