fc2ブログ

【Graphics】 図形を描画する

 前回はGraphicsを使用して画像(図)を作成する簡単なサンプルコードを紹介しました。
 今回はGraphicsで図形を描画する方法を説明します。
 以下はいくつかの図形を描画して画像として保存するサンプルコードです。
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;

namespace Graphics2
{
    class Program
    {
        static void Main(string[] args)
        {
            var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Image.png");

            using (var bitmap = new Bitmap(300, 160))
            using (var graphics = Graphics.FromImage(bitmap))
            using (var pen1 = new Pen(Color.Red, 1))
            using (var pen7 = new Pen(Color.Blue, 7))
            using (var brush = Brushes.White)
            {
                // 背景色
                graphics.FillRectangle(brush, graphics.VisibleClipBounds);

                // 円弧
                graphics.DrawArc(pen7, 10, 10, 30, 50, 90, 180);
                graphics.DrawArc(pen1, 10, 10, 30, 50, 90, 180);

                // 楕円
                graphics.DrawEllipse(pen7, 50, 10, 30, 50);
                graphics.DrawEllipse(pen1, 50, 10, 30, 50);

                // 線
                graphics.DrawLine(pen7, 100, 10, 150, 50);
                graphics.DrawLine(pen1, 100, 10, 150, 50);

                // 矩形
                graphics.DrawRectangle(pen7, 200, 10, 50, 40);
                graphics.DrawRectangle(pen1, 200, 10, 50, 40);

                // 扇形
                graphics.DrawPie(pen7, 280, 10, 30, 50, 90, 180);
                graphics.DrawPie(pen1, 280, 10, 30, 50, 90, 180);


                // アンチエイリアス処理を行う
                graphics.SmoothingMode = SmoothingMode.AntiAlias;
                graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;

                // 円弧
                graphics.DrawArc(pen7, 10, 100, 30, 50, 90, 180);
                graphics.DrawArc(pen1, 10, 100, 30, 50, 90, 180);

                // 楕円
                graphics.DrawEllipse(pen7, 50, 100, 30, 50);
                graphics.DrawEllipse(pen1, 50, 100, 30, 50);

                // 線
                graphics.DrawLine(pen7, 100, 100, 150, 150);
                graphics.DrawLine(pen1, 100, 100, 150, 150);

                // 矩形
                graphics.DrawRectangle(pen7, 200, 100, 50, 40);
                graphics.DrawRectangle(pen1, 200, 100, 50, 40);

                // 扇形
                graphics.DrawPie(pen7, 280, 100, 30, 50, 90, 180);
                graphics.DrawPie(pen1, 280, 100, 30, 50, 90, 180);

                bitmap.Save(path, ImageFormat.Png);
            }
        }
    }
}
 このコードを実行すると、以下の様な画像が作成されます。
DrawXxx.png
 解りにくいですが、上段の画像はアンチエイリアスなしの図形、下段の画像はアンチエイリアス処理を行った図形です。

 先ずBitmapオブジェクトを作成し、そこからGraphicsオブジェクトを作成します。
 描画処理はGraphicsオブジェクトに対して行っていきます。
 空のBitmapからGraphicsオブジェクトを作成した場合、背景色も無い状態なので最初に背景色を指定します。
 FillRectangleメソッドで全領域を指定した色で塗りつぶしています。(塗りつぶしについては次回説明する予定なので説明は割愛します)
 その後、DrawXxxメソッドを使用して図形を描画します。
 図形を描画する際にはPenオブジェクトを使用します。
 DrawXxxメソッドに使用するペンと画像の位置・サイズ等を指定します。
 線の太さの違いを見るために太さ7ピクセルのペンと1ピクセルのペンを用意し、全く同じ位置に同じ画像を描画します。
 見ての通り、引数で指定した位置にペンの中心がくるように描画されます。
 2ピクセル以上の太さをもつペンで図形を描画する際はこのことを考慮して描画する必要があります。

 図形にアンチエイリアス処理を行いたい場合はGraphicsオブジェクトのSmoothingModeプロパティにAntiAliasを指定します。
 その際にPixelOffsetModeプロパティを変更することでアンチエイリアス時のピクセルオフセット方法を変更することができます。
 アンチエイリアス処理はSmoothingModeプロパティを変更した後に描画した画像が対象になります。
 そのため、SmoothingModeプロパティを変更する前に描画した図形はアンチエイリアス処理が行われていません。

 アンチエイリアスを行わない場合は曲線や斜め線がギザギザになりますが、色合いなどはDrawXxxメソッドで指定した通りになります。
 アンチエイリアスを行った場合は曲線や斜め線は綺麗に描画されますが、アンチエイリアス処理により図がにじむためイメージと違う図になる可能性があります。(特にデータによって色分けするような図の場合問題になる場合があります)
 そのためアンチエイリアス処理は常に使用するのではなく、うまく使い分ける必要があります。

 次回は塗りつぶし処理について説明する予定です。
----------------------------------------------------------
2016/8/6修正
 BitmapインスタンスがDisposeされていなかった点を修正。 
スポンサーサイト



テーマ : プログラミング
ジャンル : コンピュータ

カレンダー
06 | 2016/07 | 08
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 - - - - - -
全記事表示リンク

全ての記事を表示する

カテゴリ
タグリスト

月別アーカイブ
04  10  11  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09 
最新記事
リンク
最新コメント
検索フォーム
Amazon