Risposte:
La tua scommessa migliore sarebbe usare Imagemagick
Non sono un esperto nell'uso effettivo, ma so che puoi praticamente fare qualsiasi immagine relativa a questo!
Un esempio è:
convert image.png image.jpg
e manterrà l'originale oltre a creare l'immagine convertita. Per quanto riguarda il lotto. Penso che devi usare lo strumento Mogrify (dalla stessa riga di comando quando sei in imagemagick). Tieni presente che questo sovrascrive le vecchie immagini.
Il comando è:
mogrify -format jpg *.png
mogrify -format jpg -background black -flatten *.png
mogrify -format jpeg img.png
che ho 2 file e file img.*
riporta un png, l'originale intatto e uno nuovo jpeg. Quindi mogrify
non non sovrascrivere i file originali in questo caso.
mogrify
documentazione: " Questo strumento è simile all'eccezione del convert
fatto che il file di immagine originale viene sovrascritto (a meno che non si cambi il suffisso del file con l' opzione -format ) con qualsiasi modifica richiesta. "
Ho un altro paio di soluzioni.
La soluzione più semplice è come la maggior parte già pubblicata. Un semplice bash per loop.
for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done
Per qualche motivo, tendo ad evitare i loop in bash, quindi ecco un approccio xargs più univoco, usando bash per la modifica del nome.
ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.*}.jpg"'
Quello che uso. Utilizza GNU Parallel per eseguire più lavori contemporaneamente, aumentando le prestazioni. È installato di default su molti sistemi ed è quasi sicuramente nel tuo repository (è un buon programma da avere in giro).
ls -1 *.png | parallel convert '{}' '{.}.jpg'
Il numero di lavori predefinito è il numero di processi che hai. Ho trovato un migliore utilizzo della CPU usando 3 lavori sul mio sistema dual-core.
ls -1 *.png | parallel -j 3 convert '{}' '{.}.jpg'
E se vuoi delle statistiche (un ETA, lavori completati, tempo medio per lavoro ...)
ls -1 *.png | parallel --eta convert '{}' '{.}.jpg'
Esiste anche una sintassi alternativa se si utilizza GNU Parallel.
parallel convert '{}' '{.}.jpg' ::: *.png
E una sintassi simile per alcune altre versioni (incluso debian).
parallel convert '{}' '{.}.jpg' -- *.png
done
alla fine di quello per il ciclo. Inoltre, per le cose parallele, potresti evitare di usarlo ls
e pipe con un costrutto come: parallel -j 3 --eta convert '{}' '{.}.jpg' ::: *.png
(vedi qui )
ls
metodo per me stesso perché ha più senso per me.
--
piuttosto che :::
) - e anche in questo caso, manca frustrantemente alcune delle caratteristiche del parallelo GNU.
Il convert
comando trovato su molte distribuzioni Linux è installato come parte della suite ImageMagick. Ecco il codice bash da eseguire convert
su tutti i file PNG in una directory ed evitare quel doppio problema di estensione:
for img in *.png; do
filename=${img%.*}
convert "$filename.png" "$filename.jpg"
done
for f in *.png; do convert "$f" "${f/%png/jpg}"; done
Per coloro che vogliono solo i comandi più semplici:
Converti e conserva i file originali:
mogrify -format jpg *.png
Converti e rimuovi file originali:
mogrify -format jpg *.png && rm *.png
Un po 'tardi alla festa, ma solo per chiarire tutta la confusione per qualcuno che potrebbe non essere molto a suo agio con cli, ecco un riferimento e una spiegazione super stupidi.
Directory di esempio
bar.png
foo.png
foobar.jpg
Mantiene tutti i file png originali e crea file jpg.
mogrify -format jpg *.png
Risultato
bar.png
bar.jpg
foo.png
foo.jpg
foobar.jpg
Spiegazione
-format
dell'opzione. (Dal sito : 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
opzione specifica che modificherai il formato e il prossimo argomento deve essere il tipo (in questo caso, jpg).*.png
sono i file di input (tutti i file che terminano con .png).Converte tutti i file png in jpg, rimuove l'originale.
mogrify -format jpg *.png && rm *.png
Risultato
bar.jpg
foo.jpg
foobar.jpg
Spiegazione
&&
è un operatore booleano. In breve:
0
significa nessun errore.&&
esegue la valutazione del corto circuito , la parte giusta verrà eseguita solo se non ci sono errori . Questo è utile perché potresti non voler eliminare tutti i file originali se si è verificato un errore durante la loro conversione.rm
comando elimina i file.Ora ecco alcune chicche per le persone che si sentono a proprio agio con il cli.
Se vuoi un output mentre sta convertendo i file:
for i in *.png; do mogrify -format jpg "$i" && rm "$i"; echo "$i converted to ${i%.*}.jpg"; done
Converti tutti i file png in tutte le sottodirectory e dai un output per ognuno:
find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; echo "Converted $i to ${i%.*}.jpg"; done
Converti tutti i file png in tutte le sottodirectory, inserisci tutti i jpg risultanti nella all
directory, numerali , rimuovi i file png originali e visualizza l'output per ogni file mentre si svolge:
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
parte (sostituirla o rimuoverla tutta insieme) ...
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
*.jpg
file risultanti accanto ai *.png
file originali , mostra come ridurre le dimensioni / la qualità del file e non si interrompe a causa di caratteri dispari nella directory o nel nome del file.
la mia soluzione rapida
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
. Che evita il completamente inutili ls
, grep
e sed
le chiamate (e echo
, ma IIRC questo è un builtin Bash e così non avrà / molto poco impatto sulle prestazioni), e si libera di due tubi e due sotto-shell, e coinvolge meno di battitura. È anche leggermente più portatile, poiché non tutte le versioni di ls
sono sicure da analizzare.
Molti anni troppo tardi, c'è un'utilità png2jpeg appositamente per questo scopo, che ho creato.
Adattamento del codice di @Marcin:
#!/bin/sh
for img in *.png
do
filename=${img%.*}
png2jpeg -q 95 -o "$filename.jpg" "$filename.png"
done
Per l'elaborazione batch:
for img in *.png; do
convert "$img" "$img.jpg"
done
Finirai con nomi di file come image1.png.jpg però.
Funzionerà in bash, e forse bourne. Non conosco altre shell, ma l'unica differenza sarebbe probabilmente la sintassi del loop.
Questo è ciò che uso per convertire quando i file si estendono su più di una directory. Il mio originale era da TGA a PNG
find . -name "*.tga" -type f | sed 's/\.tga$//' | xargs -I% convert %.tga %.png
Il concetto è che sei find
il file che ti serve, togli l'estensione e poi aggiungilo di nuovo con xargs
. Quindi per PNG in JPG, dovresti cambiare le estensioni e fare una cosa in più per gestire i canali alfa, vale a dire impostare lo sfondo (in questo esempio bianco, ma puoi cambiarlo) quindi appiattire l'immagine
find . -name "*.png" -type f | sed 's/\.png$//' | xargs -I% convert %.png -background white -flatten %.jpg