Boutell.Com, Inc. のホームページ へ
クレジットとライセンスについて
以下の著作権表示は、gd ライブラリの著作権者についての問題を可能なかぎり回避するために、 表示されるべき著作権者をすべて網羅しています。 さらに、特許が問題となり、取り除かれてしまいましたが、 gd が、最近まで使っていた LZW による GIF 圧縮のコードに対して David Rowley に感謝します。 この著作権表示について問題点を見つけた場合は、 Thomas Boutellまで、 お知らせくださいますようにお願いします。 よろこんで訂正します。
著作権表示は以下のとおり
Portions copyright 1994, 1995, 1996, 1997, 1998, by Cold Spring Harbor Laboratory. Funded under Grant P41-RR02188 by the National Institutes of Health.Portions copyright 1996, 1997, 1998, by Boutell.Com, Inc.
GIF decompression code copyright 1990, 1991, 1993, by David Koblas (koblas@netcom.com).
Non-LZW-based GIF compression code copyright 1998, by Hutchison Avenue Software Corporation (http://www.hasc.com/, info@hasc.com).
この表示を、ユーザーが見る事のできる、 サポーティングドキュメンテーションの中に記載する事により、 商業的アプリケーションも含めた、あらゆる gd の複製と再配布が認められます。
これは、あなたの作成した2次的著作物自体の権利に影響をおよぼすものではありませんし、 gd の著作権者についての正確なクレジットを表記する事が目的であって、 gd の生産的な利用を妨げる事ではありません。 疑問点があれば、お問いあわせください。 「2次的著作物」とは、このライブラリを利用したあらゆるプログラムを含みます。 ユーザーが見る事のできるサポーティングドキュメンテーションに クレジットが記載されていなければなりません。
すべての複製と、 そのサポーティングドキュメンテーションに、著作権についての表記と、 この使用条件についての表記が、なされていることを条件に、 このソフトウェアとドキュメンテーションの、 あらゆる使用、複製、改変、再配布が、無償で認められます。 このソフトウェアは、 "あるがまま(as is)" であり、 明示、暗黙を問わず、一切の保証がなされません。
以上
gd は、グラフィックスライブラリです。 あなたのプログラムによって、 直線、円弧、文字、いろんな色、他の画像からのカット&ペースト、 塗りつぶし、などによって、すばやく画像を作成し、 .GIF ファイルとして出力します。 .GIF をインラインイメージとして使うアプリケーションで、特に有用です。
gd は、お絵描き用のプログラムではありません。 お絵描き用のプログラムを探しているのなら見当ちがいですし、 あなたがプログラマーでないのならば見当ちがいです。
gd はすべての魅力的なグラフィック操作のために公開されているものではありません。 gd は台所の流し台のグラフィックパッケージ (訳注: a kitchen-sink graphics package うーむ、慣用句なのかな? どういう意味なんでしょ?) になる必要はないし、そのつもりはありません。 version 1.3 では、8bit の 2次元のパッケージとして、 一般的に必要とされる機能を具体化しています。 スケーラブルフォント、自然色、JPEG と PNG のサポートは、version 2.0 として計画されています。 Version 1.3 は、長い間続いていた bug の修正と、 LZW ではない GIF 圧縮法を提供するために公開されました。
これらのパッケージは、gd 1.2 に基づいていますが、 わずかな修正によって gd 1.3 とも互換がとれると思われます。
1.3 の変更点
Version 1.3 は、以下のような点が変更されています。
gd を使うためには、ANSI C コンパイラが必要です。 Windows 95/NT のすべてのポピュラーな C コンパイラーは ANSI C に準拠しています。 ANSI 完全準拠の C コンパイラであれば、問題ないとおもわれます。 SunOS 4.1.3についてくる cc コンパイラは ANSI C コンパイラではありません。 gcc をまだ入手していない Unix ユーザーは、入手してください。 gcc は ANSI 準拠の無償の C コンパイラとして、事実上の標準になっています。 なぜ、gcc がないのかをインターネットサービスプロバイダへ尋ねてください。
結果を確認するために、GIF ビューワーも必要です。(訳注:中略)
gd をインストールするには、最初にダウンロードしてきたアーカイブを展開する必要があります。
tar
と gunzip
(Unix) または ZIP
(Windows)
を知らない場合には、そのシステムでの経験を積んだユーザーに相談してください。
残念ながら、そうした基本的な技術についての質問には、当方では、お答えする事ができません。
(訳注:"gunzip gd1.3.tar.gz" してから "tar -xf gd1.3.tar")
アーカイブを展開すると "gd1.3" というディレクトリが作成されます。
cd
で gd1.3 ディレクトリに移り、Makefile を見てみる事、
おそらく、使用するオペレーティングシステムと、使い方によって、
多少の変更をする必要があると思われます。
さて、つぎに、デモンストレーションプログラムを生成します。 コマンドラインからならば "make gddemo" とタイプするだけです (訳注:中略) うまくいけば、問題なく "gddemo" がコンパイル、リンクされます。 使用するシステムによって、Makefile を修正する必要があります。 使用しているシステムでのコンパイル、リンクなどの基本的なテクニックについては、 自分で解決する事。
これで、gd のデモンストレーションプログラムの生成が終了しました。 動作を確認するため "gddemo" とタイプします。 (訳注:Unix では "./gddemo" の方が無難です。)
gddemo は、指定しない場合には、demoout.gif を作成します。 (注記、demoin.gif というファイルが、 デモンストレーション用として同梱で供給されています。)
GIF ビューワで demoout.gif を表示して見てください。 128x128 ピクセルのスペースシャトルのイメージに、 いろんなグラフィカルな要素が上書きされていまよね。
(もしも demoin.gif ファイルがなくなっていれば、なにか他のものが表れています。)
demoin.gif をみてください、 スペースシャトルの元のイメージが、 調整され、出力イメージへ複写されています。
gd 基礎: gd の使用方法
gd は動的に GIF イメージを作り出します。
gd をプログラムで使うためには、gd.h を include し、
Unix上では "make libgd.a" によって作成された libgd.a
ライブラリをリンクします。
他のオペレーティングシステムでは gd.c を project に追加してください。
提供されているフォントを使う場合には、 gdfontt.h, gdfonts.h, gdfontmb.h, gdfontl.h の4つ、 または gdfontg.h を含めて5つのファイルをインクルードします。 あるいは、gdfontg.h だけをインクルードします。 提供されている Makefile やライブラリによる方法ではなく、 ソースを直接、独自のプロジェクトへ組み込む事もできます。 (16-bit メモリーモデルの DOS や Windows には、大きすぎると思われます。)
短いプログラム例 (より高度な例は、配布に含まれている gddemo.c を参照してださい。 gddemo.c は、より高度な機能のデモンストレーションです!)
/* gd ライブラリ機能を使う指定 */ #include "gd.h" /* standard I/O を使う指定。作成した GIF をファイルに出力するので。 */ #include <stdio.h> int main() { /* イメージを宣言 */ gdImagePtr im; /* 出力ファイルの宣言 */ FILE *out; /* カラーインデックスの宣言 */ int black; int white; /* イメージを確保する: 64 x 64 ピクセル */ im = gdImageCreate(64, 64); /* カラー black の宣言(red, green, blue すべて最小値)。 これによって、新しいイメージの背景色となる最初の色が決まる。 */ black = gdImageColorAllocate(im, 0, 0, 0); /* カラー white の宣言(red, green, blue すべて最大値) */ white = gdImageColorAllocate(im, 255, 255, 255); /* カラー white をつかって、左上から右下へ線を描く */ gdImageLine(im, 0, 0, 63, 63, white); /* ファイルを出力用に Open. "wb" は "write binary" を意味する。 MSDOS 上では重要な意味を持つが、Unix 上では意味を持たない。 */ out = fopen("test.gif", "wb"); /* イメージをディスクファイルに出力する。 */ gdImageGif(im, out); /* ファイルを Close */ fclose(out); /* メモリー上のイメージを破棄 */ gdImageDestroy(im); }実行時に、このプログラムは、1つのイメージを作成し、 2つのカラー割り当て (最初のカラーは背景色となる)、 1本の対角線を引く (0, 0 は左上の隅)、 GIF ファイルへイメージを書き出し、 イメージを破棄しています。
上の例のプログラムによって、 パッケージがどんな仕事をするのか、大体の感じをつかんでください。 gd は、以下のリファレンスで、 それぞれコードの断片を示し、列挙したように、 さまざまの付加的な機能を提供しています。 アルファベット順のインデックス も提供しています。
webgif.c は同梱して配布されています。 Unix ユーザーは "make webgif" とタイプするだけでコンパイルする事ができます。 "webgif" と引数なしで起動すると有効なオプションを表示します。 (訳注:Unix では "./webgif" の方が無難です。)
gdImage
(TYPE)
sx
(X 方向のサイズ),
sy
(y 方向のサイズ),
colorsTotal
(色数の合計),
red
(red カラー要素; 0 から 255 までの値の 256 の整数のならびである),
green
(green カラー要素、同様です)、
blue
(blue カラー要素、同様です)、
透過(transparent)
(透過するカラーのインデックス、設定されてない時は -1)
が参照できるが、
直接参照せずに、提供されているマクロを使用する事。
また、メンバーを直接設定しないで、提供されている関数を使用する事。
typedef struct { unsigned char ** pixels; int sx; int sy; int colorsTotal; int red[gdMaxColors]; int green[gdMaxColors]; int blue[gdMaxColors]; int open[gdMaxColors]; int transparent; } gdImage;
typedef struct { /* フォント内の文字数 */ int nchars; /* ナンバーを振られる最初の文字... (普通は 32 = space) */ int offset; /* 文字の幅と高さ */ int w; int h; /* フォントデータ; 文字の並び、一列づつ順に並べる。 プログラム内で記述してもよいが、 データファイルからロードしてもよい。*/ char *data; } gdFont;
typedef struct { int x, y; } gdPoint, *gdPointPtr;
... 関数の中で ... gdImagePtr im; im = gdImageCreate(64, 64); /* ... イメージを使う ... */ gdImageDestroy(im);
gdImagePtr im; ... 関数の中で ... FILE *in; in = fopen("mygif.gif", "rb"); im = gdImageCreateFromGif(in); fclose(in); /* ... イメージを使う ... */ gdImageDestroy(im);
... 関数の中で ... gdImagePtr im; FILE *in; in = fopen("mygd.gd", "rb"); im = gdImageCreateFromGd(in); fclose(in); /* ... イメージを使う ... */ gdImageDestroy(im);
... 関数の中で ... gdImagePtr im; FILE *in; in = fopen("myxbm.xbm", "rb"); im = gdImageCreateFromXbm(in); fclose(in); /* ... イメージを使う ... */ gdImageDestroy(im);
... 関数の中で ... gdImagePtr im; im = gdImageCreate(10, 10); /* ... イメージを使う ... */ /* ここでメモリーを開放! */ gdImageDestroy(im);
... 関数の中で ... gdImagePtr im; int black, white; FILE *out; /* イメージの作成 */ im = gdImageCreate(100, 100); /* 背景色の割り当て(最初の割り当て) */ white = gdImageColorAllocate(im, 255, 255, 255); /* 描画色の割り当て */ black = gdImageColorAllocate(im, 0, 0, 0); /* 長方形を描く */ gdImageRectangle(im, 0, 0, 99, 99, black); /* 出力ファイルをバイナリーモードでオープン */ out = fopen("rect.gif", "wb"); /* GIF を書く */ gdImageGif(im, out); /* ファイルをクローズ */ fclose(out); /* イメージを破棄 */ gdImageDestroy(im);
gd イメージフォーマットは、他のイメージを作る時に、 頻繁に必要とされるイメージを高速に読み書きすることを目的としている。 圧縮されていないフォーマットであり、 一般的に使用される事を意図していない。
... 関数の中で ... gdImagePtr im; int black, white; FILE *out; /* イメージの作成 */ im = gdImageCreate(100, 100); /* 背景色の割り当て(最初の割り当て) */ white = gdImageColorAllocate(im, 255, 255, 255); /* 描画色の割り当て */ black = gdImageColorAllocate(im, 0, 0, 0); /* 長方形を描く */ gdImageRectangle(im, 0, 0, 99, 99, black); /* 出力ファイルをバイナリーモードでオープン */ out = fopen("rect.gd", "wb"); /* GIF を書く */ gdImageGd(im, out); /* ファイルをクローズ */ fclose(out); /* イメージを破棄 */ gdImageDestroy(im);
... 関数の中で ... gdImagePtr im; int black; int white; im = gdImageCreate(100, 100); /* 背景色の割り当て(最初の割り当て) */ black = gdImageColorAllocate(im, 0, 0, 0); /* カラー white の割り当て(red, green, blue すべて最大値) */ white = gdImageColorAllocate(im, 255, 255, 255); /* まんなかあたりに1ピクセルを描く */ gdImageSetPixel(im, 50, 50, white); /* ... イメージに何らかの操作をする。ファイルにセーブするなど... */ /* イメージを破棄 */ gdImageDestroy(im);
... 関数の中で ... gdImagePtr im; int black; int white; im = gdImageCreate(100, 100); /* 背景色の割り当て(最初の割り当て) */ black = gdImageColorAllocate(im, 0, 0, 0); /* カラー white の割り当て(red, green, blue すべて最大値) */ white = gdImageColorAllocate(im, 255, 255, 255); /* 左上隅から右下隅まで直線を描く */ gdImageLine(im, 0, 0, 99, 99, white); /* ... イメージに何らかの操作をする。ファイルにセーブするなど... */ /* イメージを破棄 */ gdImageDestroy(im);
gdImageDashedLine は、2点間(x1,y1 と x2, y2)に破線を描くために使用される。 破線は、指定されたカラーインデックスによって描かれる。 線の描かれない部分は、そのまま残されるので、背景のままとなる。
... 関数の中で ... gdImagePtr im; int black; int white; im = gdImageCreate(100, 100); /* 背景色の割り当て(最初の割り当て) */ black = gdImageColorAllocate(im, 0, 0, 0); /* カラー white の割り当て(red, green, blue すべて最大値) */ white = gdImageColorAllocate(im, 255, 255, 255); /* 左上隅から右下隅まで破線を描く */ gdImageDashedLine(im, 0, 0, 99, 99); /* ... イメージに何らかの操作をする。ファイルにセーブするなど... */ /* イメージを破棄 */ gdImageDestroy(im);
... 関数の中で ... gdImagePtr im; int black; int white; /* 多角形の頂点 */ gdPoint points[3]; im = gdImageCreate(100, 100); /* 背景色の割り当て(最初の割り当て) */ black = gdImageColorAllocate(im, 0, 0, 0); /* カラー white の割り当て(red, green, blue すべて最大値) */ white = gdImageColorAllocate(im, 255, 255, 255); /* 3角形を描く */ points[0].x = 50; points[0].y = 0; points[1].x = 99; points[1].y = 99; points[2].x = 0; points[2].y = 99; gdImagePolygon(im, points, 3, white); /* ... イメージに何らかの操作をする。ファイルにセーブするなど... */ /* イメージを破棄 */ gdImageDestroy(im);
... 関数の中で ... gdImagePtr im; int black; int white; im = gdImageCreate(100, 100); /* 背景色の割り当て(最初の割り当て) */ black = gdImageColorAllocate(im, 0, 0, 0); /* カラー white の割り当て(red, green, blue すべて最大値) */ white = gdImageColorAllocate(im, 255, 255, 255); /* まんなかあたりに長方形を描く */ gdImageRectangle(im, 25, 25, 74, 74, white); /* ... イメージに何らかの操作をする。ファイルにセーブするなど... */ /* イメージを破棄 */ gdImageDestroy(im);
... 関数の中で ... gdImagePtr im; int black; int white; int red; /* 多角形の頂点 */ gdPoint points[3]; im = gdImageCreate(100, 100); /* 背景色の割り当て(最初の割り当て) */ black = gdImageColorAllocate(im, 0, 0, 0); /* カラー white の割り当て(red, green, blue すべて最大値) */ white = gdImageColorAllocate(im, 255, 255, 255); /* カラー red の割り当て */ red = gdImageColorAllocate(im, 255, 0, 0); /* 3角形を描く */ points[0].x = 50; points[0].y = 0; points[1].x = 99; points[1].y = 99; points[2].x = 0; points[2].y = 99; /* white で塗りつぶす */ gdImageFilledPolygon(im, points, 3, white); /* 輪郭を red で描く(塗りつぶし後に輪郭を描く事に注意) */ gdImagePolygon(im, points, 3, red); /* ... イメージに何らかの操作をする。ファイルにセーブするなど... */ /* イメージを破棄 */ gdImageDestroy(im);
... 関数の中で ... gdImagePtr im; int black; int white; im = gdImageCreate(100, 100); /* 背景色の割り当て(最初の割り当て) */ black = gdImageColorAllocate(im, 0, 0, 0); /* カラー white の割り当て(red, green, blue すべて最大値) */ white = int gdImageColorAllocate(im, 255, 255, 255); /* まんなかあたりに塗りつぶされた長方形を描く */ gdImageFilledRectangle(im, 25, 25, 74, 74, white); /* ... イメージに何らかの操作をする。ファイルにセーブするなど... */ /* イメージを破棄 */ gdImageDestroy(im);
s
と
終点 e
で指定される。
円は、
幅と高さを同じにし、
0度を始点とし、360度を終点とする事で描かれる。
終点 e
は、
始点 s
よりも大きくなくてはならない。
360度を超える値は、360 の剰余として処理される。
... 関数の中で ... gdImagePtr im; int black; int white; im = gdImageCreate(100, 50); /* 背景色の割り当て(最初の割り当て) */ black = gdImageColorAllocate(im, 0, 0, 0); /* カラー white の割り当て(red, green, blue すべて最大値) */ white = gdImageColorAllocate(im, 255, 255, 255); /* だ円を描く */ gdImageArc(im, 50, 25, 98, 48, 0, 360, white); /* ... イメージに何らかの操作をする。ファイルにセーブするなど... */ /* イメージを破棄 */ gdImageDestroy(im);
color
で指定された色で塗りつぶす、
指定された点から開始し border
で指定された色で終了する。
始点の色と同じ色の部分を塗つぶす方法については、
gdImageFill を参照の事。
境界の色は、gdTiled のような特別な色 は使えない。 普通の色でなくてはならない。 塗つぶす色には、特別な色が指定できる。
注:gdImageFillToBorder は再帰的に処理される。 これは、最も容易な実現方法ではなく、 この実現方法は改良されることが望まれる。 しかし、 スタックが非常に深くなることが可能な場合には、改悪となるだろう。 これは MSDOS と MS Windows 環境での問題である。 (もちろん、適切なスタックがある Unix や NT 環境では、まったく問題ない。)
... 関数の中で ... gdImagePtr im; int black; int white; int red; im = gdImageCreate(100, 50); /* 背景色の割り当て(最初の割り当て) */ black = gdImageColorAllocate(im, 0, 0, 0); /* カラー white の割り当て(red, green, blue すべて最大値) */ white = gdImageColorAllocate(im, 255, 255, 255); /* カラー red の割り当て */ red = gdImageColorAllocate(im, 255, 0, 0); /* だ円を描く */ gdImageArc(im, 50, 25, 98, 48, 0, 360, white); /* だ円の外側を塗りつぶす。 red で塗りつぶす、境界の色は、white (だ円) */ /* (訳注:だ円の内側を塗りつぶすということで、下の x,y が 50,25 だと分かりやすい気がするのですが?) */ gdImageFillToBorder(im, 50, 50, white, red); /* ... イメージに何らかの操作をする。ファイルにセーブするなど... */ /* イメージを破棄 */ gdImageDestroy(im);
color
で指定された色で塗りつぶす、
指定された点から開始し、始点と同じ色の領域を塗りつぶす。
指定された色の境界の内部を塗つぶす方法については、
gdImageFillToBorder
を参照の事。
The fill color can be gdTiled, resulting in a tile fill using another image as the tile. However, the tile image cannot be transparent. If the image you wish to fill with has a transparent color index, call gdImageTransparent on the tile image and set the transparent color index to -1 to turn off its transparency.
注:gdImageFill は再帰的に処理される。 これは、最も容易な実現方法ではなく、 この実現方法は改良されることが望まれる。 しかし、 スタックが非常に深くなることが可能な場合には、改悪となるだろう。 これは MSDOS と MS Windows 環境での問題である。 (もちろん、適切なスタックがある Unix や NT 環境では、まったく問題ない。)
... 関数の中で ... gdImagePtr im; int black; int white; int red; im = gdImageCreate(100, 50); /* 背景色の割り当て(最初の割り当て) */ black = gdImageColorAllocate(im, 0, 0, 0); /* カラー white の割り当て(red, green, blue すべて最大値) */ white = gdImageColorAllocate(im, 255, 255, 255); /* カラー red の割り当て */ red = gdImageColorAllocate(im, 255, 0, 0); /* だ円を描く */ gdImageArc(im, 50, 25, 98, 48, 0, 360, white); /* だ円の外側を red で塗りつぶす、背景色の black の部分が塗つぶされる。 */ /* (訳注:だ円の内側を塗りつぶすということで、下の x,y が 50,25 だと分かりやすい気がするのですが?) */ gdImageFill(im, 50, 50, red); /* ... イメージに何らかの操作をする。ファイルにセーブするなど... */ /* イメージを破棄 */ gdImageDestroy(im);
gdImageSetBrush is used to specify the brush to be used in a particular image. You can set any image to be the brush. If the brush image does not have the same color map as the first image, any colors missing from the first image will be allocated. If not enough colors can be allocated, the closest colors already available will be used. This allows arbitrary GIFs to be used as brush images. It also means, however, that you should not set a brush unless you will actually use it; if you set a rapid succession of different brush images, you can quickly fill your color map, and the results will not be optimal.
You need not take any special action when you are finished with a brush. As for any other image, if you will not be using the brush image for any further purpose, you should call gdImageDestroy. You must not use the color gdBrushed if the current brush has been destroyed; you can of course set a new brush to replace it.
... 関数の中で ... gdImagePtr im, brush; FILE *in; int black; im = gdImageCreate(100, 100); /* Open the brush GIF. For best results, portions of the brush that should be transparent (ie, not part of the brush shape) should have the transparent color index. */ in = fopen("star.gif", "rb"); brush = gdImageCreateFromGif(in); /* 背景色の割り当て(最初の割り当て) */ black = gdImageColorAllocate(im, 0, 0, 0); gdImageSetBrush(im, brush); /* ブラシをつかって左上から右下へ直線を描く */ gdImageLine(im, 0, 0, 99, 99, gdBrushed); /* ... イメージに何らかの操作をする。ファイルにセーブするなど... */ /* イメージを破棄 */ gdImageDestroy(im); /* ブラシのイメージを破棄 */ gdImageDestroy(brush);
gdImageSetTile is used to specify the tile to be used in a particular image. You can set any image to be the tile. If the tile image does not have the same color map as the first image, any colors missing from the first image will be allocated. If not enough colors can be allocated, the closest colors already available will be used. This allows arbitrary GIFs to be used as tile images. It also means, however, that you should not set a tile unless you will actually use it; if you set a rapid succession of different tile images, you can quickly fill your color map, and the results will not be optimal.
You need not take any special action when you are finished with a tile. As for any other image, if you will not be using the tile image for any further purpose, you should call gdImageDestroy. You must not use the color gdTiled if the current tile has been destroyed; you can of course set a new tile to replace it.
... 関数の中で ... gdImagePtr im, tile; FILE *in; int black; im = gdImageCreate(100, 100); /* Open the tile GIF. For best results, portions of the tile that should be transparent (ie, allowing the background to shine through) should have the transparent color index. */ in = fopen("star.gif", "rb"); tile = gdImageCreateFromGif(in); /* 背景色の割り当て(最初の割り当て) */ black = gdImageColorAllocate(im, 0, 0, 0); gdImageSetTile(im, tile); /* タイルをつかって範囲を充たす */ gdImageFilledRectangle(im, 25, 25, 75, 75, gdTiled); /* ... イメージに何らかの操作をする。ファイルにセーブするなど... */ /* イメージを破棄 */ gdImageDestroy(im); /* タイルのイメージを破棄 */ gdImageDestroy(tile);
To use gdImageSetStyle, create an array of integers and assign them the desired series of color values to be repeated. You can assign the special color value gdTransparent to indicate that the existing color should be left unchanged for that particular pixel (allowing a dashed line to be attractively drawn over an existing image).
Then, to draw a line using the style, use the normal gdImageLine function with the special color value gdStyled.
As of version 1.1.1, the style array is copied when you set the style, so you need not be concerned with keeping the array around indefinitely. This should not break existing code that assumes styles are not copied.
You can also combine styles and brushes to draw the brush image at intervals instead of in a continuous stroke. When creating a style for use with a brush, the style values are interpreted differently: zero (0) indicates pixels at which the brush should not be drawn, while one (1) indicates pixels at which the brush should be drawn. To draw a styled, brushed line, you must use the special color value gdStyledBrushed. For an example of this feature in use, see gddemo.c (provided in the distribution).
gdImagePtr im; int styleDotted[2], styleDashed[6]; FILE *in; int black; int red; im = gdImageCreate(100, 100); /* 背景色の割り当て(最初の割り当て) */ black = gdImageColorAllocate(im, 0, 0, 0); red = gdImageColorAllocate(im, 255, 0, 0); /* 点線を定義する。1ピクセル毎の点線. */ styleDotted[0] = red; styleDotted[1] = gdTransparent; /* 破線を定義する。3ピクセルは描かれ、3ピクセルが描かれない。 */ styleDashed[0] = red; styleDashed[1] = red; styleDashed[2] = red; styleDashed[3] = gdTransparent; styleDashed[4] = gdTransparent; styleDashed[5] = gdTransparent; /* 点線を設定する。そのスタイルのピクセル数に注意すること! */ gdImageSetStyle(im, styleDotted, 2); /* 左上の隅から右下の隅まで、線を描く。 */ gdImageLine(im, 0, 0, 99, 99, gdStyled); /* こんどは、破線。 */ gdImageSetStyle(im, styleDashed, 6); gdImageLine(im, 0, 99, 0, 99, gdStyled); /* ... イメージに何らかの操作をする。ファイルにセーブするなど... */ /* イメージを破棄 */ gdImageDestroy(im);
... 関数の中で ... FILE *in; gdImagePtr im; int c; in = fopen("mygif.gif", "rb"); im = gdImageCreateFromGif(in); fclose(in); c = gdImageGetPixel(im, gdImageSX(im) / 2, gdImageSY(im) / 2); printf("The value of the center pixel is %d; RGB values are %d,%d,%d\n", c, im->red[c], im->green[c], im->blue[c]); gdImageDestroy(im);
... 関数の中で ... gdImagePtr im; int black; int white; im = gdImageCreate(100, 100); if (gdImageBoundsSafe(im, 50, 50)) { printf("50, 50 is within the image bounds\n"); } else { printf("50, 50 is outside the image bounds\n"); } gdImageDestroy(im);
#include "gd.h" #include "gdfontl.h" ... 関数の中で ... gdImagePtr im; int black; int white; im = gdImageCreate(100, 100); /* 背景色の割り当て(最初の割り当て) */ black = gdImageColorAllocate(im, 0, 0, 0); /* カラー white の割り当て(red, green, blue すべて最大値) */ white = gdImageColorAllocate(im, 255, 255, 255); /* 1文字書き込む */ gdImageChar(im, gdFontLarge, 0, 0, 'Q', white); /* ... イメージに何らかの操作をする。ファイルにセーブするなど... */ /* イメージを破棄 */ gdImageDestroy(im);
#include "gd.h" #include "gdfontl.h" ... 関数の中で ... gdImagePtr im; int black; int white; im = gdImageCreate(100, 100); /* 背景色の割り当て(最初の割り当て) */ black = gdImageColorAllocate(im, 0, 0, 0); /* カラー white の割り当て(red, green, blue すべて最大値) */ white = gdImageColorAllocate(im, 255, 255, 255); /* Draw a character upwards so it rests against the top of the image. */ gdImageCharUp(im, gdFontLarge, 0, gdFontLarge->h, 'Q', white); /* ... イメージに何らかの操作をする。ファイルにセーブするなど... */ /* イメージを破棄 */ gdImageDestroy(im);
#include "gd.h" #include "gdfontl.h" #include <string.h> ... 関数の中で ... gdImagePtr im; int black; int white; /* 書き込む文字列 */ char *s = "Hello."; im = gdImageCreate(100, 100); /* 背景色の割り当て(最初の割り当て) */ black = gdImageColorAllocate(im, 0, 0, 0); /* カラー white の割り当て(red, green, blue すべて最大値) */ white = gdImageColorAllocate(im, 255, 255, 255); /* 中央に文字列を描く */ gdImageString(im, gdFontLarge, im->w / 2 - (strlen(s) * gdFontLarge->w / 2), im->h / 2 - gdFontLarge->h / 2, s, white); /* ... イメージに何らかの操作をする。ファイルにセーブするなど... */ /* イメージを破棄 */ gdImageDestroy(im);
この関数は 256 以上の文字を取り扱うために gd1.3 で追加されて提供された。 より一般的に使用されるルーチンは gdImageString である。
#include "gd.h" #include "gdfontl.h" #include <string.h> ... 関数の中で ... gdImagePtr im; int black; int white; /* 書き込む文字列 */ char *s = "Hello."; im = gdImageCreate(100, 100); /* 背景色の割り当て(最初の割り当て) */ black = gdImageColorAllocate(im, 0, 0, 0); /* カラー white の割り当て(red, green, blue すべて最大値) */ white = gdImageColorAllocate(im, 255, 255, 255); /* Draw a centered string going upwards. Axes are reversed, and Y axis is decreasing as the string is drawn. */ gdImageStringUp(im, gdFontLarge, im->w / 2 - gdFontLarge->h / 2, im->h / 2 + (strlen(s) * gdFontLarge->w / 2), s, white); /* ... イメージに何らかの操作をする。ファイルにセーブするなど... */ /* イメージを破棄 */ gdImageDestroy(im);
この関数は 256 以上の文字を取り扱うために gd1.3 で追加されて提供された。 より一般的に使用されるルーチンは gdImageStringUp である。
In the event that all gdMaxColors colors (256) have already been allocated, gdImageColorAllocate will return -1 to indicate failure. (This is not uncommon when working with existing GIF files that already use 256 colors.) Note that gdImageColorAllocate does not check for existing colors that match your request; see gdImageColorExact and gdImageColorClosest for ways to locate existing colors that approximate the color desired in situations where a new color is not available.
... 関数の中で ... gdImagePtr im; int black; int red; im = gdImageCreate(100, 100); /* 背景色の割り当て(最初の割り当て)*/ black = gdImageColorAllocate(im, 0, 0, 0); /* カラー red の割り当て */ red = gdImageColorAllocate(im, 255, 0, 0); /* 左上から右下まで破線を描く */ gdImageDashedLine(im, 0, 0, 99, 99, red); /* ... イメージに何らかの操作をする。ファイルにセーブするなど... */ /* イメージを破棄 */ gdImageDestroy(im);
If no colors have yet been allocated in the image, gdImageColorClosest returns -1.
This function is most useful as a backup method for choosing a drawing color when an image already contains gdMaxColors (256) colors and no more can be allocated. (This is not uncommon when working with existing GIF files that already use many colors.) See gdImageColorExact for a method of locating exact matches only.
... 関数の中で ... gdImagePtr im; FILE *in; int red; /* photo.gif は多色のスキャンされた写真であることにする。 */ in = fopen("photo.gif", "rb"); im = gdImageCreateFromGif(in); fclose(in); /* 赤を直接アロケートしてみる */ red = gdImageColorAllocate(im, 255, 0, 0); /* 赤をアロケートするのに失敗したら... */ if (red == (-1)) { /* 代わりとして 最も近い 色を探す。 */ red = gdImageColorClosest(im, 255, 0, 0); } /* 左上の隅から右下の隅まで破線を描く */ gdImageDashedLine(im, 0, 0, 99, 99, red); /* ... イメージに何らかの操作をする。ファイルにセーブするなど... */ /* イメージを破棄 */ gdImageDestroy(im);
... 関数の中で ... gdImagePtr im; int red; in = fopen("photo.gif", "rb"); im = gdImageCreateFromGif(in); fclose(in); /* イメージで赤がすでに使われているならば、そのカラーテーブルを使って、 すでに定義されている色を使う。 */ red = gdImageColorExact(im, 255, 0, 0); /* 赤がなかった場合には... */ if (red == (-1)) { /* まず、赤を直接アロケートしてみる。 */ red = gdImageColorAllocate(im, 255, 0, 0); /* 訳注! ここで、もう1回判定する必要があると思う。下の1行を追加してみた。 */ if (red == (-1)) { /* Out of colors, so find the closest color instead. */ red = gdImageColorClosest(im, 255, 0, 0); } /* 訳注! 上の訳注で追加した条件のカッコを閉じる。*/ } /* 左上の隅から右下の隅まで破線を描く */ gdImageDashedLine(im, 0, 0, 99, 99, red); /* ... イメージに何らかの操作をする。ファイルにセーブするなど... */ /* イメージを破棄 */ gdImageDestroy(im);
... 関数の中で ... gdImagePtr im; int red, blue; in = fopen("photo.gif", "rb"); im = gdImageCreateFromGif(in); fclose(in); /* Look for red in the color table. */ red = gdImageColorExact(im, 255, 0, 0); /* If red is present... */ if (red != (-1)) { /* Deallocate it. */ gdImageColorDeallocate(im, red); /* Allocate blue, reusing slot in table. Existing red pixels will change color. */ blue = gdImageColorAllocate(im, 0, 0, 255); } /* ... イメージに何らかの操作をする。ファイルにセーブするなど... */ /* イメージを破棄 */ gdImageDestroy(im);
The color index used should be an index allocated by gdImageColorAllocate, whether explicitly invoked by your code or implicitly invoked by loading an image. In order to ensure that your image has a reasonable appearance when viewed by users who do not have transparent background capabilities, be sure to give reasonable RGB values to the color you allocate for use as a transparent color, even though it will be transparent on systems that support transparency.
... 関数の中で ... gdImagePtr im; int black; FILE *in, *out; in = fopen("photo.gif", "rb"); im = gdImageCreateFromGif(in); fclose(in); /* カラーテーブルから black を探して、透過色にする */ black = gdImageColorExact(im, 0, 0, 0); /* black があったか? */ if (black != (-1)) { /* 透過色とする */ gdImageColorTransparent(im, black); } /* 新しい透過色をファイルへ保存する */ out = fopen("photo.gif", "wb"); gdImageGif(im, out); fclose(out); /* イメージを破棄 */ gdImageDestroy(im);
dst
はコピーの目的先となるイメージで、
src
はコピー元となるイメージである。
dstX
と dstY
には、
目的先のイメージの中でのコピーする位置を指定する。
srcX
と srcY
には、
コピー元の左上の隅の位置を指定する。
w
と h
には、長方形の範囲の幅と
高さを指定する。
指定された範囲を、 同じイメージの中の他の位置へコピーする場合には、 その範囲が重なってはならない。 範囲が重なった場合の結果は保証されない。
コピーするイメージ間での重要な注意点: それぞれのイメージは、同じカラーテーブルである必要はない。 コピーする際に、ピクセルに、同じカラーインデックス値を単純に設定するのではない。 gdImageCopy は、 gdImageColorExactを実行する事によって、 コピー元のイメージの範囲内の個々のピクセルと、 目的のイメージ内で一致する RGB 値を探そうとする。 一致する RGB 値がない場合には、gdImageCopy は、 gdImageColorAllocateを 実行して必要とされるカラーを割り当てようとする。 この2つの方法が失敗した場合に、 gdImageCopy は gdImageColorClosest を実行して目的側のイメージの中から コピーしようとするピクセルに、もっとも近い色を探す。
... 関数の中で ... gdImagePtr im_in; gdImagePtr im_out; int x, y; FILE *in; FILE *out; /* 大きなイメージをタイルするための小さな gif をロードする */ in = fopen("small.gif", "rb"); im_in = gdImageCreateFromGif(in); fclose(in); /* 両軸が4倍の出力イメージを作成する */ im_out = gdImageCreate(im_in->sx * 4, im_in->sy * 4); /* 小さなイメージをつかって大きなイメージをタイルする */ for (y = 0; (y < 4); y++) { for (x = 0; (x < 4); x++) { gdImageCopy(im_out, im_in, x * im_in->sx, y * im_in->sy, 0, 0, im_in->sx, im_in->sy); } } out = fopen("tiled.gif", "wb"); gdImageGif(im_out, out); fclose(out); gdImageDestroy(im_in); gdImageDestroy(im_out);
dst
はコピーの目的先となるイメージで、
src
はコピー元となるイメージである。
dstX
と dstY
には、
目的先のイメージの中でのコピーする位置を指定する。
dstX
と dstY
には、
目的先のイメージの中でのコピーする位置を指定する。
srcX
と srcY
には、
コピー元の左上の隅の位置を指定する。
dstW
と dstH
には、
目的先の長方形の範囲の幅と高さを指定する。
srcW
と srcH
には、
コピー元の長方形の範囲の幅と高さを指定する。
指定された長方形にしたがって、その大きさが調整されてコピーされる。
指定された範囲を、 同じイメージの中の他の位置へコピーする場合には、 その範囲が重なってはならない。 範囲が重なった場合の結果は保証されない。 この問題がおこった場合には、 保持されている中間結果をかき集めたイメージが生成される。
コピーするイメージ間での重要な注意点: それぞれのイメージは、同じカラーテーブルである必要はない。 コピーする際に、ピクセルに、同じカラーインデックス値を単純に設定するのではない。 gdImageCopy は、 gdImageColorExactを実行する事によって、 コピー元のイメージの範囲内の個々のピクセルと、 目的のイメージ内で一致する RGB 値を探そうとする。 一致する RGB 値がない場合には、gdImageCopy は、 gdImageColorAllocateを 実行して必要とされるカラーを割り当てようとする。 この2つの方法が失敗した場合に、 gdImageCopy は gdImageColorClosest を実行して目的側のイメージの中から コピーしようとするピクセルに、もっとも近い色を探す。
... 関数の中で ... gdImagePtr im_in; gdImagePtr im_out; int x, y; FILE *in; FILE *out; /* 小さな gif を読み込んで拡大する */ in = fopen("small.gif", "rb"); im_in = gdImageCreateFromGif(in); fclose(in); /* 各軸が4倍の出力イメージを作成する。 */ im_out = gdImageCreate(im_in->sx * 4, im_in->sy * 4); /* 小さなイメージを4倍にしてコピーする */ gdImageCopyResized(im_out, im_in, 0, 0, 0, 0, im_out->sx, im_out->sy, im_in->sx, im_in->sy); out = fopen("large.gif", "wb"); gdImageGif(im_out, out); fclose(out); gdImageDestroy(im_in); gdImageDestroy(im_out);
A nonzero value for the interlace argument turns on interlace; a zero value turns it off. Note that interlace has no effect on other functions, and has no meaning unless you save the image in GIF format; the gd and xbm formats do not support interlace.
When a GIF is loaded with gdImageCreateFromGif , interlace will be set according to the setting in the GIF file.
Note that many GIF viewers and web browsers do not support interlace. However, the interlaced GIF should still display; it will simply appear all at once, just as other images do.
gdImagePtr im; FILE *out; /* ... イメージを作成または読み込む ... */ /* インターレースに設定する。 */ gdImageInterlace(im, 1); /* 出力ファイルを開く */ out = fopen("test.gif", "wb"); /* イメージをセーブする */ gdImageGif(im, out); fclose(out); gdImageDestroy(im);
gdMaxColors
(CONSTANT)
"giftogd.c" プログラムは、
.gif ファイルを .gd フォーマットに変換する簡単な方法として配布されている。
少数の使用頻度の高いイメージを超高速にローディングする必要がないならば、
このフォーマットを使う必要はない事を、再度、強調しておく。
お願い! gd の利用例をお知らせください。
gd を利用した時には、ぜひ、お知らせください。
メンテナンスと改良に時間を費やしている私たちに、
正しい事をしていると思えるように、
手を貸してください。
その成果がウェブ上で公開されているのであれば
URL をお知らせいただけれる事が、大変な喜びであります。
成果が公開されていないプロジェクトでも、
簡単なメモで、お知らせいただける事を歓迎します。
問題がおこったら
gd について問題があった場合には、遠慮なく作者
Thomas Boutell
に連絡してください。
まずは、このマニュアルを注意深く読むこと。