[perlメモ]GD.pmによる画像連結

かつて、GIFには暗黒の時代があった・・・。インターネットが世界的に普及し始めた頃、インターネットの極悪四天王のと言われた(嘘)○○SYSがGIF特許の権利を主張しはじめ、GIFフォーマットは自由に利用する事が出来なくなった。あまたのフリーソフトからその画像フォーマットのサポートが消えていった。人々は、逃げ惑い新たな画像フォーマットPNGへと生活の場を移していった。暗黒の時代から10年・・・。世紀末救世主(以下略 なんちって

あきた(*’ω’ *)

そういうわけでUNISYSの特許切れが待ちどうしかった時代はいつの間にか過ぎて普通にGIFフォーマットが利用できるようになっている現在です。

※企業は通常有料のライブラリを買って画像連結してました。まあ、企業がオープンソースを利用するのも割と最近の事ですけど。

GIFがフリーでは自由に利用できなかった時代、GIF画像の連結には「とほほ神」のgifcatが良く使われていました。ただ、gifcatで連結したGIF画像は携帯電話や一部ブラウザで正しく表示できないのと、確かGIFアニメフォーマットを利用した連結なので表示が桁ごとでまったりしてしまうのが難点でした。

今でも気軽にGIF画像を連結するのには便利ですのでお勧めです。

gifcat.pl

◇関連:とほほのCGIソフト集
http://www.tohoho-web.com/wwwsoft.htm

そういうわけで、必要に迫られてGD.pmでの画像連結をやってみました。CAPTCHA認証用の画像を作ったり、CGIで画像カウンターを作る際に必要になってくる技術ですね。

GDのオフィシャルサイトは下記のURLです。

◇関連:GD Graphics Library
http://www.boutell.com/gd/

参考にしたサイト記事は下記のURLです。

◇関連:GD.pm
http://www.agusa.nuie.nagoya-u.ac.jp/person/hironori/GD/GD.pm-j.html

◇関連:perlでテーブルアートhttp://blog.kumacchi.com/2007/06/perl_1.html

 

とりあえず、素直に二つの画像を連結する簡単なサンプルです。下記の二つの画像を連結してみました。

g1 g2

#!/usr/local/bin/perl
#
#参考ページ
#
#GD.pm
#http://www.agusa.nuie.nagoya-u.ac.jp/person/hironori/GD/GD.pm-j.html
#
#perlでテーブルアート – KUMA TYPE
#http://blog.kumacchi.com/2007/06/perl_1.html
#

use GD;

&test03();
exit(0);

#——————————————————————————
# test03
#——————————————————————————
sub test03{
my $imageorg1 = GD::Image->new(“g1.gif”);
my $w1 = $imageorg1->width;
my $h1 = $imageorg1->height;

my $imageorg2 = GD::Image->new(“g2.gif”);
my $w2 = $imageorg2->width;
my $h2 = $imageorg2->height;

my $im = new GD::Image(64*2,64);

#GD::Image::copy(sourceImage,dstX,dstY,srcX,srcY,width,height) object method
$im->copy($imageorg1, 0,0,0,0,64,64);
$im->copy($imageorg2,64,0,0,0,64,64);

print “Content-type: image/gif\n\n”;
# print “Content-type: image/png\n\n”;
binmode STDOUT;

print $im->gif;
# print $imageorg0->png;
exit(0);
}

※結果が↓これです。実際にCGIで出力しています。

◎解説

GD.pmの利用に関係する部分だけ簡単に解説します。

 

GIF画像「g1.gif」を読み込んでいます。

my $imageorg1 = GD::Image->new("g1.gif");

 

画像の幅と高さを取得しています。が、このサンプルプログラムでは取得しているだけで実際にこの値を何かに利用はしていません。

my $w1 = $imageorg1->width;
my $h1 = $imageorg1->height;

 

新規に幅128ピクセル、高さ64ピクセルの画像を作成しています。画像連結の際の土台となります。

my $im = new GD::Image(64*2,64);

 

新しく作成した画像の座標(0,0)に読み込んだ画像(合)を、コピーしています。

$im->copy($imageorg1, 0,0,0,0,64,64);

 

新しく作成した画像の座標(64,0)に読み込んだ画像(体)を、コピーしています。

$im->copy($imageorg2,64,0,0,0,64,64);

 

WEB上にGIF画像を表示する際のおまじない。

print "Content-type: image/gif\n\n";

 

標準出力をバイナリモードにする。

binmode STDOUT;

 

画像をGIFフォーマットで標準出力に出力

print $im->gif;

 

 

Perl/GNUソフトウェアによるWebグラフィックスプログラミング

タグ :