Disegno di testo in .NET

Sto facendo alcuni test sul disegno del testo in. Net e ho avuto i seguenti risultati.

Esempio di testo di disegno

  • La prima stringa è un’etichetta nativa con FlatStyle impostato su System
  • La seconda stringa viene disegnata usando il metodo Graphics.DrawString()
  • L’ultimo è disegnato usando il metodo TextRenderer.DrawText()

Tutti i casi utilizzano il tipo di carattere predefinito di Windows Vista / 7: Segoe UI, 9

Come puoi vedere, c’è una differenza tra la seconda stringa e le altre (ha meno qualità e l’anti alias è diverso). Ho provato a configurare l’anti-alias e la modalità smoothing nell’object Graphics , senza alcun risultato.

È ansible disegnare il testo usign Graphics.DrawString e ottenere la stessa qualità rispetto ad altri metodi?

Grazie in anticipo.


EDIT: ho rivisto il codice con Reflector. Mi sono reso conto che Graphics.DrawString utilizza il metodo di chiamata gdiplus.dll GdipDrawString () e TextRenderer.DrawText utilizza user32.dll chiamando DrawTextExW e DrawTextExA .

Qualche commento a riguardo?

GDI + è stato il primo tentativo di Microsoft di rendere il testo indipendente dalla risoluzione. E l’unico modo per rendere il testo in .NET 1.x. È stato ampiamente ottimizzato per i suoi problemi di qualità, ispirando l’introduzione di TextRenderer e Application.SetCompatibleTextRenderingDefault () in .NET 2.0. Usa GDI per disegnare il testo, risolvendo efficacemente i problemi. Dovresti usare Graphics.DrawString () solo su dispositivi ad alta risoluzione. Stampanti.

Fwiw, il secondo tentativo è stato WPF e ha anche un sacco di problemi per i problemi di testo fuzzy. Risolto in .NET 4.

Prova questo esempio di modulo per vedere uno dei problemi peggiori:

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

Il seguente codice proviene da un esempio su 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)); 

Ho provato questo e ha funzionato bene, un testo liscio è stato disegnato sul mio modulo! 😉 Ecco il link all’articolo .

Il metodo Graphics.DrawString risiede nello spazio dei nomi System.Drawing , il che significa che utilizza GDI + sotto le copertine anziché GDI, che è ciò che viene utilizzato TextRenderer.DrawText metodo TextRenderer.DrawText .

Sembra che la causa specifica della differenza in questo caso sia l’anti-aliasing. È ansible controllare l’anti-aliasing tramite la proprietà Graphics.TextRenderingHint .

 graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit; 

Credo che puoi anche disabilitarlo su una base per carattere usando il metodo mostrato da Abbas.

Oltre agli altri suggerimenti, che sono probabilmente più corretti nel tuo caso, potresti anche provare a utilizzare una quantizzazione dell’immagine basata sull’ottetto. Lo uso per le immagini normali, non per il testo. C’è un articolo di Microsoft che parla in dettaglio di questo e ha un progetto di esempio: http://msdn.microsoft.com/en-us/library/aa479306.aspx