libjpeg
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 | |
---|---|
Basisdaten | |
Entwickler | Independent JPEG Group |
Erscheinungsjahr | 7. Oktober 1991 |
Aktuelle Version | 9d[1] (12. Januar 2020) |
Betriebssystem | plattformunabhängig |
Programmiersprache | 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
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
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
- die Optimierung der Huffman-Bäume und
- Konvertierung zwischen Huffman- und arithmetischer Kodierung in der Entropiekodierungs-Schicht,[3][4][5] sowie
- die Konvertierung zwischen sequenziellem und progressivem JPEG.
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
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
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
libjpeg-turbo | |
---|---|
Basisdaten | |
Entwickler | libjpeg-turbo Project |
Erscheinungsjahr | 2010 |
Aktuelle Version | 1.5.1 (21. September 2016[18]) |
Betriebssystem | Plattformunabhängig |
Programmiersprache | 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.
mozjpeg
libjpeg | |
---|---|
mozcjpeg probiert verschiedene Aufteilungen des DCT-Koeffizienten-Spektrums | |
Basisdaten | |
Maintainer | Josh Aas |
Entwickler | Mozilla Research |
Erscheinungsjahr | 4. März 2014 |
Aktuelle Version | 3.1 (18. Mai 2015) |
Betriebssystem | Plattformunabhängig |
Programmiersprache | 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][25]
Weblinks
- Webpräsenz der Independent JPEG Group
- JPEGclub – zusätzliche Funktionen für libjpeg
- Binärdateien von libjpeg für Windows (von GnuWin32 auf SourceForge.net)
- libjpeg-turbo, eine ABI-/API-kompatible Abspaltung von libjpeg, die x86-SIMD-Befehle für einen wesentlichen Geschwindigkeitsvorteil gegenüber der Referenzimplementierung nutzt.
- Webpräsenz von mozjpeg, der auf Dateigrößenminimierung optimierten Abspaltung
- Josh Aas, Robert Nyman; August 2014: Using mozjpeg to Create Efficient JPEGs – praktischer Überblick zu mozjpeg, englischsprachig
Quellen
- Independent JPEG Group. (abgerufen am 15. Mai 2020).
- Libjpeg License – JPEG Reference. In: jpegclub.org. Abgerufen am 7. September 2016.
- Jpegcrop Preferences and Options description
- 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.
- 680385 – Firefox does not show arithmetic coded jpegs
- New jpegtran features
- JPEG homepage
- http://libjpeg-turbo.virtualgl.org/
- 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. . 9. Februar 2012
- Mans Rullgard (Hardwarebug.org), 4. August 2009: IJG is back
- Tom Lane, 16. Januar 2013: jpeg-9, API/ABI compatibility, and the future role of this project
- What About libjpeg v9?. libjpeg-turbo team. Abgerufen am 8. Februar 2013.
- Mans Rullgard (Hardwarebug.org), 1. Februar 2010: IJG swings again, and misses
- André Kramer (heise.de-Newsticker), 14. Januar 2013: Mozilla-Encoder verbessert JPEG-Kompression
- Sebastian Grüner, 16. Juli 2014: mozjpeg 2.0: Facebook unterstützt JPEG-Encoder von Mozilla
- http://www.soeren-hentzschel.at/mozilla/2014/07/30/cloudflare-moechte-zu-mozillas-jpeg-encoder-beitragen/
- https://github.com/thorfdbg/libjpeg
- Release 1.5.1
- The libjpeg Open Source Project on Open Hub: Languages Page. In: Open Hub. (abgerufen am 26. September 2018).
- Software That Uses or Provides libjpeg-turbo. 9. Februar 2012.
- Issue 48789 – chromium – Use libjpeg-turbo instead of libjpeg. 14. April 2011.
- Bug 698519 – Update to libjpeg-turbo 1.2. 28. Februar 2012
- libjpeg for F14. 9. Februar 2012.
- 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.
- Andreas Donath (golem.de), 6. März 2014: Mozilla will JPEGs besser komprimieren