Batch-Konvertierung von PNG in JPG in Linux
Kennt jemand eine gute Möglichkeit, eine Reihe von PNGs in JPGs in Linux zu stapeln? (Ich benutze Ubuntu).
Eine png2jpg-Binärdatei, die ich einfach in ein Shell-Skript einfügen könnte, wäre ideal.
11 answers
Ihre beste Wette wäre, ImageMagick zu verwenden.
Ich bin kein Experte in der tatsächlichen Verwendung, aber ich weiß, dass Sie so ziemlich alles bildbezogen damit machen können!
Ein Beispiel ist:
convert image.png image.jpg
Wodurch das Original erhalten bleibt und das konvertierte Bild erstellt wird.
Was die Stapelkonvertierung betrifft, denke ich, dass Sie das Werkzeug Mogrify verwenden müssen, das Teil von ImageMagick ist.
Beachten Sie, dass diese die alten Bilder überschreibt.
Die Befehl ist:
mogrify -format jpg *.png
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-06-09 15:03:29
Ich habe noch ein paar Lösungen.
Die einfachste Lösung ist, wie die meisten bereits geschrieben. Eine einfache Bash für Schleife.
for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done
Aus irgendeinem Grund neige ich dazu, Schleifen in Bash zu vermeiden, also hier ist ein Unixy-xargs-Ansatz, der bash für das Namens-Mangling verwendet.
ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.*}.jpg"'
Die, die ich benutze. Es verwendet GNU Parallel, um mehrere Jobs gleichzeitig auszuführen, wodurch Sie eine Leistungssteigerung erzielen. Es ist standardmäßig auf vielen Systemen installiert und befindet sich fast definitiv in Ihrem Repo (es ist ein gutes Programm um).
ls -1 *.png | parallel convert '{}' '{.}.jpg'
Die Anzahl der Jobs entspricht standardmäßig der Anzahl der CPU-Kerne. Ich fand eine bessere CPU-Auslastung mit 3 Jobs auf meinem Dual-Core-System.
ls -1 *.png | parallel -j 3 convert '{}' '{.}.jpg'
Und wenn Sie Statistiken (ETA, abgeschlossene Jobs, durchschnittliche Zeit pro Job) wünschen...)
ls -1 *.png | parallel --eta convert '{}' '{.}.jpg'
Es gibt auch eine alternative Syntax, wenn Sie GNU Parallel verwenden.
parallel convert '{}' '{.}.jpg' ::: *.png
Und eine ähnliche Syntax für einige andere Versionen (einschließlich Debian).
parallel convert '{}' '{.}.jpg' -- *.png
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-08-07 11:37:35
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
für alle PNG-Dateien in einem Verzeichnis auszuführen und dieses doppelte Erweiterungsproblem zu vermeiden:
for img in *.png; do
filename=${img%.*}
convert "$filename.png" "$filename.jpg"
done
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2013-06-07 02:09:10
Tl;dr
Für diejenigen, die nur die einfachsten Befehle wollen:
Konvertieren und halten original files:
mogrify -format jpg *.png
Konvertieren und remove original files:
mogrify -format jpg *.png && rm *.png
Batch-Konvertierung Erklärt
Ein bisschen spät zur Party, aber nur um all die Verwirrung für jemanden zu beseitigen, der sich mit cli nicht sehr wohl fühlt, hier ist eine super Dumbed-Down-Referenz und Erklärung.
Beispiel Verzeichnis
bar.png
foo.png
foobar.jpg
Einfache Konvertierung
Behält alle ursprünglichen PNG-Dateien bei und erstellt JPG-Dateien.
mogrify -format jpg *.png
Ergebnis
bar.png
bar.jpg
foo.png
foo.jpg
foobar.jpg
Erklärung
-
mogrify ist Teil der ImageMagick Suite von Werkzeugen für die Bildverarbeitung.
- mogrify verarbeitet Bilder anstelle von, was bedeutet, dass die Originaldatei mit Ausnahme der Option
-format
überschrieben wird. (Von die Seite:This tool is similar to convert except that the original image file is overwritten (unless you change the file suffix with the -format option)
)
- mogrify verarbeitet Bilder anstelle von, was bedeutet, dass die Originaldatei mit Ausnahme der Option
- Der
- format
option gibt an, dass Sie das Format ändern, und das nächste Argument muss der Typ sein (in diesem Fall jpg). - Schließlich ist
*.png
die Eingabedateien (alle Dateien enden in .png).
Konvertieren und Entfernen
Konvertiert alle PNG-Dateien in JPG, entfernt Original.
mogrify -format jpg *.png && rm *.png
Ergebnis
bar.jpg
foo.jpg
foobar.jpg
Erklärung
- Der erste Teil ist genau der gleiche wie oben, es neue jpg-Dateien.
- Der
&&
ist ein boolescher Operator. Kurz:- Wenn ein Programm beendet wird, gibt es einen Exit-Status zurück. Ein Status von
0
bedeutet keine Fehler. - Da
&&
Kurzschlussauswertung durchführt, wird der rechte Teil nur ausgeführt, wenn keine Fehler aufgetreten sind. Dies ist nützlich, da Sie möglicherweise nicht alle Originaldateien löschen möchten, wenn beim Konvertieren ein Fehler aufgetreten ist.
- Wenn ein Programm beendet wird, gibt es einen Exit-Status zurück. Ein Status von
- Der Befehl
rm
löscht Dateien.
Fancy Stuff
Nun, hier sind einige Leckereien für die Leute, die mit der Cli vertraut sind.
Wenn Sie beim Konvertieren 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 die Ausgabe für jeden aus:
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 zeigen Sie die Ausgabe für jede Datei an wie es 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2015-10-17 15:02:05
Der eigentliche Befehl" png2jpg
", nach dem Sie suchen, ist in Wirklichkeit in zwei Befehle mit den Namen pngtopnm
und cjpeg
unterteilt, und sie sind Teil der Pakete netpbm
und libjpeg-progs
.
png2pnm foo.png | cjpeg > foo.jpeg
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2009-12-15 11:11:24
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2014-10-13 17:12:00
Meine schnelle Lösung
for i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); done
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2012-05-07 12:42:40
Viele Jahre zu spät, gibt es eine [[2]}png2jpeg Dienstprogramm speziell für diesen Zweck, die ich verfasst.
Anpassen des Codes durch @Marcin:
#!/bin/sh
for img in *.png
do
filename=${img%.*}
png2jpeg -q 95 -o "$filename.jpg" "$filename.png"
done
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-11-16 10:26:37
Für die Stapelverarbeitung:
for img in *.png; do
convert "$img" "$img.jpg"
done
Sie erhalten Dateinamen wie image1.png.jpg-obwohl.
Dies wird in bash funktionieren, und vielleicht Bourne. Ich weiß nichts über andere Shells, aber der einzige Unterschied wäre wahrscheinlich die Schleifensyntax.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2009-11-16 02:28:02
Dies verwende ich zum Konvertieren, wenn sich die Dateien über mehr als ein Verzeichnis erstrecken. Mein ursprüngliches war TGA zu PNG
find . -name "*.tga" -type f | sed 's/\.tga$//' | xargs -I% convert %.tga %.png
Das Konzept ist, dass Sie find
die Dateien, die Sie benötigen, entfernen Sie die Erweiterung und fügen Sie sie dann wieder mit xargs
hinzu. Für PNG in JPG würden Sie also die Erweiterungen ändern und eine zusätzliche Sache tun, um mit Alphakanälen umzugehen, nämlich den Hintergrund einzustellen (in diesem Beispiel weiß, aber Sie können es ändern) und dann das Bild abflachen
find . -name "*.png" -type f | sed 's/\.png$//' | xargs -I% convert %.png -background white -flatten %.jpg
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-09-17 02:34:45
Wenn Ihr PNG transparent ist, fügen Sie vor der Konvertierung eine schwarze BG hinzu:
mogrify -format jpg -background black -flatten *.png
Oder eine weiße bg:
mogrify -format jpg -background white -flatten *.png
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-04-19 04:34:49