Ширина / высота растрового изображения отличается после загрузки из ресурса - PullRequest
16 голосов
/ 26 февраля 2011

первый. я новичок в Android кодирования:)

Что я делаю, так это загружаю растровое изображение из моего res / drawable-mdpi с помощью

BitmapFactory.decodeResource(getResources(), R.drawable.cat_ground_01);

после того, как я выйду из системы шириной / высотой растрового изображения, он сообщит мне другое значение, чем настоящее растровое изображение.

Довольно сложно разместить растровые изображения pixelperfect, например, перекрыть растровое изображение лица растровым изображением рта.

может быть, мне просто не хватает знаний для этой темы: 9 Я надеюсь, что вы можете помочь.

Ответы [ 3 ]

30 голосов
/ 26 февраля 2011

Когда вы выполняете Bitmapfactory.decodeResource (), Android по умолчанию выберет «соответствующую» версию dpi для декодирования, что произойдет в упомянутом вами коде:

  1. Вы не можете указать, будет ли он в формате mdpi, hdpi или как-то еще, он выберет версию, соответствующую вашей работающей системе. то есть, если вы работаете на устройстве mdpi, оно будет декодировать версию mdpi; в ldpi, затем версия ldpi.

  2. Предположим, что вы используете устройство hdpi, но ресурс mdpi не определен, он будет использовать ваш ресурс mdpi и во время декодирования превратит его в hdpi (то есть увеличит ваше растровое изображение mdpi до примерно в 1,5 раза больше); Опять же, если ваше устройство имеет более низкое разрешение, оно уменьшит изображение

Я думаю, это то, что происходит с вами. Для BitmapFactory фактически есть опция НЕ масштабировать изображение:

http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html

Установите для inScaled значение false.

10 голосов
/ 11 апреля 2011

Разве вы не можете просто поместить ресурс в папку nodpi?

т.е. Рез / вытяжка-nodpi

Это то, что я делал в прошлом.

4 голосов
/ 27 февраля 2011

после того, как я выйду из системы шириной / высотой растрового изображения, он сообщит мне другое значение, чем настоящее растровое изображение.

Проверьте ваши параметры options.inTargetDensity и options.inDensity после загрузки растрового изображения из / drawable. Они не равны (160 и 240, например). Если для options.inScaled установлено значение true (по умолчанию) - именно поэтому растровое изображение автоматически масштабируется.

Другой способ - использовать Bitmap.createScaledBitmap для изменения масштаба изображения после загрузки. Потому что иногда вам нужно inScaled = true

        //Target dimensions
        int iW = 300;
        int iH = 200;
        Bitmap mOriginalBitmap = new Bitmap;
        BitmapFactory.Options options = new BitmapFactory.Options();
        //Load image from resource
        mOriginalBitmap = BitmapFactory.decodeResource(getResources(), 
                R.drawable.sample_image_900px, options);
        //Scale to target size
        mOriginalBitmap = Bitmap.createScaledBitmap(mOriginalBitmap, iW, iH, true); 
...