Antworten:
Am besten verwenden Sie Imagemagick
Ich bin kein Experte in der tatsächlichen Verwendung, aber ich weiß, dass Sie so ziemlich alles tun können, was mit diesem Bild zusammenhängt!
Ein Beispiel ist:
convert image.png image.jpg
Das Original bleibt erhalten und das konvertierte Bild wird erstellt. Wie für charge. Ich denke, Sie müssen das Mogrify-Tool verwenden (von der gleichen Befehlszeile aus, wenn Sie in imagemagick sind). Beachten Sie, dass dadurch die alten Bilder überschrieben werden.
Der Befehl lautet:
mogrify -format jpg *.png
mogrify -format jpg -background black -flatten *.png
mogrify -format jpeg img.png
ich 2 Dateien und file img.*
einen PNG-Bericht, das Original unberührt und einen neuen JPEG-Bericht habe . So mogrify
wird nicht überschrieben Originaldateien in diesem Fall.
mogrify
Dokumentation: „ Dieses Tool ist ähnlich zu , convert
dass die Original - Bilddatei ist , außer überschrieben (es sei denn , Sie die Dateiendungen mit dem ändern -Format mit allen Änderungen fordern Sie Option). “
Ich habe noch ein paar Lösungen.
Die einfachste Lösung ist wie die meisten bereits gebucht. Ein einfacher Bash for Loop.
for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done
Aus irgendeinem Grund neige ich dazu, Schleifen in bash zu vermeiden, daher hier ein unixigerer xargs-Ansatz, bei dem bash für die Namensverknüpfung verwendet wird.
ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.*}.jpg"'
Den ich benutze. Es verwendet GNU Parallel, um mehrere Jobs gleichzeitig auszuführen und so die Leistung zu steigern. Es wird standardmäßig auf vielen Systemen installiert und ist fast definitiv in Ihrem Repo (es ist ein gutes Programm, um herum zu haben).
ls -1 *.png | parallel convert '{}' '{.}.jpg'
Die Anzahl der Jobs richtet sich standardmäßig nach der Anzahl der von Ihnen ausgeführten Prozesse. Ich habe mit 3 Jobs auf meinem Dual-Core-System eine bessere CPU-Auslastung gefunden.
ls -1 *.png | parallel -j 3 convert '{}' '{.}.jpg'
Und wenn Sie eine Statistik wünschen (eine ETA, abgeschlossene Jobs, durchschnittliche Zeit pro Job ...)
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
done
am Ende eine for-Schleife. Auch für die parallelen Sachen könnten Sie vermeiden, das zu verwenden ls
und mit einem Konstrukt wie Pipe parallel -j 3 --eta convert '{}' '{.}.jpg' ::: *.png
(siehe hier )
ls
Methode für mich, weil sie für mich sinnvoller ist.
--
statt :::
) - und selbst dann fehlen frustrierend einige der Funktionen von GNU parallel.
Der convert
Befehl, der auf vielen Linux-Distributionen zu finden ist, wird als Teil der ImageMagick-Suite installiert. Hier ist der Bash-Code, der convert
für alle PNG-Dateien in einem Verzeichnis ausgeführt wird und das Problem der doppelten Erweiterung vermeidet:
for img in *.png; do
filename=${img%.*}
convert "$filename.png" "$filename.jpg"
done
for f in *.png; do convert "$f" "${f/%png/jpg}"; done
Für diejenigen, die nur die einfachsten Befehle wollen:
Konvertieren und behalten Sie Originaldateien:
mogrify -format jpg *.png
Ursprüngliche Dateien konvertieren und entfernen :
mogrify -format jpg *.png && rm *.png
Ein bisschen zu spät zur Party, aber nur, um die Verwirrung für jemanden zu beseitigen, der sich mit Cli nicht besonders wohl fühlt, hier ist eine super verworrene Referenz und Erklärung.
Beispielverzeichnis
bar.png
foo.png
foobar.jpg
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
Erläuterung
-format
Option überschrieben wird . (Von der Website : 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
Option gibt an, dass Sie das Format ändern, und das nächste Argument muss der Typ sein (in diesem Fall jpg).*.png
die Eingabedateien (alle Dateien, die mit .png enden).Konvertiert alle PNG-Dateien in JPG, entfernt das Original.
mogrify -format jpg *.png && rm *.png
Ergebnis
bar.jpg
foo.jpg
foobar.jpg
Erläuterung
&&
ist ein Boolescher Operator. Zusamenfassend:
0
bedeutet keine Fehler.&&
die Kurzschlussbewertung durchgeführt wird , wird der richtige 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.rm
Befehl löscht Dateien.Hier sind einige Goodies für die Leute, die sich mit dem Cli wohl fühlen.
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 alle Unterverzeichnisse und geben Sie für jedes eine Ausgabe 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 all
Verzeichnis, nummerieren Sie sie, entfernen Sie die ursprünglichen PNG-Dateien und zeigen 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
while read
Teil loswerden (ersetzen Sie es oder entfernen Sie alles zusammen) ...
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
*.jpg
Dateien neben den Originaldateien belässt *.png
, zeigt, wie die Dateigröße / -qualität verringert werden kann und nicht aufgrund von ungeraden Zeichen im Verzeichnis oder Dateinamen unterbrochen wird.
meine schnelle lösung
for i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); done
for f in ./*.png; do convert "$f" "${f%.*}.jpg"; done
. Das vermeidet die völlig unnötig ls
, grep
und sed
Anrufe (und echo
, aber IIRC , dass ein heftiger Schlag ist gebautet und haben so keine / sehr wenig Auswirkungen auf die Leistung) und wird von zwei Leitungen und zwei Subshells los zu werden , und beinhaltet weniger tippen. Es ist sogar etwas portabler, da nicht alle Versionen von ls
sicher zu analysieren sind.
Viele Jahre zu spät gibt es ein speziell für diesen Zweck entwickeltes Hilfsprogramm png2jpeg , 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
Sie erhalten jedoch Dateinamen wie image1.png.jpg.
Dies funktioniert in bash und vielleicht bourne. Ich kenne keine anderen Shells, aber der einzige Unterschied wäre wahrscheinlich die Schleifensyntax.
Dies ist, was ich verwende, um zu konvertieren, wenn die Dateien mehr als ein Verzeichnis umfassen. 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 haben, die Sie benötigen. Entfernen Sie die Erweiterung und fügen Sie sie dann wieder hinzu xargs
. Für PNG zu JPG ändern Sie also die Erweiterungen und tun eine zusätzliche Sache, um mit Alphakanälen umzugehen, nämlich den Hintergrund einzustellen (in diesem Beispiel weiß, aber Sie können ihn ändern) und dann das Bild zu reduzieren
find . -name "*.png" -type f | sed 's/\.png$//' | xargs -I% convert %.png -background white -flatten %.jpg