Perl + Image Magick: Exemplo 4 (Gerando Thumbnails)
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:
|
|
|
|
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)
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ó:
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″);
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}.
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 formatobinmode STDOUT;
# Converte a saída para binario$imagem=$novo->Write( “$format:-” );
# Mostra a imagem no formato escolhido