HDR-скриншоты на устройствах Android

После появления видео в расширенном динамическом диапазоне (HDR) стриминговые сервисы начали транслировать HDR-видео, ориентируясь на полноэкранный режим. Приложения для социальных сетей теперь поддерживают HDR-видео и Ultra HDR, что свидетельствует о растущем интересе к HDR в различных приложениях.

Поддержка HDR на устройствах Android

В Android поддержка HDR развивалась в несколько этапов:

Android 7

  • Первоначальная поддержка декодирования и показа HDR-видео.
  • Продолжается развитие возможностей HDR.

Android 13

  • Сквозная поддержка записи, кодирования и воспроизведения HDR-видео.
  • Добавлена композиция SDR и HDR, которая определяет разные диапазоны яркости для SDR и HDR.

Android 14

  • Поддержка HDR-изображений с Ultra HDR.

Поддержка скриншотов HDR также изменилась.

Улучшенные возможности HDR-скриншотов

В этом разделе описывается развитие функции HDR-скриншотов в обновлениях Android.

Android 9

В графическом композиторе Android SurfaceFlinger появилась поддержка HDR-видео. При отрисовке HDR-видео и скриншотов с помощью графического процессора используется сложный полиномиальный преобразователь тона. Эта кривая не всегда эквивалентна тональному компрессору дисплея, поэтому скриншоты отличаются от контента на экране.

Android 13

Блок отрисовки GPU в SurfaceFlinger включает плагин tone mapping, который позволяет производителю оригинального оборудования предоставить шейдер GPU, соответствующий кривой тональной компрессии дисплея. Скриншоты почти соответствуют контенту на экране, но есть следующие различия:

  • Скриншоты сохраняются в формате SDR. Поэтому, если вы будете смотреть на скриншот и HDR-изображение одновременно, HDR-области на скриншоте будут выглядеть более тусклыми.
  • Яркость SDR не регулируется, поэтому SDR-контент на скриншоте выглядит так же ярко, как и HDR-контент.

Другими словами, система преобразует любое видео HDR, захваченное на скриншоте, в видео SDR.

Android 14

Скриншоты в формате Ultra HDR создавать довольно сложно. В отличие от видео, изображения обычно обрабатываются в буфере кадров пользовательского интерфейса, что имеет два основных последствия:

  • Обработка изображений, включая тональную компрессию, не должна отличаться от обработки окружающего интерфейса.
  • Приложения отвечают за сопоставление тонов на основе источника при отрисовке своего интерфейса.

Чтобы решить эту проблему, рассмотрите три возможных варианта реализации скриншотов:

  • Сохраняет детали HDR изображения Ultra HDR, в результате чего интерфейс приложения на скриншоте затемняется.
  • Сохранять детали интерфейса приложения, из-за чего изображение в формате Ultra HDR обрезается.
  • Увеличить яркость интерфейса приложения, но при этом обрезать яркие участки HDR.

В Android 14 реализован третий подход, при котором интерфейс приложения становится ярче, а светлые участки HDR-контента обрезаются.

Android 15 QPR1

В SurfaceFlinger добавлен локальный алгоритм тональной компрессии для скриншотов. Этот процесс включает:

  • Разделение входного изображения на более мелкие.
  • Вычисление максимальной яркости на каждом изображении и отбрасывание низких значений яркости в каждом разделе.
  • Интерполировать вычисленные значения яркости с помощью размытия и повторной выборки.
  • Применение к входному изображению параметризованного тонального отображения Рейнхарда на основе интерполированных значений яркости.

Этот алгоритм значительно улучшает качество скриншотов в Android 15 QPR1 по сравнению с Android 14, как показано в примерах ниже.

  • На примере 1 показан скриншот HDR-видео, наложенного на страницу Chrome с Ultra HDR. Цвета интерфейса в основном сохранены, а изображение больше не обрезается.

    Android 14 Android 15 QPR1
    Пример 1 в Android 14 Пример 1 в Android 15 QPR

    Рисунок 1. Сравнение Android 14 и Android 15 QPR1 для примера 1.

  • Пример 2 – это скриншот HDR-видео, наложенный на Настройки с последующими скриншотами. В Android 14 цвета на скриншотах становятся темнее. В Android 15 QPR1 тональная карта правильно воспроизводит и сохраняет цвета интерфейса.

    Android 14 Android 15 QPR1
    Пример 2 в Android 14 Пример 2 в Android 15qpr

    Рисунок 2. Сравнение Android 14 и Android 15 QPR1 для примера 2

Android 16

Как и в случае с Ultra HDR, в HDR-скриншотах в файле скриншота хранится карта усиления, которая позволяет восстановить HDR-представление во время отрисовки. Однако, в отличие от Ultra HDR, скриншот сохраняется в формате PNG для совместимости с системами, которые поддерживают этот формат.

Создание скриншотов включает в себя следующие этапы:

  • Когда на устройстве показывается HDR-контент, скриншот создается с использованием пикселей FP16.
  • Локальный тональный преобразователь, описанный в Android 15 QPR1, создает 8-битное базовое изображение SDR.
  • 8-битная карта усиления создается путем объединения базовой версии SDR с версией HDR.
  • Базовая версия SDR и карта усиления кодируются в один файл PNG.

Кодирование PNG включает следующие этапы:

  • Карта усиления кодируется как изображение PNG, которое включает фрагмент gmAP, содержащий метаданные ISO 21496-1 для карты усиления.
  • Базовое представление SDR кодируется как изображение PNG, которое включает фрагмент gmAP, содержащий версию метаданных ISO 21496-1. Изображение PNG также содержит фрагмент gdAT, в котором находится вся закодированная карта усиления PNG.

На рисунке ниже показана структура фрагментов PNG.

Структура блоков PNG

Рисунок 3. Макет фрагментов PNG.

В Android 16 кодек PNG поддерживает как кодирование, так и декодирование таких изображений. Приложения могут показывать PNG-файлы с картой усиления так же, как Ultra HDR.