Показывать изображения в формате Ultra HDR

Графический формат Ultra HDR позволяет сохранять больше информации об интенсивности света, благодаря чему светлые и темные участки становятся более детализированными, а цвета – более насыщенными. Поддержка изображений Ultra HDR появилась в Android 14 (уровень API 34). Если ваше приложение работает на этих версиях, важно настроить его так, чтобы эти изображения отображались правильно. Если же ваше приложение не показывает изображения Ultra HDR, вы можете сэкономить ресурсы устройства, не включая отображение Ultra HDR. На этой странице рассказывается, как проверить, поддерживают ли графические объекты Ultra HDR, и как правильно их отображать.

Проверка наличия карты усиления

Изображения Ultra HDR содержат карту усиления. Карта усиления используется для определения повышенной яркости каждого пикселя на изображении. Чтобы проверить, имеет ли изображение формат Ultra HDR, преобразуйте его или объект Drawable в Bitmap и вызовите метод Bitmap.hasGainMap() (доступен начиная с Android 14), чтобы узнать, есть ли у него карта усиления.

Как настроить окно для показа Ultra HDR

Чтобы показывать изображения Ultra HDR с полным динамическим диапазоном, установите для окна цветовой режим ActivityInfo.COLOR_MODE_HDR. Для этого вызовите метод setColorMode() окна. Эти API доступны в Android 8 и более поздних версиях, но изображения будут показываться в формате Ultra HDR, только если на устройстве установлена ОС Android 14 или более поздней версии.

Подведем итоги

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

Kotlin

val bitmap = /* Get Bitmap from Image Resource */
binding.imageContainer.setImageBitmap(bitmap)

// Set color mode of the activity to the correct color mode.
requireActivity().window.colorMode =
   if (bitmap.hasGainmap()) ActivityInfo.COLOR_MODE_HDR else ActivityInfo.COLOR_MODE_DEFAULT

Java

final Bitmap bitmap = /* Get Bitmap from Image Resource */
binding.imageContainer.setImageBitmap(bitmap);

// Set color mode of the activity to the correct color mode.
int colorMode = ActivityInfo.COLOR_MODE_DEFAULT;
if (bitmap.hasGainmap()) colorMode = ActivityInfo.COLOR_MODE_HDR;
requireActivity().getWindow().setColorMode(colorMode);

Дополнительные ресурсы

Дополнительную информацию об изображениях Ultra HDR можно найти в следующих ресурсах: