Perl + GD Graphic Library: Exemplo 6 (Gerando Thumbnails)
Ao trabalhar com imagens, podemos utilizar o GD para gerar cópias com tamanhos diferentes, miniaturas.
A função copyResized foi feita especialmente para isto.
Junto com alguns comandos em Perl fica fácil fazer um script Gerador de Thumbnails.
Como esta é uma função nativa do GD, somente precisamos do módulo próprio:
use GD;
Este módulo nos dará várias funções para leitura de imagens, que é o que iremos precisar. Entre elas há newFromPng, newFromJpeg, newFromGif, newFromXbn, etc..
No nosso caso usaremos a newFromJPeg, pois trabalharemos com imagens JPEG.
$original = newFromJpeg GD::Image(“$caminho”);
Agora a imagem localizada em $caminho no servidor está armazenada na variável $original, pois é a imagem da qual iremos gerar a thumbnail.
Mas para gerar a nova thumbnail de modo dinâmico precisamos saber as dimensões da imagem original. Para isto usamos a função getBounds() que retorna a largura e altura da imagem.
($l,$a) = $original->getBounds();
Precisamos também setar o valor de uma das dimensões para a nova thumbnail. Sendo este valor um número qualquer especificado em $n_l, fazemos uma “regra de três básica” para descobrir a incógnita restante:
$n_a = ($n_l*$a)/$l;
Assim, $n_a será a nova altura diretamente proporcional às dimensões da nova imagem que será gerada.
Bem, agora é a hora em que o GD realmente começa a entrar em ação.
$THUMB = new GD::Image($n_l,$n_a);
Criamos uma nova imagem com as proporções obtidas e armazenamos em $THUMB.
Agora, resta-nos passar a imagem original para $THUMB. Usaremos então a função copyResized() passando como parâmetros a imagem, destX, destY, origemX, origemY, destT, destA, origemT, origemA.
$THUMB->copyResized($original,0,0,0,0,$n_l,$n_a,$l,$a);
Pronto, agora temos a thumbnail já fixada na nova imagem. Basta gravá-la em um arquivo.
Iremos utilizar o mesmo nome do arquivo, porém com o prefixo thumb_
Para obter o nome do arquivo, usamos o seguinte comando para remover as barras do caminho de origem:
$nome = $caminho =~ s/.*(/|\)//gi;
Vamos agora para a criação do novo arquivo:
open (THUMB,”>thumb_$caminho”) or die “$!”;
binmode THUMB;
print THUMB $THUMB->jpeg;
close(THUMB);
Caso nenhum erro seja retornado, será criado um novo arquivo com nossa thumbnail em novas dimensões.
Note o resultado |
|
Veja o Código Completo:
(gd-exemplo6.cgi)
#!/usr/bin/perl
print “Content-type:text/htmlnn”;$caminho =”/home/gdlogobig.png”; # Imagem Original
$saida= “/home/thumbs/”; # Saída das Thumbnails
$n_l = “100”; # Nova largura que a thumbnail terá.### – Chamamos o GD – ###
use GD;
### —————- ###
$original = newFromPng GD::Image(“$caminho”); # Cria imagem para edição
($l,$a) = $original->getBounds(); # Pega as dimensões#### Calcula dimensões ###
$n_a = ($n_l*$a)/$l;
#######################$THUMB = new GD::Image($n_l,$n_a); # Cria imagem vazia para a thumbnail
$THUMB->copyResized($original,0,0,0,0,$n_l,$n_a,$l,$a); # Coloca os dados na imagem
$caminho =~ s/.*(/|\)//gi; # Pega o nome da imagem##### Grava a imagem #####
open (THUMB,”>$saida/thumb_$caminho”) or die “$!”;
binmode THUMB;
print THUMB $THUMB->png;
close(THUMB);
######################print “Thumbnail gerada com sucesso!”;