いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

描画のアンチエイリアス処理 (GDI+, Graphics, TextRenderingHint, SmoothingMode, AntiAlias)

描画を行う際に普通に楕円などを描くと、ギザギザするように描画されます。
これを、アンチエイリアス化して描画するには、Graphicsクラスの以下のプロパティを設定します。

Graphics.SmoothingMode


SmoothingModeに何を設定するかによって、描画の品質が変わります。
よく使う値は以下のものです。

SmoothingMode.AntiAlias

また、文字列を描画する際にもアンチエイリアス処理を施すことが出来ます。
その場合は、以下のプロパティを使用します。

Graphics.TextRenderingHint

よく設定する値は以下のものです。名前空間がSystem.Drawing.Textなのに注意です。

TextRenderingHint.AntiAlias

以下サンプルです。

// vim:set ts=4 sw=4 et ws is nowrap ft=cs:
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace Gsf.Demo{

    public class DemoForm : Form{

        public DemoForm(){
            InitializeComponent();


            Paint += (s, e) => {

                const int  PEN_WIDTH   = 10;
                const int  ELLIPSE_X   = 30;
                Size       ellipseSize = new Size(200, 100);

                SmoothingMode old = e.Graphics.SmoothingMode;

                //
                // no antialias.
                //
                using(Pen pen = new Pen(Color.Red, PEN_WIDTH)){
                    e.Graphics.DrawEllipse(pen, new Rectangle(new Point(ELLIPSE_X, 20), ellipseSize));
                }

                //
                // use antialias.
                //
                e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
                using(Pen pen = new Pen(Color.Blue, PEN_WIDTH)){
                    e.Graphics.DrawEllipse(pen, new Rectangle(new Point(ELLIPSE_X, 150), ellipseSize));
                }

                //
                // use high-quality.
                //
                e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
                using(Pen pen = new Pen(Color.Black, PEN_WIDTH)){
                    e.Graphics.DrawEllipse(pen, new Rectangle(new Point(ELLIPSE_X, 270), ellipseSize));
                }

                
                e.Graphics.SmoothingMode = old;
                Font f = new Font("Lucida Console", 30, FontStyle.Regular);

                //
                // normal draw strings.
                //
                e.Graphics.DrawString("Sample Text", f, Brushes.Black, ELLIPSE_X, 400);
                
                //
                // use TextRenderingHint(AntiAlias).
                //
                e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
                e.Graphics.DrawString("Sample Text", f, Brushes.Black, ELLIPSE_X, 450);

                //
                // use TextRenderingHint(ClearType).
                //
                e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
                e.Graphics.DrawString("Sample Text", f, Brushes.Black, ELLIPSE_X, 500);
            };
        }

        protected void InitializeComponent(){

            SuspendLayout();

            Width  = 400;
            Height = 600;

            ResumeLayout();
        }

        [STAThread]
        static void Main(){
            Application.EnableVisualStyles();
            Application.Run(new DemoForm());
        }
    }
}

実行すると、アンチエイリアスが施されているのが確認できます。