hdr-canvas aktualisiert…
Ein Ergebnis meiner Arbeit mit HDR-Inhalten im Browser ist ein NPM-Modul, das auch zur Erstellung der Beiträge in diesem Blog verwendet wurde. In diesem Beitrag werden die letzten Änderungen zusammengefasst. Bei neuen Versionen wird er aktualisiert.
Version 0.4.0
Einleitung
Diese Version führt wieder eine ressourcenschonende Methode zur Skalierung von Farben in den HDR-Bereich ein und schließt die Bereinigung von Uint16 ab: Uint16Array war der experimentelle HDR-Pfad in Chromium vor Version 137; er ist bewusst weder Teil der WHATWG-Spezifikation (nur Uint8ClampedArray | Float16Array) noch der TypeScript-
Wichtige Änderungen und neue Funktionen
- Neue HDR-Verstärkungsskalierung
Float16Image(ersetzt die entfernte, aufcolorjs.iobasierende Konvertierung durch eine abhängigkeitsfreie lineare Verstärkung)applyGain(gain)(in situ) undscaled(gain)(auf einer Kopie), mit einheitlicher Verstärkungnumberoder kanalweiser Verstärkung[r, g, b]. Alpha wird standardmäßig beibehalten.- Werte
>1werden in den HDR-Headroom verschoben und sind nur auf einer Leinwand mittoneMapping: { mode: "extended" }sichtbar (siehegetHdrOptions()), andernfalls werden sie auf SDR-Weiß abgeschnitten. - Der Demo-Bildschieberegler (
tests/site/assets/ts/image-slider.ts) verwendet nunscaled()anstelle seines selbst implementiertenpixelCallback(Schieberegler50entspricht Verstärkung1,100entspricht Verstärkung2). - Neue Testsuite
Float16ImageGain.
- Bereinigung der Typen (mit Kompatibilitätsbruch)
Uint16Arraywurde aus den exportierten TypenHDRImageDataArrayundHDRImageDataentfernt.HDRImage.SDR_MULTIPLIERwurde als veraltet markiert (aus Kompatibilitätsgründen beibehalten; verwende stattdessenapplyGain()/scaled()) und die Dokumentation zuHDRImagePixelCallbackwurde korrigiert (Ganzzahlen von0–65535auf Floats von0–1für SDR bzw.>1für HDR-Headroom).
- Dokumentation: In der README-Datei wird der Paketbereich angegeben (
@projektemacher/hdr-canvasauf npm,@cmahnke/hdr-canvasauf GitHub Packages). - Experimentelle WASM-Beschleunigung zur Leistungssteigerung (AssemblyScript-Kernel, als Base64 eingebettet, standardmäßig deaktiviert und über
setWasmEnabled(true)mit transparentem JS-Fallback aktiviert)- Gemessen auf Node 24 über 12 Millionen Werte: JS ~12 ms gegenüber WASM ~51 ms (~3 ms Kopiervorgänge) – Engines mit nativem
Float16Arraynutzen eine hardwarebasierte F16C-Konvertierung, die der Skalar-Kernel nicht übertreffen kann; daher bleibt das Flag vorerst deaktiviert und dient als getestete Infrastruktur (Parität innerhalb von 1 ulp) für zukünftige rechenintensive Kernel.
- Gemessen auf Node 24 über 12 Millionen Werte: JS ~12 ms gegenüber WASM ~51 ms (~3 ms Kopiervorgänge) – Engines mit nativem
- Pflege der Zitiermetadaten (
url,dateReleased) und Aktualisierung der Abhängigkeiten (einschließlichassemblyscriptalsdevDependency).
Version 0.3.1
Einleitung
Reine Metadaten-Veröffentlichung, keine funktionalen Änderungen seit 0.3.0.
Wichtige Änderungen und neue Funktionen
CITATION.cffundcodemeta.jsonwurden hinzugefügt (mit einem Workflow, der die Dateien synchron hält).- Ein Deploy-Guard wurde zu
.github/workflows/npm.ymlhinzugefügt: Die Veröffentlichung wird übersprungen, wenn die Version bereits im Registry vorhanden ist, sodass erzwungene manuelle Neuveröffentlichungen nicht mehr fehlschlagen. - Versionssprung von 0.3.0 auf 0.3.1.
Version 0.3.0
Einleitung
Mit dieser Version wird das Paket in eine Organisation verschoben und WCG von der HDR-Erkennung getrennt.
Das Paket wird nun als @projektemacher/hdr-canvas auf npm veröffentlicht (GitHub Packages veröffentlicht es als @cmahnke/hdr-canvas über eine Umschreibung in .github/workflows/npm.yml):
npm i @projektemacher/hdr-canvas
Außerdem wurde main auf dist/hdr-canvas.js korrigiert und der Tippfehler LICENCE in der Liste files in LICENSE geändert.
Wichtige Änderungen und neue Funktionen
- WCG und HDR separat erkennen (#23, #107)
- Neue Prüfungen:
checkWCG,checkWCGCanvas,checkDynamicRangeHigh,checkColorGamutP3/checkColorGamutRec2020undgetWcgOptions()(display-p3, für Browser, die nur WCG unterstützen, wie Safari und Firefox unter macOS). - Neue Funktionen
getDisplayCapabilities()undonDisplayChange()(Abonnements fürchange-Ereignisse bei Media Queries mit Polling-Fallback), sodass beim Verschieben eines Fensters zwischen Bildschirmen die Anzeige neu bewertet wird. - Überprüfungen gegen fehlende
window/document/screenwurden verstärkt. - Demo-Website, README-Dokumentation und Import-Fixture wurden aktualisiert; neue Testsuiten
hdr-checkunddisplay-changewurden hinzugefügt.
- Neue Prüfungen:
- Robustere Basisklasse
HDRImage- Nicht implementierte Stubs für
fromImageData/fromImageDataArraywurden entfernt. loadSDRImageData()prüftresponse.okund fängt Fehler ab, anstatt den Vorgang abzubrechen.getPixel()/setPixel()lösen außerhalb der Bildgrenzen einenRangeErroraus.clone()wurde korrigiert, sodass nun tatsächlich eine tiefe Kopie vondataerstellt wird.
- Nicht implementierte Stubs für
- Die Safari-Handhabung wurde in
src/browser.ts(isSafari()) ausgelagert und wird insrc/hdr-canvas.tssowie (dupliziert und synchronisiert) inthree/HDRWebGPUBackend.jswiederverwendet. defaultGetContextHDR()ist nun idempotent und passt nur"2d"-Kontexte an;resetGetContext()stellt den ursprünglichengetContextvollständig wieder her.- Neue globale Konfiguration in
tests/version-check.ts, dieengines.nodefür den Testlauf erzwingt. - Aktualisierungen der Abhängigkeiten, einschließlich
vitestvon Version 4 auf 5.
Version 0.2.0
Einleitung
Folgende Elemente wurden entfernt:
- die Unterstützung für Chrom(e|ium) < 140
Uint16Image- Hilfsfunktionen zur Überprüfung der Browserversion
- gebündelte UMD- und IIFE-Builds
colorjs.ioist keine direkte Abhängigkeit mehr
Unterstützung für Safari wurde eingeführt (aktuelles Ziel ist Safari Technology Preview R232 und höher): Dies erfordert das Feature-Flag “Canvas Color Types and ImageData Pixel Formats”. Der Farbraum rec2100-hlg wird derzeit jedoch nicht unterstützt.
Wichtige Änderungen & neue Funktionen
- Check-Funktion für
Float16Array - Die Unterstützung für
Float16Arraywird nun von@petamoriken/float16übernommen
Entfernung von colorjs.io
Obwohl colorjs.io für Farbraumkonvertierungen sehr hilfreich ist, vergrößert es das Paket erheblich. Da es andere Pakete für die Verarbeitung von Float16 gibt, wurde das Paket entfernt. Wenn Sie eigene Konvertierungen benötigen, fügen Sie es Ihrem Projekt hinzu:
npm install colorjs.io
Version 0.1.1 - 0.1.2
Diese Aktualisierungen waren notwendig, um diese Blogbeiträge zu reparieren:
0.1.1
Änderungen an der Initialisierung eines WebGPU Kontexts für canvas
Die Änderungen bei der Initialisierung eines canvas für einen Renderer werden in der Erklärung beschrieben.
Die wichtigste Änderung ist die Umbenennung von „colorMetadata” in:
toneMapping: { mode: „extended“ }
0.1.2
Die Farbskalierung von Float16Image war falsch, die Skalierung funktionierte nur für 0% - 1%.
Version 0.1.0
Seit den ersten Versionen ist aber ungefähr ein Jahr vergangen und die Browser-API war damals eher als experimentell zu bezeichnen. Seitdem hat sich einiges geändert – eines der Beispiele hatte in der Zwischenzeit sogar aufgehört zu funktionieren: Die wichtigste Änderung betrifft die Änderung von Uint16 zu Float16 als 16 Bit Pixeldatentyp für HDR.
Da sich Browser schnell weiterentwickeln und der Betrieb älterer Browser aus Sicherheitsgründen nicht zu empfehlen ist (auch wenn manche das anders sehen), ist keine Abwärtskompatibilität zu erwarten.
Neben den notwendigen Anpassungen bietet die neue Version auch Verbesserungen im Bereich der Dokumentation und der Beispiele.
Der Code ist auf GitHub und NPM zu finden.
Die Release Notes
Einleitung
Seit der letzten Veröffentlichung haben sich viele Bereiche der Verarbeitung von HDR-Inhalten im Browser weiterentwickelt. Am auffälligsten ist sicherlich die Einführung von „Float16Array” im „ImageData”-Konstruktor:
- Die WhatWG-Spezifikation, MDN und BCD) wurden entsprechend aktualisiert. Sie können Ihren eigenen Browser mit
new ImageData(new Float16Array(4), 1, 1, {pixelFormat:„rgba-float16“})testen.- Noch offen in Firefox
- In Safari hinter einem Flag versteckt
- Chromium hat es ab 137 implementiert: **Der Konstruktor
ImageDataakzeptiert nurFloat16Arrayanstelle vonUint16Array. Dadurch werden ältere Versionen dieses Moduls überflüssig, da sie auf die Chromium-spezifische Lösung ausgerichtet waren. - Wenn Safari dies standardmäßig aktiviert, wird es auch in den Typescript-DOM-Typen enthalten sein.
Wie @reitowo bereits angemerkt hat, gab es eine Änderung an der Methode getContext(„2d“). Der Schlüssel pixelFormat wurde durch colorType ersetzt.
Parallel dazu gab es Änderungen am UltraHDR-Bildformat, insbesondere bei der Kodierung der Metadaten der Gain-Map. Während dies früher in XMP erfolgte, geschieht dies nun gemäß ISO 21496-1. Dies wurde von Google und Apple in neueren Betriebssystemversionen wie Android 15 und iOS 18 übernommen, um eine plattformübergreifende Fragmentierung zu vermeiden. Die UltraHDR-Bibliothek wurde bereits so geändert, dass sie standardmäßig das ISO-Format verwendet.
Derzeit weiß der ThreeJS UHDR-Loader nicht, wie er mit dieser Änderung umgehen soll, siehe mrdoob/three.js#32293.
Wichtige Änderungen und neue Funktionen
- Bessere Unterstützung für offizielle Web-APIs
- Verwendung von
Float16Arrayanstelle vonUint16Array - Verwendung der richtigen Option zur Initialisierung des 2D-Canvas-Kontexts
- Verwendung von
Verbesserte Dokumentation
Die Dokumentation wurde erheblich verbessert. Es gibt jetzt auch eine Website mit Beispielen und API-Dokumentationen.
Beispiele
Die Beispiele aus dem Blog sind nun Teil dieses Repositorys:
tests/site/assets/ts/hdr-three.js.ts– Three JS mit HDR-Texturtests/site/assets/ts/image-slider.ts– Generierte HDR-Inhaltetests/site/assets/ts/main.ts– Funktionserkennung
Diese Beispiele sind auch auf der neuen Dokumentationsseite verfügbar.
Einflussnahme
Da die Änderungen der WhatWG noch nicht übernommen worden waren, mussten einige Probleme in den entsprechenden Repositories angesprochen werden.
- mdn/content#40639
- mdn/browser-compat-data#27547
- microsoft/TypeScript-DOM-lib-generator#2107
- mrdoob/three.js#32293.
Update 13.10.2026
Wie bereits angekündigt wurde hdr-canvas in @projektemacher/hdr-canvas unbenannt.