Подтвердить что ты не робот

Растровые изображения на ICS загружаются с неправильным пиксельным форматом

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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