2009-11-16 02:06:38 +0000 2009-11-16 02:06:38 +0000
172
172

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.

Antworten (10)

247
247
247
2009-11-16 02:15:29 +0000

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
83
83
83
2013-01-28 02:45:11 +0000

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
26
26
26
2009-11-16 03:28:26 +0000

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
11
11
11
2015-10-17 15:02:05 +0000

tl;dr

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

Batch-Konvertierung erklärt

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

Einfache Konvertierung

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

  • mogrify ist Teil des ImageMagick -Werkzeugpakets für die Bildbearbeitung.
  • mogrify verarbeitet Bilder an Ort und Stelle, d.h. die Originaldatei wird überschrieben, mit Ausnahme der Option -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))
  • Die Option - format gibt an, dass Sie das Format ändern werden, und das nächste Argument muss der Typ sein (in diesem Fall jpg).
  • Schließlich ist *.png die Eingabedatei (alle Dateien mit der Endung .png).

Konvertieren und entfernen

Konvertiert alle png-Dateien nach jpg, entfernt das Original.

mogrify -format jpg *.png && rm *.png

Ergebnis

bar.jpg
foo.jpg
foobar.jpg

Erläuterung

  • Der erste Teil ist genau der gleiche wie oben, er wird neue jpg-Dateien erzeugen.
  • Der && ist ein boolscher Operator. Kurz gesagt:
  • Wenn ein Programm beendet wird, gibt es einen Exit-Status zurück. Ein Status von 0 bedeutet, dass keine Fehler aufgetreten sind.
  • Da && 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.
  • Der Befehl rm löscht Dateien.

Fancy Stuff

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
8
8
8
2009-11-16 05:29:10 +0000

Der eigentliche “png2jpg”-Befehl, nach dem Sie suchen, ist in Wirklichkeit in zwei Befehle mit den Bezeichnungen pngtopnm und cjpeg unterteilt, die Teil der Pakete netpbm bzw. libjpeg-progs sind.

png2pnm foo.png | cjpeg > foo.jpeg
6
6
6
2014-10-13 17:12:00 +0000
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
5
5
5
2012-05-07 12:42:40 +0000

meine schnelle Lösungfor i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); done

4
4
4
2016-10-22 09:37:31 +0000

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
3
3
3
2009-11-16 02:28:02 +0000

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.

1
1
1
2016-09-17 02:34:45 +0000

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