Como compactar em lote imagens com o comando Imagemagick ou similar ou programa no Linux

3

Eu aprendi recentemente sobre o comando de conversão do imagemagick que eu usei para compactar muitas fotos que eu tenho para uso pessoal e para um blog que eu tenho. Na minha experiência, o Imagemagick é o melhor programa de compressor de imagens e dá a ele o máximo controle sobre como compactar imagens. Eu tenho muitas outras imagens que eu quero compactar, mas não quero ter que usar o comando converter tantas vezes, um por um para cada arquivo. O principal problema é que é muito demorado para mim fazê-lo. Eu gostaria de poder fazer uma grande maneira de compactar minhas imagens. Eu estou bem em fazer isso via linha de comando, mas uma GUI pode tornar isso um pouco mais intuitivo.

Aqui está uma amostra de um comando que eu uso para tornar a imagem original 20% do tamanho original. convert -resize 20% 20140322_102113.jpg 20140322_102113opt.jpg

Se eu disser que tenho 100 imagens e elas estão todas na mesma pasta, quero poder fazer algo parecido com o seguinte

Para todas as imagens convert -resize 20% imagename.jpg imagename_optimized.jpg

Eu não sei se existe um comando que já pode fazer isso, mas se não, pensei em criar um comando bash, mas eu não estou tão familiarizado com o bash. Ajude a criar este script bash simples, ou conselhos sobre como resolver o meu dilema é apreciado. Eu uso o Linux e gostaria apenas de uma solução especificamente para o Linux. Obrigado

    
por Justin 31.07.2014 / 23:53

4 respostas

5

A nomenclatura é um formato ligeiramente diferente, mas:

for img in *.jpg; do
  convert -resize 20% "$img" "opt-$img"
done
    
por 01.08.2014 / 00:12
3

Usar um loop 'for' definitivamente funcionará - e é uma boa técnica geral - mas você quase certamente tem mais de um processador em sua máquina, então por que fazer apenas uma conversão de cada vez?

Você pode fazer com que as coisas se movam muito mais rapidamente se você:

find *.jpg | xargs -n1 -P8 -I{} convert -resize 20% "{}" "opt-{}"

Os argumentos para xargs são:

n1  - Only give 'convert' one file at a time
P8  - Use 8 processes
I{} - Replace {} with the filename given by 'find'

E então o comando de conversão é dado depois.

    
por 02.12.2014 / 23:06
-1

Acho que um script simples pode ajudá-lo.

for i in 'ls /path/to/img/dir'; do convert -resize 20% "/path/to/img/dir/${i:0:-4}" "/path/to/new/img/dir/${i:0:-4}_optimized.jpg"; done

Nota : ${i:0:-4} é para remover a extensão .jpg . Se o seu arquivo tiver extensão de extensão diferente, talvez você queira alterar -4 para outra coisa:)

    
por 01.08.2014 / 00:13
-1

Tente com for i in $( ls *.jpg); do convert -resize 20% $i optimized_$i; done (você pode definir o caminho para a pasta diferente de apenas *.jpg )

Como uma GUI, você pode usar Converseen

    
por 01.08.2014 / 00:15