DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

領域を塗りつぶす

注意:画像の表示方法が分からないという方は、まず「コントロールやフォームに画像を表示する」をご覧ください。また、塗りつぶした図形の描画法については、「塗りつぶした図形を描く」をご覧ください。

Regionオブジェクトが表す領域を、Graphics.FillRegionメソッドで塗りつぶすことが出来ます。Regionオブジェクトは四角形とパスで構成されるグラフィックス形状の内部を示します。Regionオブジェクトに領域を追加、あるいは削除するには、Union、Intersect、Exclude、Xorといったメソッドを使用します。

これらのメソッドの違いを理解するため、次のようなコードを書いてみました。ここではまず2つのRectangle構造体を用意し、この2つの領域からUnion、Intersect、Exclude、Xorメソッドを使用してRegionオブジェクトを作ります。2つのRectangle構造体をそれぞれ青と緑で塗りつぶした後、Regionオブジェクトの領域を黒で塗りつぶしていますので、結果を見ればそれぞれのメソッドの効果がよく分かるでしょう。

VB.NET
コードを隠すコードを選択
'Imports System.Drawing
'Imports System.Drawing.Drawing2D
'がソースファイルの一番上に書かれているものとする

'描画先とするImageオブジェクトを作成する
Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height)
'ImageオブジェクトのGraphicsオブジェクトを作成する
Dim g As Graphics = Graphics.FromImage(canvas)

Dim rgn As [Region]
Dim rect1, rect2 As Rectangle

'Regionで使用する2つの領域
rect1 = New Rectangle(0, 0, 40, 40)
rect2 = New Rectangle(20, 20, 40, 40)

'rect1を青で塗る
g.FillRectangle(Brushes.Blue, rect1)
'rect2を緑で塗る
g.FillRectangle(Brushes.Green, rect2)
'rect1でRegionを作成
rgn = New [Region](rect1)
'Union(和集合)によりrect2を追加
rgn.Union(rect2)
'出来上がったRegionを黒で描画
g.FillRegion(Brushes.Black, rgn)

'rect1とrect2の位置を変更
rect1.Y = rect2.Bottom + 10
rect2.Y = rect1.Y + 20

'rect1を青で塗る
g.FillRectangle(Brushes.Blue, rect1)
'rect2を緑で塗る
g.FillRectangle(Brushes.Green, rect2)
'rect1でRegionを作成
rgn = New [Region](rect1)
'Intersect(交差部分)によりrect2を追加
rgn.Intersect(rect2)
'出来上がったRegionを黒で描画
g.FillRegion(Brushes.Black, rgn)

'rect1とrect2の位置を変更
rect1.Y = rect2.Bottom + 10
rect2.Y = rect1.Y + 20

'rect1を青で塗る
g.FillRectangle(Brushes.Blue, rect1)
'rect2を緑で塗る
g.FillRectangle(Brushes.Green, rect2)
'rect1でRegionを作成
rgn = New [Region](rect1)
'Exclude(交差しない内部の部分)によりrect2を追加
rgn.Exclude(rect2)
'出来上がったRegionを黒で描画
g.FillRegion(Brushes.Black, rgn)

'rect1とrect2の位置を変更
rect1.Y = rect2.Bottom + 10
rect2.Y = rect1.Y + 20

'rect1を青で塗る
g.FillRectangle(Brushes.Blue, rect1)
'rect2を緑で塗る
g.FillRectangle(Brushes.Green, rect2)
'rect1でRegionを作成
rgn = New [Region](rect1)
'Xor(交差部分を差し引いた和集合)によりrect2を追加
rgn.Xor(rect2)
'出来上がったRegionを黒で描画
g.FillRegion(Brushes.Black, rgn)

'リソースを解放する
g.Dispose()

'PictureBox1に表示する
PictureBox1.Image = canvas
C#
コードを隠すコードを選択
//using System.Drawing;
//using System.Drawing.Drawing2D;
//がソースファイルの一番上に書かれているものとする

//描画先とするImageオブジェクトを作成する
Bitmap canvas = new Bitmap(PictureBox1.Width, PictureBox1.Height);
//ImageオブジェクトのGraphicsオブジェクトを作成する
Graphics g = Graphics.FromImage(canvas);

Region rgn;
Rectangle rect1, rect2;

//Regionで使用する2つの領域
rect1 = new Rectangle(0, 0, 40, 40);
rect2 = new Rectangle(20, 20, 40, 40);

//rect1を青で塗る
g.FillRectangle(Brushes.Blue, rect1);
//rect2を緑で塗る
g.FillRectangle(Brushes.Green, rect2);
//rect1でRegionを作成
rgn = new Region(rect1);
//Union(和集合)によりrect2を追加
rgn.Union(rect2);
//出来上がったRegionを黒で描画
g.FillRegion(Brushes.Black, rgn);

//rect1とrect2の位置を変更
rect1.Y = rect2.Bottom + 10;
rect2.Y = rect1.Y + 20;

//rect1を青で塗る
g.FillRectangle(Brushes.Blue, rect1);
//rect2を緑で塗る
g.FillRectangle(Brushes.Green, rect2);
//rect1でRegionを作成
rgn = new Region(rect1);
//Intersect(交差部分)によりrect2を追加
rgn.Intersect(rect2);
//出来上がったRegionを黒で描画
g.FillRegion(Brushes.Black, rgn);

//rect1とrect2の位置を変更
rect1.Y = rect2.Bottom + 10;
rect2.Y = rect1.Y + 20;

//rect1を青で塗る
g.FillRectangle(Brushes.Blue, rect1);
//rect2を緑で塗る
g.FillRectangle(Brushes.Green, rect2);
//rect1でRegionを作成
rgn = new Region(rect1);
//Exclude(交差しない内部の部分)によりrect2を追加
rgn.Exclude(rect2);
//出来上がったRegionを黒で描画
g.FillRegion(Brushes.Black, rgn);

//rect1とrect2の位置を変更
rect1.Y = rect2.Bottom + 10;
rect2.Y = rect1.Y + 20;

//rect1を青で塗る
g.FillRectangle(Brushes.Blue, rect1);
//rect2を緑で塗る
g.FillRectangle(Brushes.Green, rect2);
//rect1でRegionを作成
rgn = new Region(rect1);
//Xor(交差部分を差し引いた和集合)によりrect2を追加
rgn.Xor(rect2);
//出来上がったRegionを黒で描画
g.FillRegion(Brushes.Black, rgn);

//リソースを解放する
g.Dispose();

//PictureBox1に表示する
PictureBox1.Image = canvas;

  • 履歴:
  • 2012/8/3 表示する方法を、PictureBox.Imageプロパティを使った方法に変更。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。