libjpeg ist eine vielgenutzte freie Programmbibliothek mit Funktionen zum Umgang mit dem Bilddatenformat JPEG. Sie implementiert einen JPEG-Codec (Kodierung und Dekodierung) sowie verschiedene Hilfsfunktionen zum Umgang mit JPEG-Daten. Sie ist in C geschrieben und wird als freie Software auch im Quelltext unter den Bedingungen einer eigenen liberalen (BSD-artigen) Freie-Software-Lizenz verbreitet, die im Wesentlichen eine Namensnennung verlangt.[2]

libjpeg

Logo von Version 9 des JPEG-Codecs der Independent JPEG Group (IJG)
Basisdaten

Entwickler Independent JPEG Group
Erscheinungsjahr 7. Oktober 1991
Aktuelle Version 9f[1]
(14. Januar 2024)
Betriebssystem plattformunabhängig
Programmier­sprache C
Kategorie Programmbibliothek
Lizenz BSD-artig (Freie Software)
ijg.org

Die ursprüngliche Variante wird von der Independent JPEG Group (IJG) herausgegeben und gepflegt. Mittlerweile gibt es mehrere weitgehend kompatible Abspaltungen mit zusätzlichen Eigenschaften wie beispielsweise höherer Kodiereffizienz.

Hilfsprogramme

Bearbeiten
 
Übersicht der Hilfsprogramme

Die folgenden Hilfsprogramme werden mit libjpeg ausgeliefert:

cjpeg und djpeg
zur Konvertierung zwischen JPEG und einigen anderen gebräuchlichen Bilddateiformaten,
rdjpgcom und wrjpgcom
zum Einfügen und Auslesen von Textkommentaren in JPEG-Dateien und
jpegtran
ein Hilfsprogramm zum Transformieren bestehender JPEG-Dateien.

jpegtran

Bearbeiten
 
jpegtran transformiert JPEG-Daten ohne Neukodierung
(hier mit Oberfläche CropGUI)

Das Kommandozeilenprogramm jpegtran bietet jeweils mehrere Funktionen zum Umformatieren und Umkodieren der Repräsentation der bestehenden DCT-Koeffizienten, zur Transformation der eigentlichen Bilddaten und zum Verwerfen von Zusatzdaten in JPEG-Dateien. Die Transformationen bezüglich der Repräsentation der Koeffizienten umfassen

Diese Transformationen sind jeweils vollständig verlustfrei und reversibel. Die Bilddatentransformationen umfassen

  • das Verwerfen von Farbkanälen (Konvertierung zu Graustufenbild),
  • Rotieren und Spiegeln in 90-Grad-Schritten,
  • Beschneiden entlang der Bildblockgrenzen (8×8 beziehungsweise 16×16 Pixel) und
  • Skalieren.[6]

Sie sind zumindest im Hinblick auf die letztlich erhaltenen Bilddatenanteile verlustfrei und reversibel. Eine Dekomprimierung und Neukomprimierung der Daten, durch die eine erneute Reduktion der Bildqualität und damit ein Generationsverlust aufträte, findet nicht statt.

Es gibt eine zugehörige Windows-Anwendung namens Jpegcrop, welche eine graphische Benutzeroberfläche zu jpegtran bietet. Für unixoide Systeme wie GNU/Linux gibt es die freie CropGUI mit ähnlicher Funktionalität.

Geschichte

Bearbeiten

Die JPEG-Implementierung der Independent JPEG Group (IJG) wurde erstmals am 7. Oktober 1991 veröffentlicht und seither beträchtlich weiterentwickelt. Die Entwicklung wurde anfangs namentlich hauptsächlich von Tom Lane getragen. Die quelloffene Implementierung von der IJG war eines der wichtigsten Pakete quelloffener Software für JPEG und auch ein Schlüssel für den Erfolg des Standards. Es wurde von vielen Firmen in einer breiten Palette von Produkten wie Bildbearbeitungsprogrammen oder Webbrowsern eingesetzt.[7]

Für die am 24. September 1994 veröffentlichte Version 5 wurde die gesamte Codebasis neugeschrieben. Mit ihr wurden die Hilfsprogramme rdjpgcom und wrjpgcom zum Umgang mit eingebetteten Textkommentaren eingeführt. Die am 2. August 1995 veröffentlichte Version 6 kam mit Unterstützung für progressives JPEG und erstmals mit dem Hilfsprogramm jpegtran. Dieses wurde in Version 6b erweitert um die Funktionen zum Rotieren und Spiegeln sowie zur Farb-Reduktion auf Graustufen.

Aus Version 6b von libjpeg vom 27. März 1998 entwickelte Miyasaka Masaru den Zweig libjpeg/SIMD, der x86-SIMD-Optimierungen integrierte. Zu diesem leisteten die Projekte TigerVNC und VirtualGL 2009 wesentliche Beiträge. Auf dieser Basis entstand Anfang 2010 das libjpeg-turbo-Projekt.[8]

Die IJG brachte nach einem Führungswechsel nach 11 Jahren ohne Veröffentlichung neue libjpeg-Versionen (7 bis 9) heraus, die jeweils die Kompatibilität der Binärschnittstelle (ABI) zu vorhergehenden Versionen brachen.[9] Die nach den 6er-Versionen in Aussicht gestellten Weiterentwicklungen blieben aus.[10] In Version 7 wurde Unterstützung für arithmetische Kodierung eingeführt, welche zuvor aus patentrechtlichen Gründen abgelehnt worden war, sowie außerdem die Beschneide-Funktion in jpegtran (-crop).[10] Versionen 8 und 9 dienten im Wesentlichen der Einführung von umstrittenen[11] inkompatiblen Formaterweiterungen. Diese gelten weithin als ineffektiv und bestehenden, standardisierten Lösungen gegenüber als unterlegen.[12][13] Ihre Standardisierung wurde nach Vorlage bei der ITU-T abgelehnt. Der ursprüngliche Organisator Tom Lane und andere sprechen von einem Bruch mit den früheren Zielen der IJG.

Am 4. März 2014 wurde die erste Version der dateigrößenoptimierenden Abspaltung mozjpeg veröffentlicht. Für diese überarbeitete Josh Aas von Mozilla Research das Perl-Skript jpegcrush vom x264-Hauptentwickler Loren Merritt und integrierte es in die Code-Basis von libjpeg-turbo.[14] Am 10. Juli veröffentlichte Mozilla Version 2.0, die hauptsächlich Trellis-Quantisierung nachrüstet und nun auch baseline-JPEGs weiter optimieren kann. Facebook Inc. (Heute: Meta Platforms) spendete daraufhin 60.000 US-Dollar für die Entwicklung der nächsten Version,[15] und CloudFlare beauftragte einen Entwickler mit der Weiterentwicklung.[16]

Abspaltungen

Bearbeiten

Bekanntere Abspaltungen sind das Projekt libjpeg-turbo, das sein Produkt auf Ausführungsgeschwindigkeit optimiert, und mozjpeg, welches auf geringe Dateigrößen optimiert. Daneben existiert eine libjpeg von der ISO, die auf eine vollständige Implementierung aller JPEG-1-Standards zielt.[17]

libjpeg-turbo

Bearbeiten
libjpeg-turbo

 
Basisdaten

Entwickler libjpeg-turbo Project
Erscheinungsjahr 2010
Aktuelle Version 3.1.0
(12. Dezember 2024[18])
Betriebssystem Plattformunabhängig
Programmier­sprache C[19]
libjpeg-turbo.org

libjpeg-turbo ist eine Abspaltung von libjpeg, die SIMD-Befehle zur Beschleunigung der Kodierung und Dekodierung von baseline-JPEG nutzt. Viele Projekte nutzen nun libjpeg-turbo anstatt von libjpeg, einschließlich populärer GNU/Linux-Distributionen (u. a. Debian, Ubuntu, Mageia, Fedora), Mozilla und Chrome.[20][21][22] Manche Projekte haben sich außer den Leistungsvorteilen auch zur Erhaltung der Binärschnittstellen-Kompatibilität zur älteren Version 6b von libjpeg für libjpeg-turbo entschieden.[23]

libjpeg-turbo kann so übersetzt werden, dass die Binärschnittstelle kompatibel zu Version 7 oder 8 von libjpeg ist, wobei nicht der volle Funktionsumfang neuerer IJG-Veröffentlichungen umgesetzt wird.[24] Das Projekt entschied sich gegen die Unterstützung der SmartScale-Formaterweiterung, wobei es darauf verwies, dass es keinen ITU-T-Standard darstellt und eigene Forschung anführte, die die Nützlichkeit der Funktion anzweifeln lässt. Weiterhin hat das libjpeg-turbo-Projekt entschieden, Version 9 von libjpeg nicht nachzuahmen, da dessen einzige neue Funktion nur das SmartScale-Format betrifft.[12] Daher werden die mit Version 8 und späteren Versionen von libjpeg erzeugte SmartScale-Dateien von libjpeg-turbo nicht korrekt dekomprimiert.

Seit Februar 2019 ist libjpeg-turbo eine von zwei offiziellen JPEG-Referenzimplementierungen.[25]

libjpeg

 
 
mozcjpeg probiert verschiedene Aufteilungen des DCT-Koeffizienten-Spektrums
Basisdaten

Entwickler Mozilla Research
Erscheinungsjahr 4. März 2014
Aktuelle Version 4.1.1
(15. August 2022[26])
Betriebssystem Plattformunabhängig
Programmier­sprache C[19]
github.com/mozilla/mozjpeg

mozjpeg ist eine Abspaltung von libjpeg-turbo von Josh Aas und anderen von Mozilla Research. Es soll einer Beschleunigung der Ladezeiten von Webseiten dienen, indem durch eine Verbesserung der Kodiereffizienz bei gleichbleibender Bildqualität (etwa 10 Prozent) geringere Dateigrößen und damit verringerter Übertragungszeiten erreicht werden. Dazu soll ein höherer Rechenaufwand bei der hier typischerweise einmaligen Kodierung der Dateien dienen (Asymmetrie), wobei die Formatkompatibilität erhalten wird und auf Dekodierer-Seite keine Änderungen nötig werden. Konkret wird dies durch Optimierung der Huffman-Bäume, Einsatz progressiver Kodierung mit optimierter Aufteilung des DCT-Koeffizienten-Spektrums auf einzelne Durchläufe und Nutzung von Trellis-Quantisierung erreicht. Dazu sind die Voreinstellungen entsprechend aggressiv auf die Minimierung von Dateigrößen optimiert. mozjpeg baut neben libjpeg-turbo auf jpegcrush, einem Perl-Skript von Loren Merritt, auf.[14][27]

jpegli ist eine Neu-Implementierung einer JPEG-Bibliothek (keine Abspaltung im klassischen Sinn), die im April 2024 offiziell vorgestellt wurde. Sie entstand als Nebenprodukt bei der Entwicklung des JPEG-Nachfolgers JPEG XL und basiert auf dessen Technik. Durch verschiedene Maßnahmen wie die Wahrnehmungsoptimierung und eine präzisere Berechnung von Zwischenwerten wird eine bessere Qualität oder Kompression im Vergleich zu den herkömmlichen Bibliotheken erzielt. Die Entwickler geben für den neuen Encoder eine Verbesserung von 35 % bei hohen Bildqualitäten an. Die Weiterentwicklung erfolgt seit Juli 2024 in einem eigenen Repository.[28][29][30][31][32]

Bearbeiten
Commons: libjpeg – Sammlung von Bildern, Videos und Audiodateien
  1. Independent JPEG Group. (abgerufen am 27. Januar 2024).
  2. Libjpeg License – JPEG Reference. In: jpegclub.org. Abgerufen am 7. September 2016.
  3. Jpegcrop Preferences and Options description
  4. Filmic Games >> The greatest failure of our patent system was... (Memento des Originals vom 1. September 2012 im Internet Archive)  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/filmicgames.com
  5. 680385 – Firefox does not show arithmetic coded jpegs
  6. New jpegtran features
  7. JPEG homepage
  8. http://libjpeg-turbo.virtualgl.org/
  9. libjpeg: API changes/compatibility (Memento des Originals vom 16. April 2014 im Internet Archive)  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/upstream-tracker.org. 9. Februar 2012
  10. a b Mans Rullgard (Hardwarebug.org), 4. August 2009: IJG is back
  11. Tom Lane, 16. Januar 2013: jpeg-9, API/ABI compatibility, and the future role of this project
  12. a b What About libjpeg v9? libjpeg-turbo team, abgerufen am 8. Februar 2013.
  13. Mans Rullgard (Hardwarebug.org), 1. Februar 2010: IJG swings again, and misses
  14. a b André Kramer (heise.de-Newsticker), 14. Januar 2013: Mozilla-Encoder verbessert JPEG-Kompression
  15. Sebastian Grüner, 16. Juli 2014: mozjpeg 2.0: Facebook unterstützt JPEG-Encoder von Mozilla
  16. http://www.soeren-hentzschel.at/mozilla/2014/07/30/cloudflare-moechte-zu-mozillas-jpeg-encoder-beitragen/
  17. https://github.com/thorfdbg/libjpeg
  18. [1]
  19. a b The libjpeg Open Source Project on Open Hub: Languages Page. In: Open Hub. (abgerufen am 26. September 2018).
  20. Software That Uses or Provides libjpeg-turbo. 9. Februar 2012.
  21. Issue 48789 – chromium – Use libjpeg-turbo instead of libjpeg. 14. April 2011.
  22. Bug 698519 – Update to libjpeg-turbo 1.2. 28. Februar 2012
  23. libjpeg for F14. 9. Februar 2012.
  24. libjpeg-turbo README file (Memento des Originals vom 12. August 2014 im Internet Archive)  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/sourceforge.net
  25. JPEG - 82nd Meeting – Lisbon, Portugal - JPEG develops an XLM verification model for its Next Generation Image Coding Standard (JPEG XL). Abgerufen am 22. September 2024.
  26. [2]
  27. Andreas Donath (golem.de), 6. März 2014: Mozilla will JPEGs besser komprimieren
  28. Introducing Jpegli: A New JPEG Coding Library. In: Google Open Source Blog. Abgerufen am 2. Mai 2024.
  29. Jyrki Alakuijala: jpegli encoder is ready for first server side deployments. 19. April 2023, abgerufen am 25. Dezember 2023 (englisch).
  30. libjxl/lib/jpegli/README.md at v0.9.x · libjxl/libjxl. Abgerufen am 25. Dezember 2023 (englisch).
  31. Mini Image Codec Comparison; jpegli. Abgerufen am 25. Dezember 2023.
  32. google/jpegli. Google, 9. Juli 2024, abgerufen am 9. Juli 2024.