Skip to content

Commit

Permalink
Added post
Browse files Browse the repository at this point in the history
  • Loading branch information
cmahnke committed Jul 2, 2024
1 parent 7d9bd4d commit 573c0c3
Show file tree
Hide file tree
Showing 2 changed files with 132 additions and 0 deletions.
66 changes: 66 additions & 0 deletions content/post/ultrahdr/index.en.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
---
date: 2024-05-23T11:22:44+02:00
title: "LibUltraHDR"
tags:
- light
- Licht2024
- digitalImages
---

After [research](/post/hdr-awesome-list/), it was necessary to explore some possible workflows and to create tools for a project in preparation. Based on [Greg Benz](https://gregbenzphotography.com/hdr/)'s preliminary work on HDR support, LibUltraHDR was the most sensible candidate for further experimentation.

# LibUltraHDR

[LibUltraHDR](https://github.com/google/libultrahdr) is primarily a library for UltraHDR content. The format itself is comparable to [MPO](https://en.wikipedia.org/wiki/JPEG#JPEG_Multi-Picture_Format). There is a primary (SDR) image, which is also used as a fallback for software without UltraHDR support, and a secondary image in the metadata, the so-called gain map. This maps the luminance gain to be applied to the SDR. More information on how gain maps work can be found at [Adobe](https://helpx.adobe.com/camera-raw/using/gain-map.html).

Technical documentation is available at [Android Developers](https://developer.android.com/media/platform/hdr-image-format).

## Status
Greg Benz and others are currently working on promoting support for the format among relevant open source projects:
- [LibVips #3799](https://github.com/libvips/libvips/issues/3799)
- [ImageMagick #6377](https://github.com/ImageMagick/ImageMagick/issues/6377)
- [**Tev** #226](https://github.com/Tom94/tev/issues/226)
- [HDRImageViewer #66](https://github.com/13thsymphony/HDRImageViewer/issues/66)
- [`ffmpeg` #10974](https://trac.ffmpeg.org/ticket/10974)
- [Pillow #8036](https://github.com/python-pillow/Pillow/issues/8036)
- [CanIUse #6759](https://github.com/Fyrd/caniuse/issues/6759)
- [`libjxl` #2685](https://github.com/libjxl/libjxl/issues/2685)
- [Memories #1110](https://github.com/pulsejet/memories/issues/1110)

There are also some first websites with support:
* [Gainmap Creator](https://gainmap-creator.monogrid.com/)
* [Demo for conversion using `ffmpeg` and `libultrahdr`](https://github.com/albertz/playground/wiki/HDR-demo) by [Albert Zeyer](https://github.com/albertz)
* [`libultrahdr` and Python](https://github.com/albertz/playground/blob/master/ultrahdr.py), also by Albert Zeyer

## Manual conversion with `ffmpeg`

Since the release of version 0.8 of `libultrahdr` the command line options have changed, here is the current (May 2024) version. It is important that:
* The dimensions of the input image are known (X, Y)
* The dimensions are divisible by two (even)

In the first step, a YUV representation of the input image must be generated, this is used as a gain map, i.e. as a definition of the gain.

```
ffmpeg -i input.jpg -filter:v format=p010 output.yuv
```

In the next step, the gain map created can then be used to generate the desired image:
```
ultrahdr_app -m 0 -p output.yuv -i input.jpg -w X -h Y -a 0
```

In the coming months it can be expected that the somewhat esoteric YUV format will either be easier to generate or can be dispensed with altogether.

## Docker Image

There is now also a Docker image that provides the latest version of `libultrahdr` together with ImageMagick with UltraHDR support.

```
docker pull ghcr.io/cmahnke/hdr-tools:latest
```

# Next steps

Currently, HDR support for HDR images and content is limited to Chrome and its derivative browsers, which have a 75% market share. The [HDR support of Firefox](https://bugzilla.mozilla.org/show_bug.cgi?id=hdr), or rather the way to get there, is rather embarrassing - not even HDR video formats are fully supported.

For Chrome-based browsers, however, it should also be possible to add HDR content to HTML canvas elements.
66 changes: 66 additions & 0 deletions content/post/ultrahdr/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
---
date: 2024-05-23T11:22:44+02:00
title: "LibUltraHDR"
tags:
- light
- Licht2024
- digitalImages
---

Für ein in Vorbereitung befindliches Projekt war es nach der [Recherche](/post/hdr-awesome-list/) notwendig einige Wege zu erkunden und Werkzeuge zu schaffen. Ausgehend von den Vorarbeiten von [Greg Benz](https://gregbenzphotography.com/hdr/), zur HDR-Unterstützung, war LibUltraHDR der sinnvollste Kandidat für weitere Experimente.

# LibUltraHDR

[LibUltraHDR](https://github.com/google/libultrahdr) ist primär eine Bibliothek für UltraHDR Inhalte. Das Format selber ist mit [MPO](https://en.wikipedia.org/wiki/JPEG#JPEG_Multi-Picture_Format) vergleichbar. Es existiert ein primäres Bild, hier ein SDR, dass auch als Fallback für Software ohne UltraHDR Unterstützung fungiert und in den Metadaten ein weiteres Bild, die sogenannte Gain Map. Diese bildet die auf das SDR anzuwendende Verstärkung ab. Mehr Informationen zur Funktionsweise von Gain Maps bietet [Adobe](https://helpx.adobe.com/camera-raw/using/gain-map.html).

Eine technische Dokumentation bietet [Android Developers](https://developer.android.com/media/platform/hdr-image-format?hl=de) (automatische Übersetzung von mäßiger Qualität).

## Status
Derzeit arbeiten Greg Benz und weitere daran bei relevanten Open Source Projekten um eine Unterstützung des Formats zu werben:
- [LibVips #3799](https://github.com/libvips/libvips/issues/3799)
- [ImageMagick #6377](https://github.com/ImageMagick/ImageMagick/issues/6377)
- [**Tev** #226](https://github.com/Tom94/tev/issues/226)
- [HDRImageViewer #66](https://github.com/13thsymphony/HDRImageViewer/issues/66)
- [`ffmpeg` #10974](https://trac.ffmpeg.org/ticket/10974)
- [Pillow #8036](https://github.com/python-pillow/Pillow/issues/8036)
- [CanIUse #6759](https://github.com/Fyrd/caniuse/issues/6759)
- [`libjxl` #2685](https://github.com/libjxl/libjxl/issues/2685)
- [Memories #1110](https://github.com/pulsejet/memories/issues/1110)

Es existieren auch einige erste Webseiten mit Unterstützung:
* [Gainmap Creator](https://gainmap-creator.monogrid.com/)
* [Demo für Konvertierung mittels `ffmpeg` und `libultrahdr`](https://github.com/albertz/playground/wiki/HDR-demo) von [Albert Zeyer](https://github.com/albertz)
* [`libultrahdr` and Python](https://github.com/albertz/playground/blob/master/ultrahdr.py), ebenfalls von Albert Zeyer

## Manuelle Konvertierung mit `ffmpeg`

Seit dem Release von Version 0.8 von `libultrahdr` haben sich die Kommandozeilenoptionen geändert, hier die aktuelle (Mai 2024) Fassung. Wichtig ist, dass:
* Die Abmessungen des Eingangsbildes bekannt sind (X, Y)
* Die Abmessung durch zwei teilbar (gerade) sind

Im ersten Schritt muss eine YUV Repäsentation des Eingangsbildes erzeugt werden, diese wird als Gain Map genutzt, also als Definition der Verstärkung.

```
ffmpeg -i input.jpg -filter:v format=p010 output.yuv
```

Im nächsten Schritt kann dann die erstellte Gain Map genutzt werden um das gewünschte Bild zu erzeugen:
```
ultrahdr_app -m 0 -p output.yuv -i input.jpg -w X -h Y -a 0
```

In den nächsten Monaten kann damit gerechnet werden, dass das etwas esoterische YUV Format entweder leichter erzeugt werden kann oder gänzlich drauf verzichtet werden kann.

## Docker Image

Es existiert nun auch ein Docker Image, dass die jeweils aktuellste Version von `libultrahdr` zusammen mit ImageMagick mit UltraHDR Unterstützung bereitstellt.

```
docker pull ghcr.io/cmahnke/hdr-tools:latest
```

# Nächste Schritte

Derzeit ist die HDR Unterstützung von HDR-Bildern und -Inhalten auf Chrome und davon abgeleitete Browser beschränkt, diese habe allerdings einen Marktanteil von 75%. Die [HDR Unterstützung von Firefox](https://bugzilla.mozilla.org/show_bug.cgi?id=hdr), oder besser der Weg dahin, ist eher peinlich - so werden nicht mal HDR Video-Formate voll unterstützt.

Für die Chrome-basierten Browsern allerdings soll es auch möglich sein, HTML Canvas Elemente mit HDR Inhalten zu bespielen.

0 comments on commit 573c0c3

Please sign in to comment.