Quem sou eu e o que este blog.

domingo, 24 de julho de 2011

Gerando amostras de imagem em massa

Uma coisa chata é gerar amostra de fotos, às centenas, para colocar em um site como o Picasa. Imagine que fez centenas de fotos em uma apresentação de dança com 20 turmas, e tem que colocar todas elas em um site para as pessoas escolherem, todas com identificação e logotipo. E se ainda tiver que resolver a rotação, mais trabalho ainda. Se fizer à mão, uma por uma, vai ter uma LER (Lesão por Esforço Repetitivo) no meio do caminho.

Com uma boa dose de "nerdice", e usando um ambiente Unix eu resolvi o problema. Mas para usarem precisa menos "nerdice", mas precisa de um bando de ferramentas comuns ao Unix, portanto, usuários de Mac OS X estão na vantagem.

Netpbm

Todo o processamento pesado é feito com um script e usando o Netpbm. O Netpbm é um conjunto de programas que convertem diversos formatos de imagem para um formato nativo dele, e vice-versa, e mais um conjunto de programas para trabalhar com as imagens. Tem programas para rotação, mudança de tamanho, colocação de imagens sobrepostas etc. Maiores detalhes no site do projeto.

Gerador de amostras

Agora vamos ao script. Ele aceita na linha de comandos uma série de arquivos JPEG, reduzindo o tamanho, rotacionando se necessário, colocando logotipo, e finalmente gerando um novo JPEG em um diretório de saída. Os originais não são modificados.

Para usar basta fazer algo como o exemplo abaixo:

gera_amostas.sh imagem1.jpg imagem2.jpg imagem3.jpg imagem32*.jpg

O programa está abaixo

----- 8x ----- Corte aqui ----- Cut here -----
#!/bin/sh

#
# Autor: João Rocha Braga Filho (JGoffredo)
#
# Versão 2.0.0
#
# Licença GPL
#

tamanho=500000
logo=~/trabalho/imagens/gimp/Logo/JGoffredo_003.pnm
destino=~/trabalho/imagens/00_Reduzidas/

for i in $*
do
        nome=`basename $i`

        if ! test -f $destino$nome
        then

                ident=/tmp/gera_amostra$$

                pbmtext -builtin fixed $nome > $ident

                case `jpegexiforient $i` in

                1)
                        jpegtopnm < $i | pnmscale -pixels=$tamanho | pamcomp -valign=top -align=left -opacity=0.35 -xoff=10 -yoff=10 $logo | pamcomp -valign=bottom -align=left -opacity=0.35 -xoff=10 -yoff=-10 $ident | pnmtojpeg -quality=95 > $destino$nome
                        ;;
                8)
                        jpegtopnm < $i | pnmscale -pixels=$tamanho | pamflip -ccw | pamcomp -valign=top -align=left -opacity=0.35 -xoff=10 -yoff=10 $logo | pamcomp -valign=bottom -align=left -opacity=0.35 -xoff=10 -yoff=-10 $ident | pnmtojpeg -quality=95 > $destino$nome
                        ;;
                *)
                        echo -n "Rotacao desconhecida: $i. Tecle Enter: "
                        read a
                        jpegtopnm < $i | pnmscale -pixels=$tamanho | pamcomp -valign=top -align=left -opacity=0.35 -xoff=10 -yoff=10 $logo | pamcomp -valign=bottom -align=left -opacity=0.35 -xoff=10 -yoff=-10 $ident | pnmtojpeg -quality=95 > $destino$nome
                        ;;
                esac

                rm $ident

                touch -r $i $destino$nome
        fi
done                    
----- 8x ----- Corte aqui ----- Cut here -----

Tem 3 variáveis, tamanho, logo e destino, que definem detalhes de funcionamento. A variável tamanho está configurada para meio Mega pixel, um bom tamanho para Orkut, Facebook etc. A variável logo é o arquivo com o seu logotipo, que deve estar em um formato nativo do Netpbm. Use o
jpegtopnm se seu logo está em JPEG, ou o tifftopnm se o seu logo está em TIFF. Note, já tem que estar no tamanho final que você o quer na imagem. A variável destino diz onde quer que os arquivos finais sejam gravados.

Se já existir um arquivo com o mesmo nome no diretório destino, não será sobre-escrito, e nenhum processamento será feito. Portanto é bom o diretório destino estar vazio.

Bugs

Só foram feitas duas rotações, por preguiça minha, mas as outras não são difíceis.

Este script está um pouco modificado em relação ao que está no meu computador, portanto pode ter algum bug que introduzi na modificação e não percebi.

Nenhum comentário:

Postar um comentário