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

画像で塗りつぶす

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

画像をブラシとして使うことが出来ます。そのためのクラスがTextureBrushクラスです。

次の例では"C:\dbs1.gif"という画像ファイルを読み込んで、その画像で四角を塗りつぶしています。

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 img As Image = Image.FromFile("dbs1.gif")

'TextureBrushオブジェクトの作成
Dim tb As New TextureBrush(img)

'四角を描く
g.FillRectangle(tb, g.VisibleClipBounds)

'リソースを解放する
tb.Dispose()
img.Dispose()
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);

//画像を読み込む
Image img = Image.FromFile("dbs1.gif");

//TextureBrushオブジェクトの作成
TextureBrush tb = new TextureBrush(img);

//四角を描く
g.FillRectangle(tb, g.VisibleClipBounds);

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

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

並べ方を変更する

さて、上記の例では画像は単純に並べられて表示されましたが、この並べ方を変更することが出来ます。それには、WrapModeプロパティを変更します(下の例ではコンストラクタで指定しています)。このWrapModeプロパティはLinearGradientBrushやPathGradientBrushクラスにもあるため、「グラデーションをかける」方法においても使用できます。

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 img As Image = Image.FromFile("dbs1.gif")

'WrapModeをClamp(並べない)にする
Dim tb1 As New TextureBrush(img, WrapMode.Clamp)
g.FillRectangle(tb1, New Rectangle(0, 0, 200, 90))

'WrapModeをTile(そのまま)にする
Dim tb2 As New TextureBrush(img, WrapMode.Tile)
g.FillRectangle(tb2, New Rectangle(0, 100, 200, 90))

'WrapModeをTileFlipX(水平方向に反転)にする
Dim tb3 As New TextureBrush(img, WrapMode.TileFlipX)
g.FillRectangle(tb3, New Rectangle(0, 200, 200, 90))

'WrapModeをTileFlipXY(水平および垂直方向に反転)にする
Dim tb4 As New TextureBrush(img, WrapMode.TileFlipXY)
g.FillRectangle(tb4, New Rectangle(0, 300, 200, 90))

'WrapModeをTileFlipY(垂直方向に反転)にする
Dim tb5 As New TextureBrush(img, WrapMode.TileFlipY)
g.FillRectangle(tb5, New Rectangle(0, 400, 200, 90))

'リソースを解放する
tb1.Dispose()
tb2.Dispose()
tb3.Dispose()
tb4.Dispose()
tb5.Dispose()
img.Dispose()
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);

//画像を読み込む
Image img = Image.FromFile("dbs1.gif");

//WrapModeをClamp(並べない)にする
TextureBrush tb1 = new TextureBrush(img, WrapMode.Clamp);
g.FillRectangle(tb1, new Rectangle(0, 0, 200, 90));

//WrapModeをTile(そのまま)にする
TextureBrush tb2 = new TextureBrush(img, WrapMode.Tile);
g.FillRectangle(tb2, new Rectangle(0, 100, 200, 90));

//WrapModeをTileFlipX(水平方向に反転)にする
TextureBrush tb3 = new TextureBrush(img, WrapMode.TileFlipX);
g.FillRectangle(tb3, new Rectangle(0, 200, 200, 90));

//WrapModeをTileFlipXY(水平および垂直方向に反転)にする
TextureBrush tb4 = new TextureBrush(img, WrapMode.TileFlipXY);
g.FillRectangle(tb4, new Rectangle(0, 300, 200, 90));

//WrapModeをTileFlipY(垂直方向に反転)にする
TextureBrush tb5 = new TextureBrush(img, WrapMode.TileFlipY);
g.FillRectangle(tb5, new Rectangle(0, 400, 200, 90));

//リソースを解放する
tb1.Dispose();
tb2.Dispose();
tb3.Dispose();
tb4.Dispose();
tb5.Dispose();
img.Dispose();
g.Dispose();

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

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

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

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