2012-05-31 10 views
6

estoy usando el siguiente código para dibujar texto en un mapa de bits:¿Es posible definir un tamaño de fuente preciso al dibujar texto usando GDI +?

using (Font font = new Font("Arial", 10.0f, FontStyle.Bold, GraphicsUnit.Point)) 
{ 
    //draw the text 
    graphics.DrawString("Some text", font, Brushes.White, rect, stringFormat); 
} 

Funciona bien. Aquí está el texto renderizada:

enter image description here

Quiero hacer el texto un poco más grande. Si fijo 11 como tamaño de fuente, esto es lo que me sale:

enter image description here

Es demasiado grande para lo que quiero. Probé 10.25, 10.5 y tal, pero da mismo resultado que

10.

también trato de establecer GraphicsUnit a Pixel pero se comporta de la misma (sin posibilidad de ajustar el tamaño de fuente personalizado).

Aquí es mi pregunta:

Al dibujar texto utilizando GDI + (C#), hay una posibilidad de tamaño "ajuste fino" de texto representado?


EDIT: más completa fragmento de código (según lo solicitado):

using (Bitmap bitmap = new Bitmap(width, height)) 
using (Graphics graphics = Graphics.FromImage(bitmap))  
using (Font font = new Font("Arial", 10.0f, FontStyle.Bold, GraphicsUnit.Point)) 
{ 
    graphics.SmoothingMode = SmoothingMode.AntiAlias; 
    graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 

    Rectangle rect = new Rectangle(0, 0, width, height); 

    //method 1 
    StringFormat stringFormat = new StringFormat(); 
    stringFormat.Alignment = StringAlignment.Center; 
    stringFormat.LineAlignment = StringAlignment.Center; 
    graphics.DrawString("Some text", font, Brushes.White, rect, stringFormat); 

    //method 2 
    TextFormatFlags flags = TextFormatFlags.HorizontalCenter | 
     TextFormatFlags.VerticalCenter | TextFormatFlags.WordBreak;  
    TextRenderer.DrawText(graphics, "Some text", font, rect, Color.White, flags); 

    bitmap.Save(stream, ImageFormat.Png);   
} 
+0

Try 'TextRenderingHint.ClearTypeGridFit' – leppie

+0

me trató graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit, pero da los mismos resultados que – tigrou

+1

sospecha que su' StringFormat' está mal. IIRC, utilicé 'FitBlackBox' con éxito. De hecho, modifiqué el ancho de la fuente para que sea exactamente un número entero, basado en configuraciones de altura muy específicas. – leppie

Respuesta

3

no sé C# o las bibliotecas .Net, pero, mirando a this page, parece que la selección de AntiAliasTextRenderingHint se debe apagar y encender insinuando antialiasing. Esto le dará más tamaños intermedios, pero posiblemente texto más difuso.

El problema es la sugerencia de fuente. Cuando los detalles de una fuente, como el ancho de trazo o el tamaño de una serifa, están en el mismo orden que la resolución del dispositivo de destino, simplemente escalar las unidades de diseño a unidades de dispositivo puede ocasionar texto desparejo y desigual, especialmente cuando no hay antialiasing de ninguna tipo.

Para evitar esto, la mayoría de las fuentes tienen "sugerencias" que dan reglas de casos especiales para redondear cuando la resolución es limitada. El efecto es que ve "pasos" en el tamaño.

Si desea evitar los pasos, debe desactivar "insinuar". Esto causará que el rasterizador ignore las reglas especiales de redondeo y solo escale las unidades de diseño a las unidades del dispositivo directamente. Esto le permite tener texto de escalamiento lineal. La desventaja es que el texto puede no verse tan bien en tamaños pequeños. El antialiasing puede mejorar la simetría, pero, para muchas personas, el texto puede parecer borroso.

4

Graphics.DrawString() tiene graves problemas irresolubles y precisión, sólo es adecuado para los dispositivos de alta resolución, como impresoras.

Use el método .NET 2.0 TextRenderer.DrawText() en su lugar.

+0

Una cosa que olvido mencionar: el código se usa en un servicio .ashx, en la aplicación ASP.NET 3.5. ¿es seguro usar el sistema?Ensamblado Windows.Forms (no incluido por defecto)? – tigrou

+0

Sí, no hay problema. –

+1

Intenté el método TextRenderer.DrawText(). el tamaño de letra 9.7 se representa como la primera imagen en mi pregunta, mientras que 9.8 se representa como la segunda. Entonces, básicamente, no funciona. ¿Hay algunas banderas/opciones para configurar? Intenté configurar GraphicsUnit para Pixel y sugerencia de Leppie pero no suerte. – tigrou

Cuestiones relacionadas