C#におけるGDI+グラフィックスプログラミング

Graphicsクラスの概要

GDI+はGDI(Windowsグラフィックデバイスインターフェース)を進化させたものであり、.NET Frameworkがグラフィック操作のために提供するアプリケーションプログラミングインターフェースです。主にフォーム上でのさまざまなグラフィックや画像の描画に利用され、データビジュアライゼーションや数値シミュレーションなどの用途に適しています。

GraphicsクラスはGDI+の中心的な存在で、オブジェクトを描画デバイスにレンダリングするためのメソッドを提供します。直線・曲線・円・画像・テキストの描画機能をカプセル化しており、すべてのGDI+操作の基本となるクラスです。描画処理を行うには、指定したフォーム上でGraphicsオブジェクトを作成し、そのメソッドを呼び出す必要があります。

Graphicsオブジェクトの生成方法

以下の3つの主な方法があります:

1. Paintイベントでの生成
フォームやコントロールのPaintイベント内で生成され、PaintEventArgsの一部として提供されます。コントロールに対する描画コードを作成する際に一般的に使用されます。

public partial class DrawingForm : Form
{
    protected override void OnPaint(PaintEventArgs args)
    {
        base.OnPaint(args);

        Graphics renderer = args.Graphics;
        renderer.DrawLine(Pens.Silver, 0, 0, 5, 5);
    }
}

2. CreateGraphicsメソッド
既存のフォームやコントロールに対してCreateGraphicsメソッドを呼び出し、描画サーフェイスを表すGraphicsオブジェクトを取得します。既存のウィンドウ要素に描画する場合はこの方法を使用します。

private void DrawingForm_Load(object sender, EventArgs e)
{
    Graphics canvas;
    canvas = this.CreateGraphics();
}

3. Graphics.FromImageメソッド
Imageから継承した任意のオブジェクトからGraphicsオブジェクトを生成します。既存の画像を変更する必要がある場合に有効です。

private void DrawingForm_Load(object sender, EventArgs e)
{
    Bitmap workBitmap = new Bitmap(@"D:\sample.bmp");
    Graphics imageRenderer = Graphics.FromImage(workBitmap);
}

Graphicsクラスのプロパティ

  • Clip - このGraphicsの描画範囲を制限するRegionを取得または設定
  • ClipBounds - このGraphicsのクリップ領域を限定するRectangleF構造を取得
  • VisibleClipBounds - このGraphicsの可視クリップ領域の境界を取得
  • CompositingQuality - このGraphicsへの合成画像の品質を取得または設定
  • SmoothingMode - このGraphicsの描画品質を取得または設定
  • DpiX - 水平解像度を取得
  • DpiY - 垂直解像度を取得
  • PageScale - ワールド単位とページ単位の比率を取得または設定
  • PageUnit - ページ座標系の測定単位を取得または設定

Graphicsクラスの主なメソッド

線の描画
DrawLine - 座標で指定された2点を結ぶ直線を描画
DrawLines - Point構造の配列で指定された連続線分を描画
DrawBezier - 4つのPoint構造で定義されるベジエスプラインを描画
DrawBeziers - Point構造の配列から複数のベジエスプラインを描画
DrawCurve - 指定されたPoint構造を通るカーブを描画

塗りつぶし可能な図形
DrawEllipse - 座標・幅・高さで指定される楕円を描画
DrawPath - GraphicsPathオブジェクトを描画
DrawPie - 角度と位置で指定される扇形を描画
DrawPolygon - Point構造の配列で定義される多角形を描画
DrawRectangle - 座標・幅・高さで指定される矩形を描画
DrawRectangles - Rectangle構造の配列で指定される複数の矩形を描画
DrawArc - 座標・幅・高さで指定される楕円の弧を描画

領域の塗りつぶし
FillEllipse - 座標・幅・高さで指定される楕円内部を塗りつぶし
FillPath - GraphicsPathオブジェクトの内部を塗りつぶし
FillPie - 扇形の内部を塗りつぶし
FillPolygon - 多角形の内部を塗りつぶし
FillRectangle - 座標・幅・高さで指定される矩形内部を塗りつぶし
FillRectangles - Rectangle構造で指定される複数の矩形内部を塗りつぶし
FillRegion - Regionオブジェクトの内部を塗りつぶし

文字列・画像・アイコンの描画
DrawString - 指定位置にBrushとFontでテキストを描画
DrawIcon - 指定座標にIconオブジェクトを描画
DrawImage - 指定位置にImageオブジェクトを元のサイズで描画

その他のメソッド
MeasureString - 指定Fontで描画される文字列のサイズを計測
FromImage - ImageオブジェクトからGraphicsオブジェクトを生成
Save - 現在の状態をGraphicsStateオブジェクトとして保存
Clear - 描画面全体を指定色でクリア
Dispose - Graphicsオブジェクトが使用する全リソースを解放

座標系

GDI+では3種類の座標系が定義されており、Graphics.TransformPoints()メソッドで座標変換が可能です。

  • グローバル座標系
  • ページ座標系 - 左上が原点で、x軸は右向き、y軸は下向きが正方向。単位はピクセルで、デフォルトの座標系
  • デバイス座標系 - 特定の測定単位を持つページ座標系。単位がピクセルの場合、ページ座標系と同じ

Point構造体

PointとPointFはそれぞれ整数型と浮動小数点型の座標情報を保持します。

Point coordinate1 = new Point(int xValue, int yValue);
PointF coordinate2 = new PointF(float xValue, float yValue);

Size構造体

SizeとSizeFは幅と高さの寸法情報を表します。

public Size(int width, int height);
public SizeF(float width, float height);

Rectangle構造体

RectangleとRectangleFは矩形を表現し、以下のプロパティを持ちます:

  • Top、Left、Bottom、Right:矩形の境界座標
  • Width、Height:幅と高さ
  • Size:矩形の寸法
  • X、Y:左上隅の座標
// Point構造とSize構造による初期化
Rectangle bounds = new Rectangle(Point location, Size dimensions);
// 整数座標による初期化
Rectangle bounds = new Rectangle(int x, int y, int width, int height);

GraphicsPathクラス

GraphicsPathクラスは接続された直線と曲線の系列を表します。

Graphics drawingSurface = e.Graphics;
drawingSurface.FillRectangle(Brushes.White, this.ClientRectangle);

GraphicsPath shapePath = new GraphicsPath();

shapePath.AddLine(15, 15, 15, 55);
shapePath.AddBezier(15, 55, 15, 60, 30, 75, 35, 75);
shapePath.AddLine(35, 75, 65, 75);
shapePath.CloseFigure();

drawingSurface.DrawPath(Pens.Navy, shapePath);
drawingSurface.FillPath(Brushes.Coral, shapePath);
shapePath.Dispose();
drawingSurface.Dispose();

Regionクラス

Regionクラスは矩形またはパスで構成される図形の内部領域を表します。

1. GraphicsPathからRegionを生成:

GraphicsPath pathForRegion = new GraphicsPath();
pathForRegion.AddLine(15, 15, 15, 55);
pathForRegion.AddBezier(15, 55, 15, 60, 30, 75, 35, 75);
pathForRegion.AddLine(35, 75, 65, 75);
pathForRegion.CloseFigure();

Region area = new Region(pathForRegion);
drawingSurface.FillRegion(Brushes.Lime, area);

2. 図形からRegionを生成:

Region area = new Region(new Rectangle(15, 15, 85, 25));

3. 既存のRegionから新しいRegionを生成:

Region sourceArea = new Region(new Rectangle(15, 15, 85, 25));
RegionData sourceData = sourceArea.GetRegionData();
Region targetArea = new Region(sourceData);

4. 領域の演算:

Graphics canvas = e.Graphics;
Rectangle firstRect = new Rectangle(55, 15, 55, 135);
Rectangle secondRect = new Rectangle(15, 55, 135, 55);
Region operationArea = new Region(firstRect);
operationArea.Intersect(secondRect);

canvas.FillRegion(Brushes.Tomato, operationArea);
canvas.DrawRectangle(Pens.DarkBlue, firstRect);
canvas.DrawRectangle(Pens.DarkBlue, secondRect);

カラー処理

Color構造体

Color構造体はARGB(アルファ・赤・緑・青)で色を表現し、140の名前付き色が静的プロパティとして提供されています。

  • FromArgb(int alpha, int red, int green, int blue) - 4つの成分からColorを生成
  • FromArgb(int red, int green, int blue) - RGB値からColorを生成(アルファは255で固定)
  • FromArgb(int alpha, Color baseColor) - 既存のColorにアルファ値を適用
Color grayTone = Color.FromArgb(180, 180, 180);
Color namedColor = Color.FromName("SkyBlue");

色情報の取得:

Color crimson = Color.Crimson;
float brightness = crimson.GetBrightness();
float hue = crimson.GetHue();
float saturation = crimson.GetSaturation();

ColorTranslatorクラス

HTMLカラーコードとの変換を行います。

Color htmlColor1 = ColorTranslator.FromHtml("#FF0000");
Color htmlColor2 = ColorTranslator.FromHtml("Green");

string htmlCode1 = ColorTranslator.ToHtml(Color.Blue);
string htmlCode2 = ColorTranslator.ToHtml(Color.FromArgb(128, 128, 128));

Penクラス

Penクラスは直線や曲線の描画に使用するペンを定義します。

Pen solidPen = new Pen(Color.Blue, 2.0f);
Pen brushPen = new Pen(Brushes.Red, 1.5f);

使用例:

Pen linePen = new Pen(Color.Purple, 4);
Point start = new Point(20, 100);
Point end = new Point(300, 100);
Graphics surface = this.CreateGraphics();
surface.DrawLine(linePen, start, end);

Brushクラス

Brushは図形の内部を塗りつぶすための抽象基底クラスです。

Rectangle fillArea = new Rectangle(25, 85, 255, 105);

SolidBrush solidFill = new SolidBrush(Color.MediumVioletRed);
TextureBrush textureFill = new TextureBrush(new Bitmap(@"c:\texture.jpg"));
LinearGradientBrush gradientFill = new LinearGradientBrush(fillArea, Color.Gold, Color.Teal, 60);
PathGradientBrush radialFill = new PathGradientBrush(pathObject);
HatchBrush patternFill = new HatchBrush(HatchStyle.Cross, Color.Orange, Color.White);

e.Graphics.FillRectangle(solidFill, fillArea);
e.Graphics.FillRectangle(textureFill, fillArea);
e.Graphics.FillRectangle(gradientFill, fillArea);
e.Graphics.FillRectangle(patternFill, fillArea);

Fontクラス

Fontクラスの主なコンストラクタ:

  • new Font(string familyName, float size)
  • new Font(string familyName, float size, FontStyle style)

フォントの設定:

label1.Font = new Font("Meiryo", 10, label1.Font.Style | FontStyle.Bold);
label1.Font = new Font("Meiryo", 10, label1.Font.Style & ~FontStyle.Bold);

使用例:

Font textFont = new Font("Times New Roman", 18);
SolidBrush textBrush = new SolidBrush(Color.DarkBlue);
e.Graphics.DrawString("Hello World", textFont, textBrush, new PointF(200.0F, 200.0F));

画像処理

Imageクラスおよび印刷関連機能については別途参照してください。

タグ: csharp gdi+ graphics WinForms drawing

6月20日 22:54 投稿