2011-09-01 12 views
14

Estoy haciendo algunas pruebas sobre cómo dibujar texto en .Net y tuve los siguientes resultados.Dibujando texto en .NET

Drawing text example

Todos los casos usan la fuente predeterminada de Windows Vista/7: Segoe UI, 9

Como puede ver, hay una diferencia entre la segunda cadena y las demás (tiene menos calidad y el alias anti es diferente). He intentado configurar el anti-alias y el modo de suavizado en el objeto Graphics, sin ningún resultado.

¿Es posible dibujar el texto usign Graphics.DrawString y obtener la misma calidad que otros métodos?

Gracias de antemano.


EDIT: He revisado el código con reflector. Me di cuenta de que Graphics.DrawString utiliza gdiplus.dll método de llamada GdipDrawString() y TextRenderer.DrawText utiliza user32.dllDrawTextExW llamando y DrawTextExA.

¿Algún comentario al respecto?

+0

¿utiliza exactamente el mismo tipo de letra en todos los casos? – Tigran

+0

@Tigran: Sí, ver mis ediciones –

+0

Le falta la opción 'AntiAlias' ... – balexandre

Respuesta

13

GDI + fue el primer intento de Microsoft en la prestación de resolución de texto independiente. Y la única forma de renderizar texto en .NET 1.x.Fue ampliamente criticado por sus problemas de calidad, inspirando la introducción de TextRenderer y Application.SetCompatibleTextRenderingDefault() en .NET 2.0. Utiliza GDI para dibujar texto, resolviendo efectivamente los problemas. Solo debe usar Graphics.DrawString() en dispositivos de alta resolución. Impresoras

Fwiw, el segundo intento fue WPF y también recibió mucha atención por problemas de texto difuso. Resuelto en .NET 4.

Prueba este formulario de ejemplo para ver uno de los peores problemas:

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

siguiente código proviene de un ejemplo en 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)); 

He probado esto y funcionó bien, un texto suave se dibuja en mi forma! ;) Aquí está el enlace al article.

+0

Lo sentimos, pero esta respuesta no es correcta. Intente reproducir el ejemplo utilizando una etiqueta del sistema con la misma fuente y color, y verá que el texto no exactamente dibujado. -1. –

+1

Ok, hay una diferencia MENOR pero si usas "TextRenderingHint.AntiAliasGridFit", la calidad es igual. ¡Reproduje mi ejemplo con una Etiqueta para verificar los resultados! :) – Abbas

+1

Bueno, funcionó para mi. ¡Gracias un montón! :) –

1

El método Graphics.DrawString reside en el System.Drawing espacio de nombres, que significa que utiliza GDI + bajo las cubiertas en lugar de GDI, que es lo que el método TextRenderer.DrawText está utilizando.

Parece que la causa específica de la diferencia en este caso es el suavizado. Puede controlar el suavizado a través de la propiedad Graphics.TextRenderingHint.

graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit; 

Creo que también puede deshabilitarlo por fuente con el método mostrado por Abbas.

+1

Jugado con TextRenderingHint, probado todas las posibilidades y ningún resultado favorable. –

1

Aparte de las otras sugerencias, que probablemente sean más correctas en su caso, también podría intentar utilizar una Cuantización basada en Octree de la imagen. Lo uso para imágenes normales, no para texto. Hay un artículo de Microsoft que habla en detalles sobre esto y tiene un proyecto de ejemplo: http://msdn.microsoft.com/en-us/library/aa479306.aspx