| GDグラフィックスライブラリを利用した描画の考え方と実例 | |
| ver1.0 |
GDグラフィックスライブラリを利用した描画の考え方と実例
本サイトで生成しているJPEG画像は、全てGDで生成し、表示しています。
簡単な形状でも部材図で7,8点。3面図で4点、イメージ図4点だから、1回に16画像ぐらいを生成しています。
(GDでの生成画像枚数は総計は、日々増えつづける。予定では400万点ぐらいまでは常時消さずにあるはず)
画像で何かを表現したいからGDを手段として使っている訳だけど、
GDを使おうとする前、手段として画像生成ツールを探したけれども、なかなかWEBで画像表示 の実例、サンプルが見つからない。
本家のサイトは当然英語だし、「本当に使えるのか?」が疑問のまま、ここまで使っています。で使えます。
なので、これからオープンオースとして、GDを使用する人には、こんな風に(も)使えるんだな〜と思ってみてください。
WEBサイトでGDを使用して画像生成した場合の考え方とかを簡単に説明してみます。
GDとは
省略(爆)そーゆー表面的な事は他のサイトに書いてある。
GDのインストール方法
省略(爆)。ここでは実装の考え方を解説するから。
GDでの生成サンプル
このページでは省略(爆)。
必要ならばFreeパターン一覧から動かしてみてください。
このサイトで生成描画している画像は全てGDで生成した画像です。
パターン一覧から画像のボタンを押すと、
WEBサーバーであるapacheからCGIとしてCプログラムとGDライブラリーが動いて
JPEGファイルを生成し、HTMLファイルから見れる様にしています。
htmlファイルにGDから生成した画像をはめ込む順番
何枚の絵を生成するかを計算して、名称/サイズを確定してから
htmlファイルを生成しています。
絵(JPEG)を先に描画してから、htmlファイルを生成しています。
GDを利用してJPEGファイルを生成する場合の注意事項
大半のブラウザーが、JPEG画像をキャッシュして保持します。
なので、CGIがJPEG画像を書き換えても、htmlファイル上での名称が同じならば、
ブラウザー上では絵が変わらない(古い画像のまま)表示されます。
これは、どうしようも無い.リロードしても根本的な解決にはなりません。
正攻法的対策は、
htmlファイルの名前はそのまま。htmlファイルの中の画像名称を変えてしまう。
が一番簡単な対策でしょう。
私の対応
htmlファイルを格納するディレクトリの下に、画像格納専用ディレクトリを生成します。
GDで画像生成する時は新規にディレクトリを生成して、その中に生成した画像を収納します。
GDでのお絵かきでの約束事 その1
GDでお絵かきするには、最初に全体の大きさを確定しておかなければなりません。
本サイトでは、単純な建材とかパネルだけ描画しているので、サイズは簡単に求められます。
けど、ここに寸法線が追加されると、サイズが狂ってしまいます。
なので、描画したいもの、その他に付加したいもの(寸法線、文字)とかのサイズを計算して、
その分「太らせてから」GDの領域を生成する事になります。
GDでのお絵かきでの約束事 その2
GDの座標系は左上を基点として、右下方向に向かって増えていきます。
普通の人間の考え方は、左下が原点で、右上に向かって増えていきます。
要は上下に関しては逆という事。
「今、自分は、人間座標系で考えている」
「今、この関数の中は、GD座標系で考えている」。しっかり区別しましょう。
全体のサイズと寸法線とかの付加情報のサイズ、それに座標系で頭が混乱するので、
必要な情報を構造体で定義して描画処理関数の中に閉じ込めてしまいましょう。
GDを使った3次元表示
GDは、指定されたドット位置に色を塗る事しかできません。
そのままでは3次元表示なんてできません。
本サイトでは、プログラム内で算数して線分の傾きを計算して、線を描いています。
図形同士の重なり合い。=陰線処理の機能なんてありません。なので、この部分も自分でプログラムを書いています。
考え方
GD自身がバッファだと見立てて、
奥にある物体から順に描画しています。
結果として、立体的に見えてます(見せかけています)
図形への説明文字について
GDの中で文字を絵に分解して描画する方法もありますけど、単にその分画像サイズが大きくなります。
文字を描画するだけ(ちょっとでも)CPUを使います。
なので、本サイトでは、文字はhtmlファイルへ文字として出力しています。
(まあ、この辺は、仕様によりますけど)
謝辞
gdの資料として
http://www2d.biglobe.ne.jp/~gama/cgi/gd/gd183.htm
を参照させて頂きました。
これを読まなければ、私はGDを使おうなんて思いもしなかったでしょう。
GDを使用した場合の描画速度
gdを利用させて頂いている者として、gdへの感謝の意味で、このgd稼動サイトの仕様を記述します。
ThinkPad A31 1.6Gmhz memory 512M HDD 4,500rpm FedoraCore appache
CGIは毎回ロード(オイ。変えなくても充分問題無いので)
はい、CPU遅いです。
ディスクも2.5inchの低速回転です。
RAMディスクなんか使っていません。
旧JPEG削除まで1本のCGIで済ませています。(別のプロセスにしろよ)
基本的はGDは自分の確保したメモリー領域に、コマンドで指示された通りのビット対応の書き込みをして、
最後に指定されたファイルフォーマットで出力するだけです。
なので、RAMがいっぱいあったらば、まだまだ早くできる(はずです)。
開発言語 全部Cで書いています。perlとかRubyとかのスクリプト言語ではありません。
その場合は、まだ遅くなるかな
質問があれば、答えてあげるよ。
(閑古鳥が飛んでいる)なんでも掲示板に書き込み下さい。