você está aqui: Home  → Arquivo de Mensagens

Reduzindo imagens em Lote

Colaboração: Fernando Jorge Ebrahim Lima e Silva

Data de Publicação: 06 de dezembro de 2012

Um tempo atrás no meu serviço, choviam mensagens com imagens enormes, oriundas da comunicação social, e percebi que havia uma enorme dificuldade em trabalhar com as fotos que cada vez mais estão com enorme resolução e tamanho. Visitando o Dicas-L, encontrei uma solução e aperfeiçoei.

1º Passo - criar o script e colocar na cron

No servidor de arquivos (linux), criei um script utilizando a função convert e o coloquei na cron com intervalo de 05 minutos para execução, ou seja, basta o usuário colocar os arquivos na pasta especificada e pronto, alguns minutos depois, as fotos aparecem reduzidas, prontas para publicação na Web, anexa, o que se queira.

Script reduz_resolucao.sh

  #!/bin/bash
  
  
  if [ -d /diretorio/fotos/original ]
   then
    cd /diretorio/fotos/original/
     for arq in `/bin/ls`
       do
         ls $arq
         convert -density 36x36 -geometry 400x400  $arq  /diretorio/fotos/reduzida/red_$arq
         #muda as permissões
         chgrp grupo_Especifico /diretorio/fotos/reduzida/red_$arq
         chmod 662 /diretorio/fotos/reduzida/red_$arq
         #apaga os arquivos originais
         rm $arq -f
       done
     fi

Obs: Esse script busca os arquivos em um diretório, reduz sua resolução para outro diretório, e remove os arquivos originais.

2º Passo - Os ajustes de tamanho e resolução, localização ficam por conta do freguês.

Referência: Fotos digitais - preparação para colocar na internet

Fernando Ebrahim é Programador de Sistemas do TRE-Tocantins e Professor do IFTO


 

 

Veja a relação completa dos artigos de Fernando Jorge Ebrahim Lima e Silva

Opinião dos Leitores

henry
09 Dez 2012, 20:18
um problema comum em scripts são nomes esdruxulos colocados pelos seres chamados de "usuários".
Por ex, o tipo de nome de arquivo que emperra mto script por ai:

fotos da praia(12).jpg

Neste caso, NEM colocando "$arq" entre aspas duplas este script das dicas-L funcionaria.

uma maneira bacana é usando while e read (deve haver algo mais fácil, mas desconheço no momento o "mais_facil")
assim, fica a reescrita do script que funciona para qualquer caso, com ou sem espaço, com ou sem caracteres esdrúxulos:




if [ -d /diretorio/fotos/original ]
then
cd /diretorio/fotos/original/
ls | while read arq
do
ls "$arq"
convert -density 36x36 -geometry 400x400 "$arq" "/diretorio/fotos/reduzida/red_$arq"
#muda as permissões
chgrp grupo_Especifico "/diretorio/fotos/reduzida/red_$arq"
chmod 662 "/diretorio/fotos/reduzida/red_$arq"
#apaga os arquivos originais
rm "$arq" -f
done
fi



a idéia é então:

cat ou sort ou ls ou... | while read variavel
do
resto_do_script
done


Abraços
Henry


anderson freitas
07 Dez 2012, 16:00
convert *.png -resize 1920x1200! -blur 0.4x0.4 -modulate 100,120,100 -depth 8 -quality 9 NO-0000.png

esse comando:redimenciona,salvando o original,aplica uma desfocagem de leve,deixa as cores mais vivas com o -modulate,nesse caso do png salva coma a compressão -9 e por fim renomeia as imagens,basta mudar a proporção do -resize e a extensão do arquivo para atender suas necesidades e você pode jogar esse comando em um texto salvar com o final .sh dar permissão de execução.
Patola
07 Dez 2012, 13:51


Cheguei a fazer um script semelhante mas que reduz as imagens por um raio (retamanho x.gif 2.0) ou reduz para um tamanho configurável (500k) — e.g. retamanho x.gif vai redimensionar a imagem até que ela tenha entre 470k e 500k. Se for gif, ele automaticamente otimiza com o gifsicle. Funciona com imagens animadas.

Pra quem se interessar ele está aqui; fiz em zsh, mas talvez funcione em bash: http://pastebin.com/equYuXbh
Vicente Lima
07 Dez 2012, 11:04
Bom dia, para todos.

Não ha nada melhor que compartilhar. Ja aprendi bastante aqui no site Dicas-l e sou agradecido a todos.

Estou compartilhando este script que atualmente esta assim

----------------------
#!/bin/sh

if [ -z $1 ] # se for nulo o primeiro parametro passado para o script
then

echo "\n Script para reduzir tamanho de imagens (*.jpg)
Converte todas as fotos (*.jpg) da pasta indicada para uma pasta indicada.

Indique uma pasta para os novos arquivos que serao criados.
Os novos arquivos terao os mesmos nomes.
CUIDADO: Os arquivos originais somente serao alterados caso voce
indique a pasta de destino igual a de origem.
E' necessario o programa *ImageMagick*

Parametros:

fotoDiminuir <origem> <destino> <porcentagem>

<origem> caminho de onde as fotos estao
<destino> caminho de destino para fotos menores
(se a pasta de destino nao existir, ela sera criada)
<porcentagem> porcentagem desejada do tamanho da foto original.
(Este parametro eh opcional)
caso nao seja informado a nova imagem tera 50%

Exemplos:

fotoDiminuir /pastaOrigem /pastaDestino 30
fotoDiminuir /pastaOrigem /pastaOrigem/menor
\n"

exit 0
fi


#validar os parametros

# validar existencia da pasta de origem
if [ ! -d "$1" ]; then
echo "\n erro: pasta de origem nao existe. "
echo " $1 -> nao eh uma pasta valida"
exit 1
fi

# validar se foi passado o segundo parametro
if [ -z $2 ];then
echo "\n erro: faltando a pasta de destino."
echo " Voce deve informar uma pasta para as imagens alteradas."
echo " Para ajuda, execute novamente sem nenhum parametro. \n"
exit 1
fi

pastaOrigem=$1
pastaDestino=$2
porcentagem=$3


# caso nao exista, criar diretorio de destino
if [ ! -d "$2" ]; then
echo " criando dir: " "$2"
mkdir "$2"
fi

# por padrao reduz a imagem em 50%
if [ -z $3 ];then
porcentagem="50"
fi

for i in $(ls "$1"/*.jpg |xargs -n1 basename)
do
convert -resize "$porcentagem"% "$1/$i" "$2/$i"
done

exit 0

-------------------------


User uma porcentagem (no resize) para nao alterar a proporção da imagem original.

Abraços,
Vicente Lima
Fernando Roxo
06 Dez 2012, 09:58
Com o costume (duvidoso?) do pessoal de colocar espaços em nomes de arquivos o script pode apresentar problemas em algumas situações. Sugiro colocar os nomes de arquivos, de entrada e de saída, entre aspas. Por exemplo :

convert -density 36x36 -geometry 400x400 "$arq" "/diretorio/fotos/reduzida/red_$arq"

Isto pode ser particularmente importante na linha:

rm "$arq" -f

Aliás, uma boa prática seria testar o código de retorno do comendo 'convert' e só prosseguir se o retorno for zero:

convert .....
RC=$?
if [ $RC -ne 0 ]; then
echo "`basename $0`: convert retornou erro $RC no arquivo acima"
else
chgrp...
....
rm ...
fi


HTH
Vitor
06 Dez 2012, 09:19
Olá,
Uma boa prática de programação que uso, independente da linguagem ou shell, é colocar caminhos, valores, ou textos que usamos mais de uma vez, em evidência. Isso facilita modificações e manutenções futuras.
No exemplo, os caminhos para os arquivos de origem e de destino poderiam estar em evidência através de uma variável para cada caminho e essa variável ser referenciada durante o codigo para evitar ter que repetir o caminho completo em cada teste ou comando.
Abraço.
Robson
06 Dez 2012, 07:35
Muito bom o script. O legal de software livre, é que temos diversas maneiras de fazer a mesma coisa.
Tem outro comando também interessante, e pode reduzir bastante as linhas de código. Fiquei conhecendo a pouco tempo, e gostei bastante, segue o link: http://www.imagemagick.org/www/mogrify.html

Por exemplo pra reduzir todas imagens do diretório:
$ mogrify -resize 256x256 *.jpg

Vale a pena dar uma lida no manual. Abraço!
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script