Faça magia com imagens na Shell

ArticleCategory: [Es gibt verschiedene Artikel Kategorien]

Graphics

AuthorImage:[Ein Bild von Dir]

[Photo of the Author]

TranslationInfo:[Autor und Übersetzer]

original in en Katja Socher 

en to pt Bruno Sousa 

AboutTheAuthor:[Eine kleine Biographie über den Autor]

A Katja é a editora alemã da LinuxFocus. Ela gosta do Tux, filme & fotografia e do mar. A sua página pessoal pode ser encontrada aqui.

Abstract:[Hier sollte eine kleine Zusammenfassung stehen]

Neste artigo veremos alguns truques que os "experts" do ImageMagick conseguem fazer utilizando uma colecção de utilitários gráficos como os ingredientes de base e a linha de comandos como a varinha mágica.

ArticleIllustration:[Das Titelbild des Artikels]

[Illustration]

ArticleBody:

Fazendo Magia

Nos velhos tempos os "experts" tomavam os seus ingredientes de base, misturavam-nos num grande pote, agitando a sua varinha mágica e murmuravam as suas palavras mágicas... e de repente alguém era transformado em sapo. Nos nossos tempos modernos os "experts" são como toda a gente na sociedade altamente especializada e os seus livros de truques só contêm alguns truques úteis para tarefas muito especificas. Então o ImageMagick não é nenhum livro de truques para uso geral. Em muitos aspectos não consegue competir com o Gimp ou muitos outros programas gráficos mas possui especificações que são muito úteis.
A sua força real reside na possibilidade de automatizar um monte dos seus processos ao trabalhar em conjunto com a shell.

Mas antes de divulgarmos alguns truques demos uma vista rápida pelos seus ingredientes de base primeiro:

Os ingredientes de base

ou O que é o ImageMagick?

O ImageMagick é uma colecção de utilitários gráficos para trabalhar com imagens. Os utilitários são apresentação, importação, montagem, conversão, "mogrify", identificação e combinação.
Display: Se digitar "display &" uma janela de apresentação aparecerá e poderá trabalhar directamente na imagem. Através do menu pode abrir um ficheiro, guardar ou apagá-lo, translar ou rotacioná-lo, alteara a cor ou aplicar certos efeitos, e.g. implosão / explosão ("implode") enrelevando ("emboss") a figura ou por uma moldura à sua volta e mais.
Com o Import pode tirar "fotografias" do ecrã inteiro ou de certas imagens ou janelas.
Animate é um utilitário de animação. Pode seleccionar uma serie de imagens para serem apresentadas uma após a outra ou pode ver um gif animado com.
Com Montage você pode e.g. criar uma imagem telhada ou obter uma imagem onde pode ver todas as imagens simples que compõem um gif animado.
Convert é um utilitário muito poderoso. Pode converter uma imagem noutro formato e.g. uma imagem gif numa imagem jpg ou o inverso, pode alterar o tamanho de uma imagem e aplicar também imensos efeitos, e.g. efeito nas imagens de "characoal".
Mogrify é muito semelhante ao convert com uma grande diferença, é que o mogrify escreve por cima da imagem corrente enquanto com o convert e outros utilitários você tem de especificar um ficheiro onde a imagem alterada é salva. Por isso eu quase não a uso.
Identify dá-lhe informação acerca da imagem como a sua geometria, nome, formatação, etc.
Combine combina duas ou mais imagens numa outra imagem. Você pode, por exemplo, meter um logo em cada imagem.

Para utilizar os utilitários digita o nome do utilitário, seguido da opção que pretende usar, a imagem que é para ser manipulada e o nome do ficheiro onde pretende guardar as alterações feitas à imagem.
E.g. se você pretende transformar o tux1.gif em "characoal" com um factor 3 e guardá-lo no tux1characoal.gif você escreverá:
convert -characoal 3 tux1.gif tux1characoal.gif

Após esta vista de olhos pelos ingredientes de base vejamos alguns truques:

Alguns Truques

Alterando a altura e o comprimento das suas imagens

Imagine que você possui uma pilha de imagens com as últimas vitimas que você transformou em sapo e pretende pô-las na sua página web. No sentido de reduzir o tempo de carregamento você quer tornar as suas imagens mais pequenas.
Com o utilitário convert você pode tornar as suas imagens maiores ou mais pequenas ou criar um índice com amostras ("thumbnails").
O comando
convert -geometry 60x80 image.gif out.gif
redimensiona a imagem image.gif para um comprimento de 60 e uma altura de 80 e escreve a imagem resultante em out.gif.

Para dar a todas as nossas imagens e.g. uma altura e um comprimento de 80 de um só modo você escreverá:
#!/bin/sh
for f in $* ;do
 convert -geometry 80x80 $f t_$f
 echo "<a href=\"$f\"><img src=\"t_$f\" width=\"80\" height=\"80\"></a>"
done
# end of script
(Edite estas linhas com o editor de texto da sua preferência (vi, emacs, nedit, kedit...) e salve com o nome mksmallimage no directório pessoal. Vá depois para a linha de comandos bash e digite
chmod 755 /home/katja/mksmallimage
(utilize o nome do seu directório pessoal em vez de katja) Depois pode utilizar a script digitando home/katja/mksmallimage xxx.jpg *.gif convertendo todas os ficheiros gif e o ficheiros xxx.jpg.)

Criando vistas das imagens

Você tem um CD com uma colecção de todas as pessoas que transformou em sapos no último par de anos. Agora o seu rival "expert" que tem ciúmes de si quer a prova em como tornou o seu cão num sapo. E você passou o dia inteiro à procura daquela foto. Isto podia ter sido evitado se você tivesse uma vista de imagem com todas as imagens do seu CD. Com o ImageMagick é muito fácil de criar uma:
display "vid:*.jpg" 
Isto gerará uma imagem visual com todas as imagens jpg do directório corrente. Ou:
display "vid:frog/*" 
gerará uma imagem visual com todas as imagens no directório frog.
Com o botão direito numa das imagens obtém um menu onde pode seleccionar "Load" para ver a imagem no seu tamanho real.

[visual image directory]


Isto é um modo muito fácil de criar uma vista de imagem mas dependendo do seu computador pode levar algum tempo para a imagem visual do directório ser gerada e consome imensa memória se tiver muitas imagens. Assim escreveremos uma pequena script htmlthumbnails que é agora menos exigente a este respeito e depois construímos uma página web onde pode clicar em alguma amostra para obter a imagem original.

O código html para isto é parecido com o que se segue:
<a href="file.gif"><img src="t_file.gif" width="60" height="80"></a>
O ficheiro original onde está file.gif e a amostra é t_file.gif.
Agora escreveremos uma script que gerará as amostras e escreve o código html para nós.
for f in $* ;do
 convert -geometry 80x80 $f t_$f
 echo "<a href=\"$f\"><img src=\"t_$f\" width=\"80\" height=\"80\">"
done
A script acima percorrerá todas as imagens especificadas na linha de comandos, gerará as amostras e escreverá o código html no ecrã. Podemos, depois, copiar e colar o código html para a nossa página web.
Para uma script completa adicionámos algum texto de ajuda e verificação de erros. Aqui está a nossa script final. chamada htmlthumbnails :
htmlthumbnails (html para ver), htmlthumbnails (texto para download)

Alterando o formato da imagem

O Convert pode não só alterar o tamanho bem como o formato. E.g. pode alterar uma imagem gif numa jpg ou o inverso. O comando para fazer isto é simplesmente:
convert image.gif image.jpg
O Convert sabe pela extensão do ficheiro o formato a utilizar.
Para alterar muitas imagens do formato jpg para o gif utilize:
for f in $* ;do
 if echo "$f" | grep -i "jpg$" > /dev/null ; then
   gif=`echo "$f" | sed 's/jpg$/gif/i'`
   echo "converting  $f to $gif ..."
   convert 80x80 $f $gif
 else
   echo echo "$f is not a jpg file, ignored"
 fi
done
Existe, ainda um número considerável de outros formatos que o ImageMagick conhece também.

Pondo um logo em todas as suas imagens

Gostaríamos de adicionar um pequeno logo como aquele que consegue ver à direita a um número de imagens. [linuxfocus stamp]

Este logo deve ser uma imagem gif pequena e transparente. O nosso logo devia ser colocado como uma pequena assinatura no canto direito mais baixo na imagem final, como pode ver na seguinte imagem Tux:

[tux with logo]

Qual é o comando para fazer isto?
O utilitário combine pode ser usado para combinar 2 imagens numa nova. Várias opções dizem ao programa como fazê-lo:
combine -gravity SouthEast -compose Over img.jpg logo.gif stamp_img.jpg
A opção "gravity SouthEast" pões o logo.gif no canto direito mais baixo. A opção "compose Over" diz que substituirá a imagem pelo logo nos sítios que se sobrepõem.

Para obter uma script totalmente funcional introduzimos um ciclo e de novo adicionámos algum texto de ajuda e verificação de erros. Eis aqui a nossa versão final da script, chamada stampimages :
stampimages (html para ver), stampimages (texto para download)

Obtendo informação das propriedades das imagens

O Identify apresenta detalhes acerca do tipo das suas imagens, o seu tamanho e geometria. Parecido com o que se segue:
identify  image.jpg
results in
image.jpg 340x254 DirectClass 13939b JPEG 0.1u 0:01
Que pode o nosso "expert" fazer com? Bem, para desenhar boas páginas web que apresentaram imagens enquanto a página está a carregar você devia especificar a geometria exacta de todas as imagens. O código html é parecido com isto:
<img src="image.jpg" width="340" height="254" alt="[sample picture]">
Quando as nossas imagens têm diferentes tamanhos e não sabemos a altura e comprimento exactos de cada uma podemos utilizar o identify para nos ajudar. Nós escrevemos uma script que lerá a saída do "identify" e imprimirá esta linha depois. A geometria da imagem é o segundo parâmetro na string de saída do programa identify. Para obtermos este parâmetro usamos o comando awk:
identify  image.jpg | awk '{print $2}'
results in
340x254
Agora temos de separar a geometria em altura e comprimento. Isto pode ser feito com:
echo 340x254 | sed 's/[^0-9]/ /g' | awk '{print $1}'
a qual dá o comprimento. A altura pode ser obtida com:
echo 340x254 | sed 's/[^0-9]/ /g' | awk '{print $2}'
Não foque demasiado nos comandos exactos da shell. Se não os entende completamente ainda aceite-os como dados. Haverá um artigo acerca da programação da shell na próxima edição de LinuxFocus onde será explicada toda a sua magia. A script final é algo parecido com o que se segue:
file=$1
geometry=`identify $file | awk '{print $2}'`
# geometry can be 563x144+0+0 or 75x98
# we need to get rid of the plus (+) and the x characters:
width=`echo $geometry | sed 's/[^0-9]/ /g' | awk '{print $1}'`
height=`echo $geometry | sed 's/[^0-9]/ /g' | awk '{print $2}'`
echo "<img src=\"$file\" width=\"$width\" height=\"$height\">"
Para obter uma script completa nós adicionámos texto de ajuda e verificação de erros. Aqui está a nossa versão final da script, chamada imgsrcline :
imgsrcline (html para ver), imgsrcline (texto para download)


Ao trabalhar com o ImageMagick descobri, por vezes, discrepâncias entre a documentação e a funcionalidade actual. Algumas especificações não são muito estáveis. Contudo se se restringir às coisas demonstradas acima verá que são úteis. As funções listadas acima trabalham. Eu usei o ImageMagick-4.2.9, o ImageMagick-5.2.9 e o ImageMagick-5.3.0 e as coisas aprendidas aqui trabalham em todas estas versões.

Espero que fique com a ideia do que pode fazer com o ImageMagick e utilize as scripts ou até mesmo a criar os seus próprios truques de magia.
Divirta-se!

Referências