it-swarm.dev

Conversione in batch di PNG in JPG in Linux

Qualcuno sa un buon modo per convertire in batch un gruppo di PNG in JPG in Linux? (Sto usando Ubuntu).

Un binario png2jpg che potrei semplicemente inserire in uno script di shell sarebbe l'ideale.

151
nedned

La tua migliore scommessa sarebbe usare Imagemagick

Non sono un esperto nell'uso effettivo, ma so che si può fare praticamente qualsiasi cosa relativa all'immagine!

Un esempio è:

convert image.png image.jpg

e manterrà l'originale così come la creazione dell'immagine convertita. Per quanto riguarda il lotto. Penso che sia necessario utilizzare lo strumento Mogrify (dalla stessa riga di comando quando in imagemagick). Tieni presente che questo sovrascrive le vecchie immagini.

Il comando è:

mogrify -format jpg *.png  
226
William Hilsum

Ho ancora un paio di soluzioni.

La soluzione più semplice è come la maggior parte già pubblicata. Una semplice battuta per loop.

for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done

Per qualche ragione tendo ad evitare i loop in bash quindi ecco un approccio più univoco xargs, usando bash per il nome mangling.

ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.*}.jpg"'

Quello che uso. Utilizza GNU Parallel per eseguire più lavori contemporaneamente, offrendo un incremento delle 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 sul numero di processi che hai. Ho trovato un migliore utilizzo della CPU utilizzando 3 lavori sul mio sistema dual-core.

ls -1 *.png | parallel -j 3 convert '{}' '{.}.jpg'

E se vuoi alcune 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 Parallelo.

parallel convert '{}' '{.}.jpg' ::: *.png

E una sintassi simile per alcune altre versioni (incluso debian).

parallel convert '{}' '{.}.jpg' -- *.png
76
Kevin Cox

Il comando convert trovato su molte distribuzioni Linux è installato come parte della suite ImageMagick. Ecco il codice bash per eseguire convert su tutti i file PNG in una directory ed evitare il problema di doppia estensione:

for img in *.png; do
    filename=${img%.*}
    convert "$filename.png" "$filename.jpg"
done
25
Marcin

tl; dr

Per coloro che vogliono solo i comandi più semplici:

Converti e mantieni file originali:

mogrify -format jpg *.png

Converti e rimuovi file originali:

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

Spiegazione di batch illustrata

Un po 'tardi per la 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 smorzati.

Directory di esempio

bar.png
foo.png
foobar.jpg

Conversione semplice

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

  • mogrify fa parte di ImageMagick suite di strumenti per l'elaborazione delle immagini.
    • mogrify elabora le immagini sul posto, cioè il file originale viene sovrascritto, ad eccezione dell'opzione -format. (Da il 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))
  • L'opzione - format specifica che cambierai il formato, e l'argomento successivo deve essere il tipo (in questo caso, jpg).
  • Infine, *.png è il file di input (tutti i file che terminano in .png).

Converti e Rimuovi

Converte tutti i file png in jpg, rimuove l'originale.

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

Risultato

bar.jpg
foo.jpg
foobar.jpg

Spiegazione

  • La prima parte è la stessa di sopra, creerà nuovi file jpg.
  • Il && è un operatore booleano. In breve:
    • Quando un programma termina, restituisce uno stato di uscita. Uno stato di 0 significa nessun errore.
    • Poiché && esegue valutazione di cortocircuito , la parte destra verrà eseguita solo se non ci sono stati errori. Ciò è utile perché potresti non voler eliminare tutti i file originali se si verificava un errore durante la conversione.
  • Il comando rm elimina i file.

Roba di fantasia

Ora ecco alcune chicche per le persone che are sono a loro agio con il cli.

Se desideri 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 ognuna di esse:

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, metti tutti i jpg risultanti nella directory all, numerali, rimuovi i file png originali e visualizza l'output per ogni file mentre viene eseguito:

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
Steven Jeffries

Il comando "png2jpg" che stai cercando è in realtà diviso in due comandi chiamati pngtopnm e cjpeg, e fanno parte rispettivamente dei pacchetti netpbm e libjpeg-progs.

png2pnm foo.png | cjpeg > foo.jpeg
7
Teddy
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
4
emdog4

la mia soluzione rapida for i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); done

3
max

Molti anni troppo tardi, c'è un png2jpeg utility appositamente per questo scopo, che ho creato.

Adattamento del codice da @Marcin:

#!/bin/sh

for img in *.png
do
    filename=${img%.*}
    png2jpeg -q 95 -o "$filename.jpg" "$filename.png"
done
2
user7023624

Per l'elaborazione in batch:

for img in *.png; do
  convert "$img" "$img.jpg"
done

Finirai con nomi di file come image1.png.jpg però.

Questo funzionerà in bash, e forse bourne. Non conosco altre shell, ma l'unica differenza potrebbe essere la sintassi del ciclo.

2

Questo è quello che uso per convertire quando i file occupano più di una directory. Il mio originale era TGA in PNG

find . -name "*.tga" -type f | sed 's/\.tga$//' | xargs -I% convert %.tga %.png

Il concetto è find i file necessari, rimuovere l'estensione e aggiungerla nuovamente con xargs. Quindi per PNG in JPG, cambieresti le estensioni e farai una cosa in più per gestire i canali alfa e cioè impostare lo sfondo (in questo esempio il bianco, ma puoi cambiarlo) quindi appiattisci l'immagine

find . -name "*.png" -type f | sed 's/\.png$//' | xargs -I% convert %.png -background white -flatten  %.jpg
0