Dropbox hat kürzlich Lepton ( GitHub ) veröffentlicht, eine Methode, die JPEG-Bilder verlustfrei komprimiert und dabei durchschnittlich 22% einspart.
Aufgrund des Pigeonhole-Prinzips kann nicht garantiert werden , dass ein allgemeiner Komprimierungsalgorithmus zu einer kleineren Datei führt ( allgemein, da er nicht für Eingaben gilt, die auf ein bestimmtes Format beschränkt sind). Lepton nutzt die allgemeinen Eigenschaften von JPEGs aus, die, wenn sie unterwandert werden, in eine Schublade gesteckt werden können, um eine Datei zu erstellen, die größer als die Quelle ist.
Bedarf
Schreiben Sie ein Programm, das Folgendes generiert:
- Ein gültiges JPEG / JFIF-Bild,
- mit einer Größe zwischen 0,5 MB und 1 MB,
- nicht kleiner als 256 × 256 px,
- nicht größer als 4096 × 4096 px,
- erkennbar an Lepton (es kann erfolgreich zu einem
.lep
Bild "komprimiert" werden) und - dekomprimiert auf eine identische
.jpg
(als Eingabe). APPx
,COM
Und andere Metadaten, nicht-grafische Markierungsabschnitte sind in den JPEG (Injizieren beliebigen Mengen von Zufallsbytes in das Bild asymptotisch nähern . 1: 1 - Komprimierung lahm) eingeschränkt- Ein
APP0
JFIF-Marker ist zulässig, aber keine Miniaturansicht (sollte genau 16 Byte groß sein). - tl; dr Wenn Sie Metadaten nicht absichtlich in ein EXIF-Segment verschieben und eine beliebige Art von Miniaturbild deaktivieren, das Ihre Sprachbibliothek in das Bild einfügen möchte, sollte dies in Ordnung sein.
- Ein
Posten Sie den Code und das Bild.
Wenn Sie ein Programm schreiben möchten, das ein Lepton- Bild erzeugt, das bei der Konvertierung ein JPEG ergibt, das die Kriterien erfüllt, ist das in Ordnung. Es muss über beliebig viele JPEG → Lepton → JPEG → ... Zyklen hinweg identisch bleiben.
Wertung
Die Bytegröße des Lepton-Bildes geteilt durch das JPEG-Quellbild. Höhere (schlechtere Lepton-Komprimierung) ist besser. Führen Sie Lepton mit Standardflags und -schaltern aus.
Lepton bekommen
Ein 5-Sekunden-Crashkurs zum Bau von Lepton:
git clone https://github.com/dropbox/lepton.git
cd lepton
./autogen.sh && ./configure && make
# fish shell: ./autogen.sh ;and ./configure ;and make
Dann ./lepton --help
sollten Sie Dinge erzählen.
Antworten:
Python 3 + Mozjpeg + / dev / urandom, 720 × 720: Durchschn. Ergebnis 102%
Abhängig vom
mozjpeg
Paket geht der Code davon aus, dass es installiert ist/usr/local/opt/mozjpeg
. (Unter OS X ist es einfach zu installieren, einfach ausführenbrew install mozjpeg
)Es hängt auch von einer
/dev/urandom
speziellen Datei ab, die zur Erzeugung von Zufallsdaten verwendet wird.Der Code speist einfach zufällige Daten in den
mozjpeg
Kompressor ein (im TGA-Format, da CJPEG dies versteht und einen sehr einfachen Header hat) und ermöglicht es ihm, eine optimierte JPEG-Datei zu erstellen. Die Qualität ist auf das Maximum eingestellt, da DCT-Koeffizienten am wenigsten komprimierbar sind und es keine Rolle spielt, welcher Algorithmus zum Komprimieren nicht komprimierbarer Daten verwendet wird.Ich habe überprüft, ob der JPEG-> LEPTON-> JPEG-Zyklus verlustfrei ist - das stimmt.
Code wird offensichtlich nicht gespielt.
Beispielbild:
Unterhaltsame Tatsache: Die generierte JPEG-Datei ist größer als das unkomprimierte TGA-Quellbild, obwohl JPEG eine verlustbehaftete Komprimierung verwendet.
Unterhaltsame Tatsache 2: Imgur (das Standard-Image-Hosting für SO) leistet bei dieser Datei sehr schlechte Arbeit - aus irgendeinem Grund wird sie auf eine niedrigere Qualität komprimiert, obwohl sie weniger als 1 MB groß ist. Also habe ich Github verwendet, um das Beispielbild hochzuladen.
Unterhaltsame Tatsache 3: Im Allgemeinen ist Mozjpeg in der Tat besser für die JPEG-Komprimierung geeignet, während es mit vorhandenen JPEG-Decodern kompatibel bleibt. Und es hat auch ein Tool, um JPEG-Dateien verlustfrei zu optimieren -
jpegtran
.quelle
Naives Rauschen, 1024 × 1024: Ergebnis 85.55%
Ein konformes Beispiel in Python, um den Ball ins Rollen zu bringen. In keiner Weise optimiert; wahrscheinliche Mängel:
Dann ein paar Schläge, um das Ding zu machen:
quelle