Farbkorrektur mit Look-up-Tabellen (LUTs)

Da die HDR-Funktionen auf Android-Geräten variieren, kann es zu fragmentierten HDR-Ausgaben kommen. Eine LUT (Look-up-Table) ist eine neue Lösung zur Farbkorrektur, die diese Inkonsistenz beheben soll. Diese Inkonsistenz wird behoben, indem eine Methode zur Farbkorrektur vorgeschrieben wird, anstatt sie an einen undefinierten gerätespezifischen Farbkorrekturmechanismus zu delegieren.

SDK-Voraussetzungen

Für die Implementierung von LUTs muss Ihre SDK-Version mindestens 36 sein.

LUT implementieren

So wenden Sie eine LUT auf ein SurfaceControl an:

  1. Erstellen Sie eine DisplayLuts-Instanz.
  2. Erstellen Sie DisplayLuts.Entry-Instanzen mit dem LUT-Datenpuffer, der LUT-Dimension und dem Sampling-Schlüssel der LUT. Weitere Informationen finden Sie in der Dokumentation zu LutProperties.
  3. Rufen Sie DisplayLuts#set(DisplayLuts.Entry luts) oder DisplayLuts#set(DisplayLuts.Entry first, DisplayLuts.Entry second) auf, um LUT-Einträge festzulegen. Das Framework unterstützt 1D-LUTs, 3D-LUTs oder eine Kombination aus 1D- und 3D-LUTs.
  4. Rufen Sie SurfaceControl.Transaction#setLuts auf, um die LUTs auf die Ebene anzuwenden.

Kotlin

val sc = SurfaceControl.Builder().build()
val luts = DisplayLuts()
val entry = DisplayLuts.Entry(
    floatArrayOf(0.5f, 0.5f, 0.5f, 0.5f),
    LutProperties.ONE_DIMENSION,
    LutProperties.SAMPLING_KEY_MAX_RGB
)
luts.set(entry)
SurfaceControl.Transaction().setLuts(sc, luts).apply()

Java

SurfaceControl sc = new SurfaceControl.Builder().build();
DisplayLuts luts = new DisplayLuts();
DisplayLuts.Entry entry = new DisplayLuts.Entry(
  new float[]{0.5f, 0.5f, 0.5f, 0.5f},
  LutProperties.ONE_DIMENSION,
  LutProperties.SAMPLING_KEY_MAX_RGB
);
luts.set(entry);
new SurfaceControl.Transaction().setLuts(sc, luts).apply();

Sie können auch OverlayProperties.getLutProperties() verwenden, um die LUT-Eigenschaften des Geräts zu ermitteln und festzustellen, ob der Hardware Composer die ausgewählte LUT verarbeiten kann.