Битовые карты на ICS загружены с неправильным форматом пикселей - PullRequest
12 голосов
/ 01 февраля 2012

Я столкнулся со следующей проблемой.Когда какое-либо растровое изображение загружается из ресурсов приложением, работающим в Ice Cream Sandwich, оно, вероятно, будет отображаться неправильно, как если бы оно было декодировано в формате, который отличается от текущего формата окна, без применения дизеринга.Однако и формат декодирования, и формат окна были явно установлены:

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inPreferredConfig = Bitmap.Config.RGBA_8888;

и

getWindow().setFormat(PixelFormat.RGBA_8888);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);

Вот скриншоты тестового приложения , взятые из эта статья работает на эмуляторе с ICS 4.0.3 (он дает те же результаты в HTC HD2):

RGBA_8888 (32-бит) формат окна , различныеформаты декодирования растрового изображения: 32-bit window format

RGB_565 (16 бит) формат окна , различные форматы декодирования растрового изображения: 16-bit window format

Можно отметить несколько вещей:

  • Флаг сглаживания не учитывается время от времени;
  • Кажется, что формат окна по умолчанию для ICS RGB_565;
  • Единственный хорошо выглядящийпоявляется градиент с RGB_565 форматом окна и RGBA_8888 форматом декодирования растрового изображения .

Эта проблема также сообщалась в этих вопросах, но все еще нетрешение можно найти здесь:

Проблема совместимости градиента - по умолчанию ICS имеет меньше цветов, чемВсе предыдущие версии Android

Ужасное качество фонового изображения в Android

Вопрос в том, как работать со всеми этими форматами в ICS, чтобы быть болееточно, как заставить ICS загружать растровые изображения в формате RGBA_8888 и как установить формат окна в RGBA_8888, чтобы эти растровые изображения отображались правильно?

Ответы [ 2 ]

7 голосов
/ 10 февраля 2012

Я могу с уверенностью заверить вас, что формат окна по умолчанию - RGB888. На самом деле это было сделано по умолчанию в Android 2.3, и с тех пор не изменилось. На данный момент я считаю, что окна RGB565 устарели, поскольку в основном все современные устройства имеют дисплеи с 32 битами на пиксель.

Вы говорите, что также запускаете это на HTC HD2, но, поскольку для него нет официальной сборки, я бы с подозрением отнесся к любому полученному вами результату.

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

0 голосов
/ 07 февраля 2012

Это демонстрационное приложение немного странно ... у него есть два действия, которые оба фильтруют намерения запуска, одно предназначено для 16 бит / с, а другое - для 32 бит / с. Не уверен, что определяет, какой из них выбирается при запуске приложения.

Запуск приложения как есть на устройстве ICS (Nexus S версии 4.0.3) приводит к тому, что всегда выбирается версия 16bpp. Если удалить декларацию активности 16bpp из манифеста, неудивительно, что вместо этого запускается версия 32bpp. Что выглядит хорошо для меня. Параметр «дизеринг» не работает в 32 битах на дюйм, но это как и ожидалось ... дизеринг включается только тогда, когда глубина поверхности дисплея меньше глубины изображения.

Что касается глубины поверхности дисплея, я понимаю, что для глубины поверхности окна по умолчанию используется значение 16 бит / с, вплоть до версии Android 3.0 (Honeycomb), когда по умолчанию тихо переключается на 32 бит / дюйм. Значение по умолчанию всегда можно переопределить с помощью Window.setFormat().

...