ftp://isis.cshl.org/pub/gdまた、このライブラリを Perl5 で利用するためのパッケージモジュール GD.pm が以下のAnonymous FTPサーバから入手できます。
http://www-genome.wi.mit.edu/ftp/pub/software/WWW/GD.htmlここでは、手軽に利用できる Perl5 で GD.pm を利用する方法を説明します。
ftp://ftp.lab.kdd.co.jp/infosystems/misc/tools/GD.pm.tar.Z
次に Perl 5 をインストールします。Perl 5 は以下のサイトから入手できま す。
ftp://ftp.lab.kdd.co.jp/lang/perl/CPAN/src/5.0/Perl5 を展開したら、付属のConfigureプログラムを実行し、質問に答 えていきます。最終的に Config.h と Makefile が生成されるので、 makeと実行し、コンパイルします。正常にコンパイルが終れば、イン ストール("make install")を行います。
% gunzip -c perl5.001.tar.gz | tar xf - % cd perl5.001 % ./Configure : % make % make install
次にGD.pm のインストールです。GD.pm は Perl 5 が static ライブラリを使 用している場合と共有ライブラリを使用している場合とでは、インストール方 法が異なります。static ライブラリの場合には、$PERL5/ext/ の下に GD ラ イブラリを置いて、Perl 5 を作成するときと同じようにコンパイルしなけれ ばなりません。そのため、予めわかっていれば、GD.pm を埋め込んでおいた方 がいいでしょう。共有ライブラリの場合は、$PERL5/ext に GD.pm を展開して 置いて、perl5 Makefile.PL を実行し、make 、make install を行います。
% cd perl5.001/ext/GD % perl5 Makefile.PL % make % make install
インストールが完了したら、最後に付属のデモスクリプトを実行します。
demos/skkskdl.pl | xv -正常に画面が Xウィンドウ上に表示されれば、インストールが完了です。
GD.pm では3つのクラスが定義されています。
- GD::Image
- イメージの作成を行うクラスです
- GD::Font
- フォント、テキストの作成を行うクラスです
- GD::Polygon
- ポリゴンを作成するクラスです
(例)
$img = new GD::Image(100,100) || die "not create image";
(例)
open (GIF, "foo.gif") || die "Not open";
$img = newFromGIF GD::Image(GIF) || die;
close GIF;
(例)
$black = $img->colorAllocate(0,0,0); # 黒
$white = $img->colorAllocate(255,255,255); # 白
$gray = $img->colorAllocate(127,127,127); # 灰色
(例)
$img->colorDeallocate($gray);
$gray = $img->colorAllocate(255,127,127);
(例)
$apricot = $img->colorClosest(255,200,180);
(例)
$rosey = $img->colorExact(255,100,80);
warn "Everything's coming up roses.\n" if $rosey >= 0;
(例)
$colorindex = $img->getPixel(20,100);
($r,$g,$b) = $img->rgb($colorindex);
(例)
@RGB = $img->rgb($gray);
(例)
open (GIF, "test.gif");
$im = newFromGif GD::Image(GIF);
$white = $im->colorClosest(255,255,255); #白をみつけます
$im->transparent($white);
print $im->gif;
(例)
$img->line(0,0,150,150,gdBrushed);
(例)
$img->rectangle(10,10,150,150,$rose);

#!/usr/bin/perl
# gd.pm を使用する宣言です。
use GD;
# 200×100ピクセルの新しいイメージを作成します。
$im = new GD::Image(200,100);
# ここで使用する色を割り当てます。
$white = $im-<colorAllocate(255,255,255);
$black = $im-<colorAllocate(0,0,0);
$red = $im-<colorAllocate(255,0,0);
$blue = $im-<colorAllocate(0,0,255);
$yellow = $im-<colorAllocate(255,255,0);
# 透明化する色とインタレース化を指定します
$im-<transparent($white);
$im-<interlaced('true');
# 黒枠の四角をおきます。
$im-<rectangle(10,10,190,190,$black);
# 青枠の楕円をおきます。
$im-<arc(50,50,95,75,0,360,$blue);
# 四角を黄色に楕円を赤で埋めます。
$im-<fill(50,50,$red);
$im-<fill(100,50,$red);
# GIF を標準出力します。
print $im-<gif;
#!/usr/bin/perl (入力処理) (データ処理) print "Content-type: image/gif\n\n"; (GIFを標準出力)
インラインイメージを出力する場合、<IMG>タグを使わなけれ ばなりません。<IMG>タグにおけるSRC属性部にURL が指定できるので、このURLにCGIスクリプトを指定することによって、この CGIスクリプトの出力がインラインイメージとなります。
<IMG SRC="/cgi-bin/on-the-fly-gif.cgi">これだけでは、ユーザからの要求を反映しないGIFの出力となります。そのた め、CGIスクリプトに何らかの引数を最初に与えてあげれば、ユーザからの要 求に反映したGIFを出力にすることができます。
<IMG SRC="/cgi-bin/on-the-fly-gif.cgi?argv1=m&argv2=n">そして引数をフォーム形式で入力させるために、次のように処理させればよい ことがわかります。
<FORM ACTION="/cgi-bin/cgi-script" METHOD=GET> <INPUT TYPE="text" NAME="NAME1" VALUE="VALUE1"><BR> <INPUT TYPE="text" NAME="NAME2" VALUE="VALUE2"><BR> <INPUT TYPE="submit"><P> <IMG SRC="/cgi-bin/on-the-fly-gif.cgi$query"> </FORM>
最初の/cgi-bin/cgi-script は、ページを作るCGIスクリプトです。 /cgi-bin/on-the-fly-gif.cgi$queryは、インラインイメージを作成 するCGIスクリプトで、フォームで入力した値を引数($query)にして います。この$queryはスクリプトの一番最初に予め読み込んでおく ことが重要です。引数を渡しやすいように、METHODを GETとしてお きます。
$query = "?".$ENV{'QUERY_STRING'} if $ENV{'QUERY_STRING'} ne "";
それでは、GDを使って指定された3原色をインラインGIFイメージで表示する CGIスクリプトを作って見ます。まず、初期ページを次のようなイメージにな るよう設計します。これは、QUERY_STRING環 境変数がNULLでなければ、頭に"?"を付けた値を $queryに セットする式です。

インラインGIFイメージを作成するため、初期ページもCGIの中で作らなければ なりません。そこで、初期ページを作るためのCGIスクリプトです。
#!/usr/bin/perl
print "Content-type: text/html\n\n";
# 初期値読み
$query = "?".$ENV{'QUERY_STRING'} if $ENV{'QUERY_STRING'} ne "";
# Get FORM data ...
%form = &read_input;
$bred=&decimal($form{'bred'});
$bgreen=&decimal($form{'bgreen'});
$bblue=&decimal($form{'bblue'});
$tred=&decimal($form{'tred'});
$tgreen=&decimal($form{'tgreen'});
$tblue=&decimal($form{'tblue'});
print <<EOD;
<HEAD>
<TITLE>Autocreate Color Table</TITLE>
</HEAD>
<BODY>
<H1>Automate color GIF image</H1>
<HR>
<FORM ACTION="/cgi-bin/colors.cgi" METHOD="GET">
<H3>Background Color (Decimal 0-255)</H3>
Red <INPUT TYPE="text" NAME="bred" SIZE=3 MAXLENGTH=3 VALUE="$bred">
Gree <INPUT TYPE="text" NAME="bgreen" SIZE=3 MAXLENGTH=3 VALUE="$bgreen">
Blue <INPUT TYPE="text" NAME="bblue" SIZE=3 MAXLENGTH=3 VALUE="$bblue">
<H3>Text Color (Decimal 0-255)</H3>
Red <INPUT TYPE="text" NAME="tred" SIZE=3 MAXLENGTH=3 VALUE="$tred">
Gree <INPUT TYPE="text" NAME="tgreen" SIZE=3 MAXLENGTH=3 VALUE="$tgreen">
Blue <INPUT TYPE="text" NAME="tblue" SIZE=3 MAXLENGTH=3 VALUE="$tblue"<<P>
<INPUT TYPE="submit">
</FORM>
<P>
<IMG SRC="/cgi-bin/colors_gif.cgi$query">
</BODY>
EOD
#
sub read_input
{
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else
{
$buffer = $ENV{'QUERY_STRING'};
}
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
%FORM;
}
# 0〜255までの整数が有効
sub decimal
{
local($cr)=@_;
$icr=int($cr); # 整数化
if (0 <= $icr && $icr < 256) {
return $icr;
}
else {
return 255;
}
}
次にインラインGIFを作る部分のCGIスクリプトです。
#!/usr/bin/perl
use GD;
# 初期値読み
%form = &read_input;
print "Content-type: image/gif\n\n";
$bred=$form{'bred'} if defined( $form{'bred'} );
$bgreen=$form{'bgreen'} if defined( $form{'bgreen'} );
$bblue=$form{'bblue'} if defined( $form{'bblue'} );
$tred=$form{'tred'} if defined( $form{'tred'} );
$tgreen=$form{'tgreen'} if defined( $form{'tgreen'} );
$tblue=$form{'tblue'} if defined( $form{'tblue'} );
# create a new image
$im = new GD::Image(500,30);
# aloocate some colors
$bcolorbox=$im->colorAllocate($bred,$bgreen,$bblue);
$tcolorbox=$im->colorAllocate($tred,$tgreen,$tblue);
$im->interlaced('true');
# Draw rectangle
$im->rectangle(0,0,499,29,$colorbox);
# Draw Text
$im->string(gdLargeFont,100,10,"ABCDEFGHIJKLMNOPQRSTUVWXYZ",$tcolorbox);
print $im->gif;
#
sub read_input
{
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else
{
$buffer = $ENV{'QUERY_STRING'};
}
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
%FORM;
}
これで完成です。そして、このページを呼ぶポイントで初期値を引数として渡 すように設定しておきます。
<A HREF="/cgi-bin/colors.cgi?bred=255&bgreen=255&bblue=255& tred=0&tgreen=0&tblue=0">オンザフライGIF</A>スクリプトのテスト
GNUPlot を使って GIF On the Fly を作成するCGIスクリプトをPerl で作成す る場合、次の点に注意します。
#!/usr/bin/perl # Filename: nph-plot.cgi $GNUPLOT = '/usr/local/bin/gnuplot'; $PPMTOGIF = '/usr/X11R6/bin/ppmtogif'; $|=1; print "HTTP/1.0 200 Okay\n"; print "Content-type: image/gif\n\n"; open (GRAPH,"| $GNUPLOT | $PPMTOGIF") || die ; print GRAPH <<END; set term pbm color plot sin(x) END close GRAPH;