Почему BitmapFactory.decodeResource масштабирует мое изображение?

У меня есть изображение размером 120x120 пикселей в моем /res/drawable/ каталог. Это размер, необходимый для всех устройств.

Для загрузки этого растрового изображения я использую следующее:

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

Проблема в том, что когда я измеряю tmpBmp, размер 360x360px. Я знаю, как уменьшить масштаб до необходимого мне размера 120x120, но это пустая трата времени на обработку, хотя и минимальная.

Я предполагаю, что это как-то связано с плотностью экрана, так как мой ресурс находится в каталоге без плотности.

В чем причина decodeResource масштабировать мое изображение? И как мне помешать этому?

2 ответа

Решение

По умолчанию drawable каталог предполагает, что изображения должны быть масштабированы по умолчанию mdpi размер. Поместите ваши изображения в drawable-nodpi если вы хотите отключить масштабирование ресурсов.

Обратите внимание, что изображение размером 120x120px, если оно отображается на экране, будет в 3 раза меньше на устройстве xxhdpi по сравнению с устройством mdpi (поскольку число пикселей на дюйм в три раза больше).

Это потому, что плотность вашего экрана и вашего изображения разные. Тогда если не укажете 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 папка.

Другие вопросы по тегам