web-dev-qa-db-ja.com

.NETでテキストを描画する

.Netでテキストを描画することについていくつかのテストを行っていますが、次の結果が得られました。

Drawing text example

  • 最初の文字列は、FlatStyleSystemに設定されたネイティブラベルです。
  • 2番目の文字列は Graphics.DrawString() メソッドを使用して描画されます
  • 最後のものは TextRenderer.DrawText() メソッドを使用して描画されます

すべての場合、デフォルトのWindows Vista/7フォントを使用します:Segoe UI、9

ご覧のとおり、2番目の文字列と他の文字列には違いがあります(品質が低く、アンチエイリアスが異なります)。 Graphicsオブジェクトでアンチエイリアスとスムージングモードを構成しようとしましたが、結果はありませんでした。

Graphics.DrawStringを使用してテキストを描画し、他の方法と同じ品質を得ることができますか?

前もって感謝します。


編集:Reflectorでコードを確認しました。 Graphics.DrawStringがメソッドGdipDrawString()を呼び出すgdiplus.dllを使用し、TextRenderer.DrawTextを使用することに気付きました)user32.dllDrawTextExWおよびDrawTextExAを呼び出します。

それについて何かコメントはありますか?

16
Daniel Peñalba

GDI +は、解像度に依存しないテキストをレンダリングするMicrosoftの最初の試みでした。そして、.NET1.xでテキストをレンダリングする唯一の方法。 .NET 2.0でのTextRendererとApplication.SetCompatibleTextRenderingDefault()の導入に影響を与え、品質の問題で広くパンされました。テキストの描画にGDIを使用し、問題を効果的に解決します。高解像度デバイスでのみGraphics.DrawString()を使用する必要があります。プリンター。

Fwiw、2番目の試みはWPFでしたが、あいまいなテキストの問題についても多くの問題がありました。 .NET4で解決されました。

このサンプルフォームを試して、最悪の問題の1つを確認してください。

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
    }
    protected override void OnPaint(PaintEventArgs e) {
        e.Graphics.DrawString("Hiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii", 
            this.Font, Brushes.Black, 0, 0);
    }
}
14
Hans Passant

次のコードは、MSDNの例からのものです。

var fontFamily = new FontFamily("Times New Roman");
var font = new Font(fontFamily, 32, FontStyle.Regular, GraphicsUnit.Pixel);
var solidBrush = new SolidBrush(Color.FromArgb(255, 0, 0, 255));

e.Graphics.TextRenderingHint = TextRenderingHint.AntiAlias;
e.Graphics.DrawString("Your Text Here", font, solidBrush, new PointF(10, 60));

私はこれをテストしました、そしてそれはうまくいきました、滑らかなテキストが私のフォームに描かれました! ;)これが 記事 へのリンクです。

11
Abbas

Graphics.DrawStringメソッドは System.Drawing 名前空間にあります。つまり、TextRenderer.DrawTextメソッドが使用しているGDIの代わりにGDI +を内部で使用します。

この場合の違いの具体的な原因はアンチエイリアシングのようです。 Graphics.TextRenderingHint プロパティを使用してアンチエイリアシングを制御できます。

graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit;

Abbasが示した方法を使用して、フォントごとに無効にすることもできると思います。

1
Justin

あなたの場合はおそらくより正しい他の提案とは別に、画像のオクトリーベースの量子化を使用することもできます。テキストではなく、通常の写真に使用します。これについて詳しく説明し、プロジェクトの例があるMicrosoftの記事があります: http://msdn.Microsoft.com/en-us/library/aa479306.aspx

1
Durden81