16

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

描画テキストの例

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

すべてのケースで、デフォルトの Windows Vista/7 フォントを使用します: Segoe UI, 9

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

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

前もって感謝します。


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

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

4

4 に答える 4

14

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

Fwiw、2 回目の試行は WPF で、あいまいなテキストの問題についても多くの失敗がありました。.NET 4 で解決されました。

このサンプル フォームを試して、最悪の問題の 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);
    }
}
于 2011-09-01T10:44:07.093 に答える
12

次のコードは、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));

これをテストしたところ、問題なく動作し、フォームに滑らかなテキストが描画されました! ;)記事へのリンクは次のとおりです。

于 2011-09-01T09:28:12.693 に答える
1

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

于 2011-09-01T09:34:37.687 に答える
1

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

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

graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit;

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

于 2011-09-01T09:29:50.150 に答える