Befehlszeilentool für verlustfreie JPEG-Komprimierung und -Optimierung für Ubuntu

Ich suche nach einem verlustfreien JPEG-Komprimierungstool für die Befehlszeile, das die folgende Funktionalität hat:

  • ein Befehlszeilentool ohne GUI-Schnittstelle sein
  • Ich kann eine Liste von Ordnern bereitstellen (wo sich meine möglicherweise nicht optimierten Bilder befinden), sie wird rekursiv alle Bilder in diesen Ordnern und Unterordnern optimieren
  • Die Bilder werden unter dem gleichen Namen wie zuvor gespeichert (es wird ein altes, nicht optimiertes Bild durch ein neues ersetzt).

Auch ist es nicht wirklich wichtig, es wäre schön, wenn das Tool könnte

  • Geben Sie einen Bericht (wie viel Platz pro Datei / insgesamt wurde eingespart)
  • Könnte Bilder auch skalieren
  • Sollte große Mengen an Dateien (> 1000) richtig verarbeiten
  • Metadaten entfernen

Antwort an Nick Wilde:

Ich weiß nicht, wem ich vertrauen soll: Ihnen oder den Leuten von Google, die pageSpeed ​​erstellt haben . Wenn ich dieses JPEG durch pageSpeed ​​laufen lasse, heißt es

Das verlustfreie Komprimieren von httpS://upload.wikimedia.org/.../Lake_mapourika_NZ.jpeg könnte 16,8 KB einsparen (4 % Reduzierung).

PS Der Grund für die Verwendung eines Tools besteht nicht darin, Speicherplatz auf meinem Computer zu sparen. Die Bilder befinden sich auf dem Server. Die Optimierung von Bildern hilft also, Bandbreite für Benutzer zu sparen, die Bilder anzeigen. Aus diesem Grund sollten Bilder sichtbar sein und eine Archivierung ist keine Option.

Antworten (3)

Nachdem ich stundenlang mit Bash herumgespielt habe, habe ich einen Weg gefunden, wie Google es macht. Es verwendet eines dieser 2 Programme:

Beide unterstützen verlustfreie und verlustbehaftete Konvertierung. Ich habe das zweite ausprobiert, in Ubuntu als jpegoptim jpegoptim installieren

.

Um zu tun, was ich will, muss ich Folgendes tun:

find MyDirectory/ -type d -exec sh -c '
    ls "$0"/*.jpg 2>/dev/null && jpegoptim --strip-all -t "$0"/*.jpg
' {} \;

Das tut wirklich nah an dem, was ich will. Das einzige Problem ist, dass ich eine Menge Ausgaben zu jeder Dateikomprimierung sehe und ich sie nicht mit -q loswerden kann, weil es auch die Zusammenfassung loswird. Aber das ist das Beste, was ich mit meinen gerade erlernten Bash-"Fähigkeiten" erreichen konnte. Ich habe eine Folgefrage auf Ask Ubuntu gestellt .

Es ist wirklich schnell. Es dauerte weniger als 5 Sekunden, um einige Tausend Dateien zu verarbeiten.

Haben Sie versucht, die Ausgabe umzuleiten? Fügen Sie einfach >/dev/nullam Ende Ihrer jpegoptimBefehlszeile hinzu, um STDOUT an "Datennirwana" umzuleiten. Mögliche Fehler (und alles andere, was an STDERR gesendet wird) werden weiterhin angezeigt.
Ich gehe davon aus, dass >/dev/null alle Ausgaben entfernen wird. Das ist nicht das, was ich will, weil ich dasselbe mit -q erreichen kann
Sie gehen nicht auf die "überflüssige Ausgabe" ein. Aber wenn die Dinge, die Sie loswerden möchten, leicht von den Dingen, die Sie behalten möchten, über Schlüsselwörter getrennt werden können, wäre eine Alternative | grep -v <not-this-keyword> | grep -v <this-neither> [...], die dann alle Zeilen mit den genannten Schlüsselwörtern unterdrücken würde.
Ich habe mir nicht angesehen, was jpegoptim ausgibt. Welche Art von Zusammenfassung möchten Sie behalten? Warum rufen Sie es für jedes Verzeichnis separat auf? Vielleicht möchten Sie nach diesem Teil unter Unix und Linux fragen .
@Gilles Ich habe dies bereits bei Ubuntu Stackexchange gefragt. Ich rufe jedes Verzeichnis separat an, denn wenn ich es im übergeordneten Verzeichnis anrufe, sagt es mir so etwas wie "Entschuldigung, keine Bilder gefunden".
Warum nicht einfach find MyDirectory/ -name '*jpg' -print0 | xargs -0 jpegoptim -s -t?
jpegoptimist toll und ich benutze es oft, macht es auch JPEG 2000 Dateien?
Mit v1.3.0 bekomme ich nur als Ausgabe out.jp2 [ERROR].
jpegtran von mozjpeg könnte noch effizienter sein, bitte erwägen Sie, es der Antwort hinzuzufügen

ImageMagik convert ermöglicht die Verwendung der Befehlszeile, Stapelverarbeitung und konvertiert Ihre JPEGs in JPEG2000, wodurch Sie etwas Platz sparen können und mehrere andere Optionen haben. Wenn Sie nicht zuerst ein Backup erstellt haben, würde ich empfehlen, vorhandene Dateien nicht zu überschreiben, bis Sie überprüft haben, dass die Konvertierung funktioniert hat, da mit jedem Tool etwas schief gehen kann.

Beachten Sie, dass zip oder targz einzelne jpegs normalerweise zu einer Vergrößerung führt, wenn Sie Platz sparen müssen, dann haben tar-Verzeichnisse und tar die Option --remove-files, Dateien zu entfernen, wenn sie dem Archiv hinzugefügt werden. Während die Dateien dadurch nicht kleiner werden, verschwenden Sie nur Speicherplatz nach einer Datei und nicht nach jeder Datei.

Zur Info:

$ konvertieren -Liste komprimieren

B44 B44A BZip DXT1 DXT3 DXT5 Fax Group4 JBIG1 JBIG2 JPEG JPEG2000 Lossless LosslessJPEG LZMA LZW Keine Piz Pxr24 RLE Zip RunlengthEncoded ZipS

Vielen Dank. Wenn Sie interessiert sind, habe ich herausgefunden, wie Google dies tut.
Ich denke, es ist zuverlässiger, convert -list formatstattdessen zu überprüfen. Ich habe JPEG2000 in den Komprimierungsoptionen, aber nicht in den Formaten, und das Ergebnis ist convert -compress jpeg2000 00001.tif 00001.pdf convert: delegate library support not built-in 00001.pdf' (JP2) @ error/pdf.c/WritePDFImage/1283.`
Beachten Sie, dass Sie mit eine Zielgröße definieren können jpeg:extent, zB convert -define jpeg:extent=400KB. imagemagick.org/discourse-server/viewtopic.php?t=15386
convertist niemals verlustfrei, wenn Sie in ein verlustbehaftetes Format ausgeben. daher ist dieser Teil Off-Topic.

JPEG IST ein verlustbehaftetes Format – sie können nicht verlustfrei per JPEG-Komprimierung komprimiert werden . Es gibt also kein Tool, das das kann.

Abgesehen davon gibt es wahrscheinlich Tools, die JPEG-Bilder optimieren können - dh Junk-Daten entfernen, obwohl dies nur minimale Größeneinsparungen wäre.

Oder eine andere Methode wäre, sie einzeln zu zip/7z/gzip (etc) zu komprimieren und die Originale zu löschen.

Wenn eine dieser Optionen gewünscht wird, bearbeiten oder erstellen Sie eine neue Frage.

Danke für deine Antwort. Bitte überprüfen Sie die Bearbeitung meiner Frage.
Leider erhöht das individuelle Zippen von JPEGs deren Größe, da es einen Overhead gibt und sie bereits komprimiert sind. Zipping/targz kann Speicherplatz sparen, wenn Sie einen Ordner voll komprimieren, da der verschwendete Speicherplatz auf der Festplatte nach dem Speichern jedes Bildes verschwendet wird.
Leute, das ist eine völlig falsche Antwort. Es schlägt nicht nur ein falsches Tool vor, sondern vermittelt auch falsche Informationen darüber, wie JPEG funktioniert. Verstehe nicht, warum jemand ihm +1 gegeben hat
Ein JPEG mit 100 % Qualität ist verlustfrei.
@ElliottFrisch Nein, JPEG mit 100% Qualität ist immer noch verlustbehaftet - SO: Ist JPEG verlustfrei, wenn die Qualität auf 100 eingestellt ist? . JPEG2000 hat verlustbehaftete und verlustfreie Modi, aber das ist etwas anderes.
Auch JPEG hat einen verlustfreien Modus, der jedoch kaum verwendet wird.
Sie können die Größe von JPEGs minimieren, indem Sie nicht benötigte Metadaten entfernen, sodass die Bildinformationen zwar möglicherweise nicht komprimiert werden, das Ergebnis jedoch eine kleinere Dateigröße ist.