Stapelkonvertierung von PNG in JPG unter Linux
Kennt jemand eine gute Methode zur Stapelkonvertierung von PNGs in JPGs unter Linux? (Ich benutze Ubuntu)
Ein png2jpg-Binary, das ich einfach in ein Shell-Skript einfügen könnte, wäre ideal.
Kennt jemand eine gute Methode zur Stapelkonvertierung von PNGs in JPGs unter Linux? (Ich benutze Ubuntu)
Ein png2jpg-Binary, das ich einfach in ein Shell-Skript einfügen könnte, wäre ideal.
Am besten wäre es, wenn Sie Imagemagick
Ich bin kein Experte in der tatsächlichen Verwendung, aber ich weiß, dass Sie so ziemlich alles machen können, was mit diesem Bild zu tun hat!
Ein Beispiel ist:
convert image.png image.jpg
und es wird sowohl das Original behalten als auch das konvertierte Bild erstellen. Was den Stapel betrifft. Ich denke, Sie müssen das Mogrify-Werkzeug benutzen (von der gleichen Befehlszeile aus, wenn Sie in imagemagick sind). Denken Sie daran, dass dadurch die alten Bilder überschrieben werden.
Der Befehl lautet:
mogrify -format jpg *.png
Ich habe noch ein paar weitere Lösungen.
Die einfachste Lösung ist wie die meisten bereits gepostet. Eine einfache bash für Schleife.
for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done
Aus irgendeinem Grund neige ich dazu, Schleifen in der bash zu vermeiden, daher ist hier ein eher unixy xargs-Ansatz, bei dem die bash für die Namensverfälschung verwendet wird. Es verwendet GNU Parallel, um mehrere Jobs gleichzeitig auszuführen, was Ihnen einen Leistungsschub gibt. Es ist standardmäßig auf vielen Systemen installiert und befindet sich fast definitiv in Ihrem Repo (es ist ein gutes Programm, das man in der Nähe haben sollte).
ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.*}.jpg"'
Die Anzahl der Jobs entspricht standardmäßig der Anzahl der Prozesse, die Sie haben. Ich habe eine bessere CPU-Auslastung gefunden, indem ich 3 Jobs auf meinem Dual-Core-System verwendet habe.
ls -1 *.png | parallel convert '{}' '{.}.jpg'
Und wenn Sie einige Statistiken wünschen (eine ETA, abgeschlossene Jobs, durchschnittliche Zeit pro Job…)
ls -1 *.png | parallel -j 3 convert '{}' '{.}.jpg'
Es gibt auch eine alternative Syntax, wenn Sie GNU Parallel verwenden.
ls -1 *.png | parallel --eta convert '{}' '{.}.jpg'
Und eine ähnliche Syntax für einige andere Versionen (einschließlich debian).
parallel convert '{}' '{.}.jpg' ::: *.png
Der Befehl convert
, der auf vielen Linux-Distributionen zu finden ist, wird als Teil der ImageMagick-Suite installiert. Hier ist der Bash-Code, um convert
auf allen PNG-Dateien in einem Verzeichnis auszuführen und das Problem der doppelten Erweiterung zu vermeiden:
for img in *.png; do
filename=${img%.*}
convert "$filename.png" "$filename.jpg"
done
Für diejenigen, die nur die einfachsten Befehle wollen:
Konvertieren und Erhalten der Originaldateien:
mogrify -format jpg *.png
Konvertieren und Entfernen der Originaldateien:
mogrify -format jpg *.png && rm *.png
Etwas spät für die Party, aber nur, um die ganze Verwirrung für jemanden zu klären, der sich mit cli nicht sehr wohlfühlt, hier ist eine super verblüffende Referenz und Erklärung.
Beispielverzeichnis
bar.png
foo.png
foobar.jpg
Behält alle originalen png-Dateien bei und erzeugt auch jpg-Dateien.
mogrify -format jpg *.png
Ergebnis
bar.png
bar.jpg
foo.png
foo.jpg
foobar.jpg
Erläuterung
-format
. (Von the site : This tool is similar to convert except that the original image file is overwritten (unless you change the file suffix with the -format option)
) - format
gibt an, dass Sie das Format ändern werden, und das nächste Argument muss der Typ sein (in diesem Fall jpg). *.png
die Eingabedatei (alle Dateien mit der Endung .png). Konvertiert alle png-Dateien nach jpg, entfernt das Original.
mogrify -format jpg *.png && rm *.png
Ergebnis
bar.jpg
foo.jpg
foobar.jpg
Erläuterung
&&
ist ein boolscher Operator. Kurz gesagt: 0
bedeutet, dass keine Fehler aufgetreten sind. &&
Kurzschluss-Auswertung durchführt, wird der richtige Teil nur dann ausgeführt, wenn es keine Fehler gab. Das ist nützlich, weil Sie vielleicht nicht alle Originaldateien löschen möchten, wenn bei der Konvertierung ein Fehler aufgetreten ist. rm
löscht Dateien. Hier sind nun einige Leckereien für die Leute, die sich mit dem Cli bequem fühlen.
Wenn Sie während der Konvertierung von Dateien eine Ausgabe wünschen:
for i in *.png; do mogrify -format jpg "$i" && rm "$i"; echo "$i converted to ${i%.*}.jpg"; done
Konvertieren Sie alle png-Dateien in allen Unterverzeichnissen und geben Sie für jede einzelne Ausgabe:
find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; echo "Converted $i to ${i%.*}.jpg"; done
Konvertieren Sie alle png-Dateien in allen Unterverzeichnissen, legen Sie alle resultierenden jpgs in das Verzeichnis all
, nummerieren Sie sie, entfernen Sie die ursprünglichen png-Dateien und geben Sie die Ausgabe für jede Datei an, während sie stattfindet:
n=0; find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; fn="all/$((n++)).jpg"; mv "${i%.*}.jpg" "$fn"; echo "Moved $i to $fn"; done
Viele Jahre zu spät, es gibt ein png2jpeg Dienstprogramm speziell für diesen Zweck, das ich verfasst habe.
Anpassung des Codes durch @Marcin:
#!/bin/sh
for img in *.png
do
filename=${img%.*}
png2jpeg -q 95 -o "$filename.jpg" "$filename.png"
done
Für die Stapelverarbeitung:
for img in *.png; do
convert "$img" "$img.jpg"
done
Am Ende erhalten Sie jedoch Dateinamen wie image1.png.jpg.
Dies funktioniert in bash und vielleicht auch bourne. Ich weiß nichts über andere Shells, aber der einzige Unterschied wäre wahrscheinlich die Schleifensyntax.
Dies verwende ich zur Konvertierung, wenn sich die Dateien über mehr als ein Verzeichnis erstrecken. Mein ursprüngliches war TGA nach PNG
find . -name "*.tga" -type f | sed 's/\.tga$//' | xargs -I% convert %.tga %.png
Das Konzept ist, dass Sie die benötigten Dateien find
, die Erweiterung entfernen und sie dann mit xargs
wieder hinzufügen. Bei PNG zu JPG würden Sie also die Erweiterungen ändern und eine zusätzliche Sache tun, um mit Alphakanälen umzugehen, nämlich den Hintergrund einstellen (in diesem Beispiel weiß, aber Sie können ihn ändern) und dann das Bild verflachen
find . -name "*.png" -type f | sed 's/\.png$//' | xargs -I% convert %.png -background white -flatten %.jpg