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 pudesse colocar em um shell script seria o ideal.
linux
shell-script
jpeg
png
nedned
fonte
fonte
mogrify -format jpg -background black -flatten *.png
mogrify -format jpeg img.png
eu ter 2 arquivos efile img.*
relatar um png, o original intocado e um novo jpeg. Portantomogrify
, não substitui os arquivos originais nesse caso.mogrify
documentação: " Esta ferramenta é semelhante a,convert
exceto que o arquivo de imagem original é substituído (a menos que você altere o sufixo do arquivo com a opção -format ) com as alterações solicitadas. "Eu tenho mais algumas soluções.
A solução mais simples é como a maioria já publicada. Uma festança simples para loop.
Por alguma razão, eu tendem a evitar loops no bash, então aqui está uma abordagem xargs mais unix, usando o bash para a identificação de nomes.
O que eu uso. Ele usa o GNU Parallel para executar vários trabalhos ao mesmo tempo, oferecendo um aumento de desempenho. Ele é instalado por padrão em muitos sistemas e está quase definitivamente no seu repositório (é um bom programa para se ter por perto).
O número de trabalhos é padronizado com o número de processos que você possui. Encontrei melhor uso da CPU usando 3 tarefas no meu sistema dual-core.
E se você quiser algumas estatísticas (um ETA, trabalhos concluídos, tempo médio por trabalho ...)
Há também uma sintaxe alternativa se você estiver usando o GNU Parallel.
E uma sintaxe semelhante para algumas outras versões (incluindo debian).
fonte
done
no final do loop for. Além disso, para o material paralela, você poderia evitar o uso quels
e tubo com uma construção como:parallel -j 3 --eta convert '{}' '{.}.jpg' ::: *.png
(ver aqui )ls
método por mim mesmo, porque faz mais sentido para mim.--
ao invés de:::
) - e mesmo assim, carece frustrantemente de alguns dos recursos do paralelo GNU.O
convert
comando encontrado em muitas distribuições Linux é instalado como parte do pacote ImageMagick. Aqui está o código bash para executarconvert
em todos os arquivos PNG em um diretório e evitar esse problema de extensão dupla:fonte
for f in *.png; do convert "$f" "${f/%png/jpg}"; done
tl; dr
Para quem quer apenas os comandos mais simples:
Converta e mantenha arquivos originais:
Converta e remova arquivos originais:
Conversão de lote explicada
Meio atrasado para a festa, mas apenas para esclarecer toda a confusão de alguém que pode não estar muito confortável com o CLI, aqui está uma referência e explicação super estúpidas.
Diretório de exemplo
Conversão Simples
Mantém todos os arquivos png originais, bem como cria arquivos jpg.
Resultado
Explicação
-format
opção. (A partir do 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)
)- format
opção especifica que você alterará o formato e o próximo argumento precisa ser do tipo (neste caso, jpg).*.png
estão os arquivos de entrada (todos os arquivos que terminam em .png).Converter e remover
Converte todos os arquivos png em jpg, remove o original.
Resultado
Explicação
&&
é um operador booleano. Em resumo:0
significa sem erros.&&
realiza a avaliação de curto-circuito , a parte correta somente será executada se não houver erros . Isso é útil porque você pode não querer excluir todos os arquivos originais se houver um erro ao convertê-los.rm
comando exclui arquivos.Coisa chique
Agora, aqui estão alguns presentes para as pessoas que se sentem confortáveis com o CLI.
Se você quiser alguma saída enquanto estiver convertendo arquivos:
Converta todos os arquivos png em todos os subdiretórios e dê saída para cada um:
Converta todos os arquivos png em todos os subdiretórios, coloque todos os jpgs resultantes no
all
diretório, numere- os, remova os arquivos png originais e exiba a saída de cada arquivo conforme ele ocorre:fonte
while read
parte (substituí-lo ou removê-lo todos juntos) ...O
png2jpg
comando " " real que você está procurando é, na realidade, dividido em dois comandos chamadospngtopnm
ecjpeg
, e eles fazem parte dos pacotesnetpbm
elibjpeg-progs
, respectivamente.fonte
fonte
*.jpg
arquivos resultantes próximos aos*.png
arquivos originais , mostra como reduzir o tamanho / qualidade e não quebra por causa de caracteres estranhos no diretório ou no nome do arquivo.minha solução rápida
for i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); done
fonte
for f in ./*.png; do convert "$f" "${f%.*}.jpg"; done
. Isso evita o completamente desnecessáriols
,grep
esed
chama (eecho
, mas o IIRC que é um bash embutido e, portanto, terá pouco / muito pouco impacto no desempenho) e se livra de dois pipes e dois subshells, e envolve menos digitação. É ainda um pouco mais portátil, pois nem todas as versõesls
são seguras para analisar.Muitos anos tarde demais, existe um utilitário png2jpeg especificamente para esse fim, que eu criei.
Adaptando o código por @Marcin:
fonte
Para processamento em lote:
Você terminará com nomes de arquivo como image1.png.jpg.
Isso funcionará no bash e talvez no bourne. Não conheço outras conchas, mas a única diferença provavelmente seria a sintaxe do loop.
fonte
É isso que eu uso para converter quando os arquivos abrangem mais de um diretório. Meu original era TGA para PNG
O conceito é que
find
você precisa dos arquivos, retire a extensão e adicione-a novamentexargs
. Portanto, para PNG e JPG, você alteraria as extensões e faria uma coisa extra para lidar com canais alfa: definir o plano de fundo (neste exemplo, branco, mas você pode alterá-lo) e achatar a imagem.fonte