Lote convertendo PNG para JPG no linux

142

Alguém sabe uma boa maneira de converter em lote um monte de PNGs em JPGs no linux? (Estou usando o Ubuntu).

Um binário png2jpg que eu poderia colocar em um script de shell seria ideal.

    
por nedned 16.11.2009 / 03:06

10 respostas

214

Sua melhor aposta seria usar Imagemagick

Eu não sou um especialista no uso real, mas sei que você pode fazer qualquer coisa relacionada a isso!

Um exemplo é:

convert image.png image.jpg
B v v Bvvv vvvvves es ves vvvvvv esvv vvv esvv vv esvv es es es es es es es v BesvBeses eseses Quanto ao lote. Eu acho que você precisa usar a ferramenta Mogrify (da mesma linha de comando quando no imagemagick). Tenha em mente que isso substitui as imagens antigas.

B B B v es es B B B B B B B B B B B B B B B B B B BB B B B B B es
mogrify -format jpg *.png  
    
por 16.11.2009 / 03:15
70

Eu tenho mais algumas soluções.

A solução mais simples é como a maioria já postada. Um simples golpe para loop.

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

Por alguma razão eu costumo evitar loops no bash, então aqui está uma abordagem xargs mais unixy, usando o bash para o nome-mangling.

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

O que eu uso. Ele usa o GNU Parallel para executar várias tarefas de uma só vez, oferecendo um aumento de desempenho. Ele é instalado por padrão em muitos sistemas e está quase definitivamente em seu repositório (é um bom programa para ter por perto).

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

O número de trabalhos é padronizado para o número de processos que você possui. Eu encontrei melhor uso da CPU usando 3 trabalhos no meu sistema dual-core.

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

E se você quiser algumas estatísticas (um ETA, tarefas concluídas, tempo médio por trabalho ...)

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

Existe também uma sintaxe alternativa se você estiver usando o GNU Parallel.

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

E uma sintaxe semelhante para algumas outras versões (incluindo debian).

parallel convert '{}' '{.}.jpg' -- *.png
    
por 28.01.2013 / 03:45
25

O comando convert encontrado em muitas distribuições Linux é instalado como parte do pacote ImageMagick. Aqui está o código bash para executar convert em todos os arquivos PNG em um diretório e evitar esse problema de extensão dupla:

for img in *.png; do
    filename=${img%.*}
    convert "$filename.png" "$filename.jpg"
done
    
por 16.11.2009 / 04:28
7

O comando " png2jpg " real que você está procurando é, na verdade, dividido em dois comandos chamados pngtopnm e cjpeg , e eles são parte dos pacotes netpbm e libjpeg-progs , respectivamente.

png2pnm foo.png | cjpeg > foo.jpeg
    
por 16.11.2009 / 06:29
7

tl; dr

Para quem quer apenas os comandos mais simples:

Converter e manter arquivos originais:

mogrify -format jpg *.png

Converter e remover arquivos originais:

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

Conversão em lote explicada

Meio atrasado para a festa, mas só para esclarecer toda a confusão para alguém que pode não estar muito confortável com cli, aqui está uma referência e explicação super idiotas.

Diretório de exemplo

bar.png
foo.png
foobar.jpg

Conversão Simples

Mantém todos os arquivos PNG originais, além de criar arquivos jpg.

mogrify -format jpg *.png

Resultado

bar.png
bar.jpg
foo.png
foo.jpg
foobar.jpg

Explicação

  • mogrify é parte do ImageMagick conjunto de ferramentas para processamento de imagens.
      O
    • mogrify processa imagens no lugar , o que significa que o arquivo original é sobrescrito, com exceção da opção -format . (De o 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) )
  • A opção - format especifica que você alterará o formato e o próximo argumento precisa ser o tipo (neste caso, jpg).
  • Por fim, *.png são os arquivos de entrada (todos os arquivos terminados em .png).

Converter e remover

Converte todos os arquivos png para jpg, remove original.

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

Resultado

bar.jpg
foo.jpg
foobar.jpg

Explicação

  • A primeira parte é exatamente igual à anterior, ela criará novos arquivos jpg.
  • O && é um operador booleano. Em resumo:
    • Quando um programa termina, ele retorna um status de saída. Um status de 0 significa que não há erros.
    • Como && realiza avaliação de curto-circuito , a parte direita só será executada se houver Não houve erros . Isso é útil porque você pode não querer excluir todos os arquivos originais se houver um erro ao convertê-los.
  • O comando rm exclui arquivos.

Coisas de fantasia

Agora, aqui estão algumas surpresas para as pessoas que são confortáveis com o cli.

Se você quiser alguma saída enquanto estiver convertendo arquivos:

for i in *.png; do mogrify -format jpg "$i" && rm "$i"; echo "$i converted to ${i%.*}.jpg"; done

Converta todos os arquivos png em todos os subdiretórios e forneça a saída para cada um deles:

find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; echo "Converted $i to ${i%.*}.jpg"; done

Converta todos os arquivos png em todos os subdiretórios, coloque todos os jpgs resultantes no diretório all , numere-os, remova os arquivos png originais e exiba a saída para cada arquivo conforme ele ocorre:

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
    
por 17.10.2015 / 17:02
4
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
    
por 13.10.2014 / 19:12
3

minha solução rápida for i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); done

    
por 07.05.2012 / 14:42
2

Para processamento em lote:

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

Você vai acabar com nomes de arquivo como image1.png.jpg embora.

Isso funcionará no bash e talvez no bourne. Eu não sei sobre outros shells, mas a única diferença seria a sintaxe do loop.

    
por 16.11.2009 / 03:28
2

Muitos anos atrasado, há um utilitário png2jpeg especificamente para essa finalidade, que eu criei.

Adaptando o código por @Marcin:

#!/bin/sh

for img in *.png
do
    filename=${img%.*}
    png2jpeg -q 95 -o "$filename.jpg" "$filename.png"
done
    
por 22.10.2016 / 11:37
0

Isto é o que eu uso para converter quando os arquivos se estendem por mais de um diretório. Meu original foi TGA para PNG

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

O conceito é você find dos arquivos que você precisa, retire a extensão e adicione-a novamente com xargs . Assim, para PNG para JPG, você mudaria as extensões e faria uma coisa extra para lidar com canais alfa, ou seja, definir o plano de fundo (neste exemplo, branco, mas você pode alterá-lo) e, em seguida, nivelar a imagem

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