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 "";
これは、QUERY_STRING環 境変数がNULLでなければ、頭に"?"を付けた値を $queryに セットする式です。それでは、GDを使って指定された3原色をインラインGIFイメージで表示する CGIスクリプトを作って見ます。まず、初期ページを次のようなイメージにな るよう設計します。
インライン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;