Arquivo

Archive for julho \22\-03:00 2008

Perl + Image Magick: Exemplo 4 (Gerando Thumbnails)

22 julho, 2008 2 comentários

Se você sempre achou dificil encontrar aquele programa que fizesse de tudo com suas imagens, enfim, sua procura acabou não é mesmo?

Ao acompanhar estes tutoriais você com certeza deve estar convencido da qualidade do IM.

E neste assunto o IM também não poderia ficar de fora – Gerar Thumbnails

O ImageMagick é essencial para redimensionar imagens com qualidade. Além de suportar inúmeros tipos de arquivos, ele transforma nossas imagens em perfeitas cópias remodeladas, e o melhor, sem exagerar no tamanho. Vamos ver passo-a-passo de um exemplo de como redimensionar imagens com ele, e em seguida uma demonstração.

Primeiro, devemos instanciar o módulo

$novo = Image::Magick -> new( );

Em seguida, carregamos a imagem que iremos trabalhar

$novo -> Read(“$caminho”);

Agora vamos obter as dimensões da imagem

($largura, $altura) = $novo -> Get(‘width’, ‘height’);

Tendo sido definida a nova largura, fazemos uma regra de três para obter a dimensão final restante, no caso a altura final

$n_a=($n_l*$altura/$largura);

Agora, a função que realiza todo o trabalho, Resize

  $nova_imagem  = $novo -> Resize(
  width => $n_l,
  height => $n_a,
  );

Enfim mandamos escrever a nova imagem

$nova_imagem = $novo -> Write(“$saida/thumb.jpg”);

Pronto, você agora tem um redimensionador de imagens da melhor qualidade! Se comparando com o GD, podemos notar como o ImageMagick é capaz de suavizar os pontos da imagem, tornando-a assim muito mais nítida. Veja: 


 

 

Imagem Original

Imagem Original

 

 

Imagem redimensionada usando GD

Resultado: Usando GD

 

 

Usando ImageMagick

Resultado: Usando ImageMagick

 

 


 

 

Veja o Código Completo:
(im-exemplo4.pl)

#!/usr/bin/perl
use Image::Magick;
$caminho =”/home/imagem.jpg”; # Imagem Original
$saida= “/home”; # Saída da Thumbnail
$n_l=”90″; # Nova largura que a thumbnail terá

##############################################################
$novo = Image::Magick -> new( ) or die $!; # Cria imagem
$novo -> Read(“$caminho”); # Lê a imagem

($largura, $altura) = $novo -> Get(‘width’, ‘height’); # Pega as dimensões

$n_a=($n_l*$altura/$largura); # REGRA DE TRÊS

#### Redimensiona ####
$nova_imagem = $novo -> Resize(
width => $n_l,
height => $n_a,
);
#####################

$caminho =~ s/.*(/|\)//gi; # …Queremos só o nome da imagem
$nova_imagem = $novo -> Write(“$saida/thumb_$caminho”);
print “Thumbnail gerada com sucesso!”;

##############################################################

 Image Magick
[ 1 | 2 | 3 | 4 | 5 ]

Perl + Image Magick: Exemplo 3 (Montagem)

20 julho, 2008 1 comentário

Neste terceiro exemplo de utilização do Image Magick iremos ver como usá-lo para realizar montagens.

Capturamos uma antiga imagem de Johnny Depp, e queremos deixá-la com um visual mais atual do ator. Pois vejam só:

Johnny Depp

Johnny Depp

Não, não pode ser! Este não é o famoso Jack Sparrow que conhecemos!

Mas, algo me diz que o Perl, como sempre, poderá resolver nosso problema!

E desta vez, contará com a ajuda de seu ajudante aliado, carinhosamente apelidado de IM.

Pois bem, vamos sair de cena e ver como o Perl e o IM realizam esta proeza?

AH! Ia me esquecendo! Não posso deixar de dar-lhes alguns itens para ornamentar nosso famoso pirata aí né?

Ok! Peguei na net um chapéu de pirata, e um bigode “encrementado”, o que acham?

  

Com certeza! O resultado disso tudo no mínimo será interessante!

Bem, como já não nos resta mais nada aqui, então, Perl, mãos-à-obra!!!!!


O primeiro passo é instanciar as imagens que serão usadas e armazená-las em $imagem que será o resultado final.

Lembrando que a primeira a ser instanciada é a que será usada como base ou fundo. No nosso caso é a imagem “johnny_depp.jpg”, que armazenaremos numa variável à caráter! :]

$johnny=new Image::Magick();
$imagem=$johnny->ReadImage(“johnny_depp.jpg”);

Como usaremos imagens carregadas de arquivos diferentes, usamos a função ReadImage. Este procedimento deve ser feito para cada imagem que formos trabalhar.

Note que a imagem que contém o bigode é a única colorida. Para padronizá-la ao tom-de-cinza inicial, usamos o seguinte comando:

$bigode->Quantize(colorspace=>’gray’);

Pronto, agora que carregamos todas as imagens, devemos clonar a base para fazermos a montagem. Fazemos isto assim:

$saida=$johnny->Clone( );

Agora é só jogar as imagens por cima informando o local onde inserir, por x e y e gravity. Note:

$saida->Composite(image=>$bigode,x=>3,y=>80,gravity=>’North’);

$saida->Composite(image=>$chapeu,x=>0,y=>0,gravity=>’North’);

E o tão esperado comando, responsável por fazer de Johnny Depp, um Pirata do Caribe é: Montage

$montagem=$saida->Montage(geometry=>”188×236″); 

 


im-exemplo3.cgi
Resultado: im-exemplo3.cgi

Veja o Código Completo
(im-exemplo3.cgi)

#!/usr/bin/perl
use Image::Magick;

$johnny=new Image::Magick();
$imagem=$johnny->ReadImage(“johnny_depp.jpg”);

$bigode=new Image::Magick();
$imagem=$bigode->ReadImage(“bigode.png”);
$bigode->Quantize(colorspace=>’gray’);

$chapeu=new Image::Magick();
$imagem=$chapeu->ReadImage(“chapeu.png”);

$saida=$johnny->Clone();
$saida->Composite(y=>80,x=>3,image=>$bigode,gravity=>’North’);
$saida->Composite(y=>0,x=>0,image=>$chapeu,gravity=>’North’);

$larg=$johnny->Get(‘width’);
$alt  =$johnny->Get(‘height’);
$montagem=$saida->Montage(geometry=>”$largx$alt”);

binmode STDOUT;
print “Content-type:image/pngnn”;
print $montagem->Write(‘png:-‘);

Perl + Image Magick: Exemplo 2 (Texto c/ Fundo Degradê e Relevo)

Com o ImageMagick em poucos passos podemos gerar uma imagem avançada, com relevo e tudo.  Mas vamos aplicar isto a uma situação real?

Imagine que você é o programador de um site que necessite gerar botões que recebem valores variáveis, como por exemplo, IPs. Seria impossível realizar este trabalho utilizando o Photoshop para criar uma imagem diferente para cada visitante de seu site, não é mesmo? Mas o IM torna isso possível! E com muito pouco esforço, vejam!

$novo  = Image::Magick-> new(size=>’330×65′);

Aqui instânciamos a imagem com o tamanho 330×65, agora devemos setar o fundo degradê

$imagem = $novo-> Read(‘gradient:#105CB6-#839E37’);

Note que especificando o valor gradient: podemos definir as duas cores que irão compor nosso degradê

Feito isso, podemos adicionar um efeito relevo para dar uma aparência real de botão, para isto utilizamos a função Raise

$imagem=$novo-> Raise(’12×4′);

Assim teremos a imagem com o fundo degradê e com relevo médio em cima e em baixo, porém grande relevo lateral.

Note que o relevo ficou bem evidente. Para dar uma suavizada, podemos utilizar a ferramenta borrar em movimento, MotionBlur

$imagem=$novo->MotionBlur(angle=>60,radius=>8,sigma=>12);

Esses parâmetros podem ser definidos como, o ângulo propriamente dito, o radius sendo a suavidade e o sigma o alcance. Isto basta para obtermos uma boa suavização lateral deixando o botão bem mais definido.

Obs.: Como esse comando foi dado antes do Annotate, ele não irá se aplicar ao texto escrito, se caso o comando fosse aplicado depois, então o texto também seria borrado.

Agora como passo final, vamos anotar o texto na imagem

$imagem=$novo-> Annotate( font    => ‘HATTEN.ttf’,
fill       => ‘white’,
pointsize  => 32,
gravity      => ‘Center’,
text          => “Olá, seu IP é $ENV{REMOTE_ADDR}”,
);

Como visto logo acima, em text podemos definir qualquer variável, o que faz de nosso programa ser bem especial, pois neste caso, todo visitante obterá o seu próprio IP que é obtido através de $ENV{REMOTE_ADDR}.


Resultado: im-exemplo2.cgi


Veja o Código Completo:
(im-exemplo2.cgi)

#!/usr/bin/perl

use Image::Magick;

###########################################################

$format = “jpeg”; # Formato de saída

$texto  = “Olá, seu IP é $ENV{REMOTE_ADDR}”;
# Aqui é o texto que vai aparecer na imagem

$novo  = Image::Magick-> new(size=>’330×65′);
# Cria imagem com as dimensões desejadas

$imagem = $novo-> Read(‘gradient:#105CB6-#839E37′);
# Lê a imagem e coloca-a em uma variável com um fundo degradê

$imagem=$novo-> Raise(’12×4’); # Adiciona um efeito de relevo

$imagem=$novo->MotionBlur(angle=>60,radius=>8,sigma=>10);
# Adiciona um efeito de borrar

$imagem=$novo-> Annotate(font     => ‘HATTEN.ttf’,# Fonte escolhida
fill        => ‘white’,                # Cor da fonte
pointsize  => 32,                 # Tamanho da fonte
gravity      => ‘Center’,        # Alinhamento
text          => $texto,            # Escreve o texto
);

print “Content-type:image/$formatnn”;
# Imprime o cabeçalho com o devido formato

binmode STDOUT;
# Converte a saída para binario

$imagem=$novo->Write( “$format:-” );
# Mostra a imagem no formato escolhido