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.

Author: Hennes, 2009-11-16

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
 277
Author: William Hilsum,
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
 94
Author: Kevin Cox,
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
 26
Author: Marcin,
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))
  • 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.
  • 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
 13
Author: Steven Jeffries,
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
 8
Author: Teddy,
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
 7
Author: emdog4,
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

 5
Author: max,
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
 4
Author: user7023624,
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.

 3
Author: Jeffrey Aylesworth,
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
 1
Author: Archimedes Trajano,
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
 0
Author: Guillaume Chevalier,
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