アンチエイリアスを有効にしてDrawStringメソッドでテキストを描画する - C#

アンチエイリアスを有効にしてDrawStringメソッドでテキストを描画するコードを紹介します。

概要

こちらの記事ではGraphicsオブジェクトを利用して円や線の描画でアンチエイリアスで描画するコードを紹介しました。 同様のコードでDrawStringメソッドでテキストを描画しても描画された文字列はアンチエイリアスが有効にはなりません。 この記事では、DrawStringメソッドで描画する文字列にアンチエイリアスを適用するコードを紹介します。

DrawStringメソッドで描画する文字列にアンチエイリアスを有効にするには、GraphicsオブジェクトのTextRenderingHintプロパティに TextRenderingHint.AntiAliasなどアンチエイリアスが有効なるモードの値を設定します。

書式

[Graphicsオブジェクト].TextRenderingHint = [TextRenderingHint列挙型の値]

[TextRenderingHint列挙型の値は以下の値があります。
int値 意味
SystemDefault0 システムの既定の設定で文字列を描画します。
AntiAlias4 アンチエイリアスを有効にし、ヒンティングなしで文字列を描画します。
AntiAliasGridFit3 アンチエイリアスを有効にし、ヒンティングありで文字列を描画します。
ClearTypeGridFit5 ClearTypeを有効にし、ヒンティングありで文字列を描画します。
SingleBitPerPixel2 アンチエイリアス、ClearTypeを無効にし、ヒンティングなしで文字列を描画します。
SingleBitPerPixelGridFit1 アンチエイリアス、ClearTypeを無効にし、ヒンティングありで文字列を描画します。

記述例

e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;

プログラム例

UI

下図のフォームを作成します。フォームにPanelコントロールを配置します。

コード

以下のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DrawStringDemo
{
  public partial class FormDrawStringAntiAlias : Form
  {
    public FormDrawStringAntiAlias()
    {
      InitializeComponent();
    }

    private void panel1_Paint(object sender, PaintEventArgs e)
    {
      e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;

      string text = "ぺんぎんクッキー";
      Font f = new Font("MS Gothic", 18);
      SolidBrush b = new SolidBrush(Color.Black);
      e.Graphics.DrawString(text,f,b,32,16);
    }
  }
}

解説

以下のコードで、GraphicsオブジェクトのTextRenderingHintプロパティを設定しています。TextRenderingHint.AntiAlias を設定し、 アンチエイリアスを有効にした文字列を描画する設定にします。
  e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;

画面に文字列を描画します。文字列描画についてはこちらの記事を参照してください。
  string text = "ぺんぎんクッキー";
  Font f = new Font("MS Gothic", 18);
  SolidBrush b = new SolidBrush(Color.Black);
  e.Graphics.DrawString(text,f,b,32,16);

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。画面に文字列が描画されます。 文字を確認するとアンチエイリアスが有効になっています。

プログラム例:デフォルトの描画結果

TextRenderingHintプロパティを設定しない場合のデフォルトの描画結果も確認します。

コード

以下のコードを記述します。先のプログラムの PaintイベントのTextRenderingHintプロパティの設定コードを削除した状態です。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DrawStringDemo
{
  public partial class FormDrawStringAntiAlias : Form
  {
    public FormDrawStringAntiAlias()
    {
      InitializeComponent();
    }

    private void panel1_Paint(object sender, PaintEventArgs e)
    {
      string text = "ぺんぎんクッキー";
      Font f = new Font("MS Gothic", 18);
      SolidBrush b = new SolidBrush(Color.Black);
      e.Graphics.DrawString(text,f,b,32,16);
    }
  }
}

実行結果

プロジェクトを実行します。下図の画面が表示されます。TextRenderingHint.AntiAliasの状態と描画結果が異なりますが、 描画された文字列にアンチエイリアスが適用されてるようにも見えます。

モードの違いによる描画結果

モードの違いで描画結果がどのように変化するか確認します。

何も指定しない場合 (TextRenderingHint.SystemDefault)

SystemDefaultの設定は、実行しているOSにより変化する可能性があります。今回はWindows 11での結果となります。
何も指定しない場合はClearTypeが有効な状態で描画されました。




TextRenderingHint.AntiAlias

TextRenderingHint.AntiAliasを指定した場合は、アンチエイリアスが有効な状態で描画されています。 黒またはグレーで文字色が描画されており、色の変化が無いため、ClearTypeは利用されていない状態です。




TextRenderingHint.AntiAliasGridFit

TextRenderingHint.AntiAliasを指定した場合はアンチエイリアスが有効な状態で描画されます。 このフォントの場合では、TextRenderingHint.AntiAliasとの違いはありませんでした。




TextRenderingHint.ClearTypeGridFit

TextRenderingHint.ClearTypeGridFitを指定した場合は、ClearTypeが有効な状態で描画されます。 この実行環境の場合は、TextRenderingHint.SystemDefaultと同じ描画結果になりました。




TextRenderingHint.SingleBitPerPixel

TextRenderingHint.SingleBitPerPixelを設定した場合はアンチエイリアス、ClearTypeどちらも無効な状態で描画されます。




TextRenderingHint.SingleBitPerPixelGridFit

TextRenderingHint.SingleBitPerPixelGridFitを設定した場合はアンチエイリアス、ClearTypeどちらも無効な状態で描画されます。
SingleBitPerPixel との違いが微妙にあります。(「ぺ」の文字の半濁音の丸の部分がわかりやすいです。)




著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2023-01-26
iPentec all rights reserverd.