Arquivo

Posts Tagged ‘magick’

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

Perl + Image Magick: Exemplo 1 (Texto c/ Fundo e Borda)

Pessoal, nesse primeiro exemplo creio que vocês já terão uma amostra do que o IM é capaz.

Como objetivo simples, nosso programa deverá mostrar um desenho na tela tendo uma cor de preenchimento tanto para o fundo quanto para a borda, além de uma fonte personalizada! Vamos ver como isto poderá ser feito?

Bem, com o seu editor de texto aberto, vamos ao código inicial que chamará o módulo Magick

use Image::Magick;

Assim como em todos os exemplos posteriores, devemos importar o módulo Image::Magick, para que em seguida, possamos instanciar o objeto.

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

Note que já na instanciação, setamos o valor de size, ou seja, o tamanho da imagem. Obs.: Este atributo poderia ter sido definido através do comando $novo->Set(size=>’250×80′);

 O próximo comando inicial é chamado Read que armazenará uma imagem existente, caso for especificado, ou uma cor de fundo, se especificado por xc.
Como em nosso caso queremos definir uma cor de fundo usamos o seguinte código:

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

Assim, teremos um quadro de 250×80 com o fundo azul escuro. Vamos agora preenchê-lo?

Use o comando Annotate, ele anota um texto na imagem:

$imagem=$novo-> Annotate(font      =>”JOKERMAN.TTF”, 
                                          fill      => ‘white’,       
                                          pointsize  => 30,               
                                          undercolor =>’#839E37′,
                                          stroke    =>’#4C6014′,
                                          strokewidth=>’1′,          
                                          gravity    => ‘Center’,      
                                          text      => ‘PerlPoint’,       
)

Nós usamos vários atributos para obter o resultado desejado. Usamos font para definir a fonte, fill para definir sua cor, pointsize para definir o tamanho, undercolor para definir o fundo, stroke para definir a borda, strokewidth para definir a espessura da borda, gravity para definir o alinhamento, e finalmente text para passar o texto a ser exibido. Obs.: Os atributos de Annotate, incluem family, style, stretch, weight, geometry, antialias, x, y, affine, translate, scale, rotate, skew, align, encoding.

 

Agora temos todos os dados de nossa imagem definidos, podemos então setar o cabeçalho

 print “Content-type:image/pngnn”;

Definir a saída binária

binmode STDOUT;

E finalmente escrever a imagem.
Note que quando queremos exibir a imagem na tela, devemos definir como saída, o formato:-

$imagem=$novo->Write( “png:-” );


Photobucket

Resultado: im-exemplo1.cgi


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

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

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

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

$texto  = ” PerlPoint “;  # Aqui é o texto que vai aparecer na imagem

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

$imagem = $novo-> Read(‘xc:#105CB6’); # Define o fundo

$imagem=$novo-> Annotate(font      =>”JOKERMAN.TTF”, # Define a fonte
                                          fill      => ‘white’,               # Cor da fonte
                                          pointsize  => 30,               # Tamanho da fonte
                                          undercolor =>’#839E37′,  # Cor do fundo do texto
                                          stroke    =>’#4C6014′,     # Cor do contorno
                                          strokewidth=>’1′,            # Expessura do contorno
                                          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

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