HDR negli screenshot di Android

Dopo l'introduzione dei video HDR (High Dynamic Range), i servizi di streaming hanno iniziato a trasmettere in streaming video HDR, concentrandosi sulle esperienze a schermo intero. Le app di social media ora supportano i video HDR e l'Ultra HDR, il che indica un crescente interesse per l'adozione dell'HDR in varie app.

Supporto HDR per Android

Android ha supportato la tecnologia HDR in diverse tappe fondamentali:

Android 7

  • Supporto iniziale per la decodifica e la visualizzazione di video HDR.
  • Progressi continui nelle funzionalità HDR.

Android 13

  • Supporto end-to-end per l'acquisizione, la codifica e la visualizzazione di video HDR.
  • È stata introdotta la composizione mista SDR e HDR, che definisce diverse gamme di luminanza visualizzabili tra SDR e HDR.

Android 14

Anche il supporto degli screenshot HDR si è evoluto e modificato.

Progressi nelle funzionalità di screenshot HDR

Questa sezione descrive la progressione della funzionalità di screenshot HDR negli aggiornamenti di Android.

Android 9

SurfaceFlinger, il compositore grafico di Android, introduce il supporto dei video HDR. Il rendering GPU di video e screenshot HDR utilizza un mapper di tonalità polinomiale complesso. Questa curva di mappatura del tono non è sempre equivalente al mapper del tono del display, quindi gli screenshot differiscono dai contenuti sullo schermo.

Android 13

Il blocco di rendering della GPU di SurfaceFlinger include un plug-in di mappatura della tonalità, che consente all'OEM di fornire uno shader GPU per adattarsi alla curva di mappatura della tonalità del display. Gli screenshot corrispondono quasi ai contenuti sullo schermo, ma con le seguenti differenze:

  • Gli screenshot rimangono in formato SDR. Di conseguenza, se visualizzate insieme a una scena HDR, le regioni HDR all'interno dello screenshot appaiono più scure.
  • La luminanza SDR non viene gestita, quindi i contenuti SDR all'interno dello screenshot appaiono luminosi come i contenuti HDR.

In altre parole, il sistema converte qualsiasi video HDR acquisito nello screenshot in video SDR.

Android 14

Ultra HDR rappresenta una sfida significativa per gli screenshot. A differenza dei video, il sistema in genere esegue il rendering delle immagini all'interno del framebuffer dell'interfaccia utente, il che ha due implicazioni principali:

  • Le immagini non possono avere un'elaborazione, inclusa la mappatura della tonalità, diversa dall'interfaccia utente circostante.
  • Le app sono responsabili della mappatura della tonalità basata sull'origine durante il rendering della UI.

Per alleviare questo problema, prendi in considerazione tre potenziali implementazioni della funzionalità di acquisizione degli screenshot:

  • Preserva i dettagli HDR di un'immagine Ultra HDR, con conseguente oscuramento dell'interfaccia utente dell'app nello screenshot.
  • Preservare i dettagli dell'interfaccia utente dell'app, causando il ritaglio dell'immagine Ultra HDR.
  • Compromesso: illuminare la UI dell'app e ritagliare le aree in evidenza HDR.

Android 14 implementa il terzo approccio di illuminazione della UI dell'app e ritaglio delle alte luci HDR.

Android 15-QPR1

SurfaceFlinger include un algoritmo di mappatura della tonalità locale per gli screenshot. Questa procedura prevede:

  • Dividere l'immagine di input in immagini più piccole.
  • Calcolo della luminanza massima in ogni immagine e scarto dei valori di bassa luminanza all'interno di ogni sezione.
  • Interpolando le luminanze calcolate tramite sfocatura e ricampionamento.
  • Applicazione di un tonemapper Reinhard parametrizzato all'immagine di input, in base ai valori di luminanza interpolati.

Questo algoritmo migliora in modo significativo gli screenshot tra Android 14 e Android 15-QPR1, come dimostrano i seguenti esempi:

  • L'esempio 1 è uno screenshot di un video HDR sovrapposto a una pagina Chrome contenente Ultra HDR. I colori della UI vengono per lo più conservati nella nuova implementazione e l'immagine non viene più ritagliata.

    Android 14 Android 15-QPR1
    Esempio 1 in Android 14 Esempio 1 in Android 15qpr

    Figura 1. Confronto tra Android 14 e Android 15-QPR1 per l'esempio 1.

  • L'esempio 2 è uno screenshot di un video HDR sovrapposto a Impostazioni con screenshot successivi. In Android 14, i colori dello screenshot sono successivamente più scuri. In Android 15-QPR1, il tonemapper replica e conserva correttamente i colori dell'interfaccia utente.

    Android 14 Android 15-QPR1
    Esempio 2 in Android 14 Esempio 2 in Android 15qpr

    Figura 2. Confronto tra Android 14 e Android 15-QPR1 per l'esempio 2.

Android 16

Simili all'Ultra HDR, gli screenshot HDR memorizzano una gainmap nel file dello screenshot per recuperare la rappresentazione HDR durante il rendering. Tuttavia, a differenza di Ultra HDR, lo screenshot rimane in formato PNG per la compatibilità con i sistemi che acquisiscono screenshot PNG.

La generazione di screenshot prevede quanto segue:

  • Quando i contenuti HDR vengono visualizzati sul dispositivo, viene generata un'istantanea utilizzando pixel FP16.
  • Il mapper di tonalità locale descritto in Android 15-QPR1 genera una base di rendering SDR a 8 bit.
  • Una gain map a 8 bit viene prodotta combinando la base di rendering SDR con il rendering HDR.
  • La base SDR e la gain map vengono codificate in un unico file PNG.

La codifica PNG prevede quanto segue:

  • La mappa del guadagno è codificata come immagine PNG, che include un blocco gmAP, contenente i metadati ISO 21496-1 per la mappa del guadagno.
  • Il rendering di base SDR è codificato come immagine PNG, che include un chunk gmAP contenente la versione dei metadati ISO 21496-1. Questa immagine PNG include anche un blocco gdAT, contenente l'intera immagine PNG della gain map codificata.

La figura seguente mostra il layout dei blocchi PNG:

Layout dei blocchi PNG

Figura 3. Layout dei blocchi PNG.

Con Android 16, il codec PNG supporta sia la codifica che la decodifica di questi PNG. Le app possono visualizzare un PNG con una gain map nello stesso modo di Ultra HDR.