3.動的に生成した画像を出力しよう


HOME] [0章] [1章] [2章] [3章] [4章] [5章] [?章

(1)gdをインストールしよう

gdは、Thomas Boutell氏によるもので、 gif画像を動的に生成、入出力、操作するためのライブラリです。
C言語からはもちろん、Perlからもコールすることができます。 私の環境(FreeBSD2.2.5)では、全くスムースにインストールできました。 ソースコードは、 www.boutell.com/gd/ からダウンロードできます。
ホームディレクトリにダウンロードしたら、以下のようにインストール します。(私の環境での例ですから、環境によっては一部異なるでしょう)
% tar zxvf gd1.3.tar.gz
% mv gd1.3 gd
% cd gd
% make
このようにすれば、ユーザープログラムは、"gd/gd.h"をインクルード した上で、
% cc -o program.cgi program.c -Lgd -lgd -lm
という感じでコンパイルします。
gdの使い方は、上記のホームページに詳しいマニュアルがあります。

(2)gdで生成したイメージを出力してみよう

gdによるgifイメージの出力例を示します。



真ん中の黄色い楕円で囲まれた時間表示が動的に出力するgifの例です。 以下にコードの例を示します。



#include <stdio.h>
#include <string.h>
#include <time.h>

#include "gd/gd.h"
#include "gd/gdfontmb.h"

int main(){
        gdImagePtr im;
        FILE *out,*in;
        int black,yellow,blue;
        time_t t;
        char *s1;
        im=gdImageCreate(256,40);
        black=gdImageColorAllocate(im,0,0,0);
        yellow=gdImageColorAllocate(im,240,230,0);
        blue=gdImageColorAllocate(im,0,0,255);
        gdImageArc(im,128,20,220,38,0,360,yellow);
        gdImageFill(im,128,20,yellow);
        t=time(0);
        s1=ctime(&t);
        s1[24]=0;
        gdImageString(im,gdFontMediumBold,50,13,s1,blue);
        gdImageColorTransparent(im,black);
        printf("Content-type: image/gif\n\n");
        gdImageGif(im,stdout);
        fflush(stdout);
        gdImageDestroy(im);
}

gdで画像を生成するためには、gdImageCreate()でまず、空の画像を 作成します。gdColorAllocate()は、色を定義して、カラーテーブルに アローケートします。
この例では、gdImageArc()で弧(例では0〜360°まで指定して 楕円にしてある)を描いて、gdImageFill()で中を塗りつぶします。 そして、時間を表す文字列を書き込んでいますが、ctime()で生成される 文字列には最後に"\n\0"が付いてくるので、改行コードを消しています。
gdImageColorTransparent()は、透過gifを作成するために、 透過色のインデックスを指定します。
gdImageGif()でイメージを出力しますが、それに先立って、 ブラウザが画像を認識出来るようにMIMEヘッダを出力します。
最後にfflush()で出力をフラッシュして、gdImageDestroy()で 画像に割り当てられたメモリを返却します。

このCGIプログラムは、
% cc -o gdtest.cgi gdtest.c -Lgd -lgd -lm
とコンパイルして、HTMLから、
<IMG SRC="gdtest.cgi">
として、呼び出します。

Copyright 1999 Motoi Fujita