# 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.
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, 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.
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.
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.
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. Die nach den 6er-Versionen in Aussicht gestellten Weiterentwicklungen blieben aus. 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). Versionen 8 und 9 dienten im Wesentlichen der Einführung von umstrittenen inkompatiblen Formaterweiterungen. Diese gelten weithin als ineffektiv und bestehenden, standardisierten Lösungen gegenüber als unterlegen. 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. 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, und CloudFlare beauftragte einen Entwickler mit der Weiterentwicklung.

## 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.

### libjpeg-turbo

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. 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.
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. 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. 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.

### 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.

### jpegli

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.