「Windows API/図形の描画」の版間の差分

削除された内容 追加された内容
polygon関数とPOINT配列
編集の要約なし
186 行
 
安全のため、作業が終わったら、メモ帳を閉じてから、Visual Stuido 側でセーブ保存すると安全だろう。
 
== 無い機能 ==
=== 画面のファイル出力の機能は無い ===
Win32APIに無い機能として、画面の画像をビットマップファイルなどに出力する機能は無い。
 
よって、どうしても、そういう機能の(あなたの制作している)アプリへの組み込みが必要なら、自作するか、ネット上で出回ってる無料ライブラリを使用することになる。
 
もし .NET Framework ならば SaveImage メソッドいうのがある。しかし Win32API には、そういうのは無い。
 
Win32APIでも、画面の画像をキャプチャしてメモリなどに蓄える命令( GetShellWindow 命令 )はあるが、しかし、そうやって蓄えた画像情報を外部ファイルに出力して書き込む専用の命令は無い。
 
なので、C言語のバイナリ書き込み命令などを利用して、自分でビットマップ形式ファイルへの画像エンコーダーを自作することになる。このため、BITMAP構造体の仕様などを把握しておく必要がある。
 
=== 塗りつぶしの機能は無い ===
ペイントソフトなどでは、どのペイントソフトにも、バケツみたいなアイコンで、閉じた曲線の中を塗りつぶす機能があるだろう。
 
しかし、win32APIには、そういう命令は無い。三角形や四角形など多角形なら塗りつぶしできる専用の命令があるが、しかし一般の曲線の中を塗りつぶす命令は無い。
 
なので、塗りつぶし命令すら、自作することになる。
 
ネット検索で「塗りつぶし アルゴリズム ペイント」などの検索ワードで検索すれば、いくつかアルゴリズムを紹介したページが見つかるので、必要なら調べよう。なお、塗りつぶしのアルゴリズムには種類が複数ある。
 
 
なお、基本的な原理は、次のとおりで、「シード・フィル アルゴリズム」という。
 
まず、塗りつぶしの判定基準となる点を蓄積するスタックを用意する。最初、このスタックには、基準の1点しか入ってない。
# スタックにある1つしかない1点(仮に点Aとする)を基準として、上下左右1ドットとなりのピクセルが塗りつぶし可能か(つまり空白であるか、あるいは基準点と同じ色であるか)どうかを調べる。
# 手順1で調べた点が塗りつぶし可能なら(つまり、点Aの上下左右1ドット隣)、そこは塗りつぶすことに決定し、さらにその点をスタックに加える。塗りつぶし可能かどうかと無関係に、スタック内に最初にあった1点(点A)はスタックから除外される。(なので、最大4点がスタックに追加される。)
# スタックにあるすべての点(基準点)について、その1ピクセルとなりの隣接点が、ぬりつぶし可能かどうかを調べて、塗りつぶせた隣接点はスタックに追加していく。基準点はスタックから除去する。
# 手順3を繰り返す。
 
これを繰り返していけば、原理的には、境界枠の内部だけの塗りつぶしができる。だが、時間が比較的に掛かるので、改良がいろいろと提案されている。
 
だが、それら改良したアルゴリズムにも欠点がある。
 
たとえば、上下左右の1点ずつ調べるのではなく、横一直線に障害物にあたるまで塗りつぶして、障害物の手前の部分の点を入れる方式は、スキャンライン・シードフィル方式というが、このスキャンライン(以下略)方式の場合、結局はもとのアルゴリズムと時間があまり変わらない。なぜならスキャンライン(以下略)方式の場合でも、最終的には領域内のピクセルの個数ぶんだけ調べる必要があるからである。
 
なので、もとの「シード・フィル アルゴリズム」が塗りつぶし画像の正確さの事だけ考えるなら、一番 正確である。