• 締切済み

GDI+で重なった画像をピンポイントに消去するにはどうしたらいいですか

GDI+で重なった画像をピンポイントに消去するにはどうしたらいいですか? 赤の四角形・緑の四角形・青の四角形・黄色の円 合計4つのPNG画像をGraphicsクラスのDrawImageで 図1のように重ねて表示させたあと 緑の四角形と黄色の円だけをピンポイントに消去して 図2のようにするには どうすればいいですか?

みんなの回答

回答No.1

 人が目で見て認識できるレベルでピンポイントに処理を行おうと思えば、それなりの手間がかかります。  表示される図形の大きさ、色、配置が固定されてわかっているのなら、そのデータを元に、下が背景だけの部分は背景色で塗りつぶし、下に図形がある部分はその図形の色で塗りつぶすというのが一番負荷の少ない方法です。  一例としては、 (1)別途、4つの図形それぞれのImageを保持しておく (2)Aという図形を消したいときは、AのImageからAが描画されている座標を順番に調べる (3)その座標についてA以外でレイヤーの一番上の図形(最後に描画して表に見えてる図形)があれば、その図形の色で描画する。無い場合は背景色。 (4)消去したい図解の数だけ繰返す  しかし、一般的には「どんな図形が表示されてるのかわからない」「図形の位置が特定できない」というのが多いと思います。そういう時は方法としては3通りがあります。 1.一度全部消去してから必要なものだけをDrawImageで再描画 2.別に必要なものだけを描画したImageを用意しておき、それをDrawImageで描く 3.BeginContainer、EndContainerを使う、あるいはSave、Restoreメソッドで用意した画面を切り替える(スタック的にしか使えないのが難点ですが)

K_asuto
質問者

補足

画像を部分的に消去するには再描画か 事前に代わりの画像を用意しておくしかないんですか? 例えば、 1枚の紙だけに絵を描くといちいち消しゴムで消して描き直さなければなりませんが 透明な紙を何枚か用意して分けて描いておけば 消したいときは消したい部分が描かれた紙を取り除けば 描き直さずに消せますよね? こういうphotoshopのレイヤー機能みたいな やり方で画像を描画することはGDI+ではできないんですか?