2012-01-27 9 views
7

Como he intentado dibujar cadenas con cada combinación de suavizado y renderizado con Graphics.DrawString(), estaba pensando que el procesador de texto haría un mejor trabajo al dibujar mis hilos, pero creo que fue un error.ASP.NET TextRenderer.DrawText Awful Text Images

Ésta es la forma en que se supone que debe ser similar:

enter image description here

Y así es como se ve:

enter image description here

Aquí está mi código:

Graphics objGraphics2 = Graphics.FromImage(objBitmap); 

objGraphics2.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 
objGraphics2.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; 
objGraphics2.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
objGraphics2.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear; 

Font textFont = new Font(textFontFamily, PxtoEm(textSize)); 

SolidBrush b = new SolidBrush(textColor); 

TextRenderer.DrawText(objGraphics2, textValue, textFont, new Rectangle(0, 0, Width, Height), textColor); 

Es mi PxtoEm método mal?

public float PxtoEm(int px) 
{ 
     float em = (float)(Convert.ToDouble(Convert.ToDouble(px) * Convert.ToDouble(72)/Convert.ToDouble(objBitmap.HorizontalResolution))); 
     return em; 
} 

Necesito algunas sugerencias porque esto es realmente horrible, se pone peor con fuentes más grandes y las imágenes no se contraen.

ACTUALIZACIÓN: tengo trabajo con fuentes más grandes (es decir, 20 píxeles.) Pero con fuentes más pequeñas se pone especie de borra en algunas letras:

Esto es como se suposed estar con tipo de letra Arial 10px:

enter image description here

Esto es resultado con Graphics.DrawString()

enter image description here

Como puede ver, realmente no es muy bueno, pero lo más cercano que tengo. Hice algunos cambios en el código y obtuve mejores resultados con letra más grande:

Esto es como se suposed ser con la fuente 20px Arial:

enter image description here

Este resultado es el dibujo:

enter image description here

Y aquí está el código cambiado (me droped el método em y usé los píxeles directamente, cambié a Graphics.DrawString() en lugar de TextRenderer.DrawText()

Graphics objGraphics = Graphics.FromImage(objBitmap); 
    objGraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 
    objGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit; 
    objGraphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
    objGraphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
    objGraphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; 
    Font textFont = new Font(textFontFamily, textSize,GraphicsUnit.Pixel); 
    SolidBrush b = new SolidBrush(textColor); 
    PointF origin = new PointF((float)TextLeft,(float)TextTop); 
    StringFormat format = StringFormat.GenericTypographic; 

    objGraphics.DrawString(textValue, textFont, b , origin, format); 

Si alguien tiene alguna sugerencia de tal vez escribir un método diferente para tamaños de texto más pequeños y usar el código anterior para mayor, ya que funciona bien, publícalo y lo intentaré!

Actualización 3: Finalmente encontró solución para todo, y la solución fue bastante simple: NO USE fondo transparente!

y ajustes son:

objGraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 
objGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; // <-- important! 
objGraphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
objGraphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
objGraphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; 
      objGraphics.TextContrast = 0; 

Aquí es una imagen final con estos ajustes en el fondo blanco:

enter image description here

Exactamente lo mismo, gracias por las sugerencias y respuestas.

+0

¿Con qué formato de gráficos está transmitiendo la imagen? –

+0

El formato es Png porque el fondo es transparente. Actualmente estoy probando todo lo que se sugiere debajo. Hasta ahora, nada ha cambiado al usar TextRenderer. Volví a Graphics.DrawString y los resultados son un poco mejores. Voy a publicar un agian cuando tenga el combo correcto. – formatc

+0

Genial, solo revisé para asegurarme de que no estabas tratando de usar GIF, ya que eso perdería el canal alfa y te daría resultados feos similares. –

Respuesta

2

I construido algo para generar botones de imagen usando una funcionalidad similar y tuve problemas con kerneling y la fuente no se extiende a lo deseado con. La siguiente configuración me puso muy cerca de lo que quería, pero aún no es 100%.

objGraphics2.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; 
objGraphics2.TextRenderingHint = System.Drawing.Drawing2D.TextRenderingHint.AntiAliasGridFit; 
+0

Esto está funcionando pero solo para fuentes más grandes (es decir, 20px), de todos modos lo más cerca que llegué hasta el momento. Intentaré jugar un poco más para ver si puedo obtener un mejor resultado con fuentes más pequeñas. – formatc

0

No estoy seguro de si esto solucionará el problema, pero tuve un problema similar con el dibujo de texto en Direct3D, consulte PixelOffsetMode, configúrelo en Half.

+0

Lo intenté, se ensucia con las fuentes más grandes y lo mismo que HighQuality en las más pequeñas. – formatc

2

Conjunto Graphics.TextRenderingHint-SingleBitPerPixelGridFit.

3

No estoy seguro de que ayudará pero ¿por qué no crear su fuente, sin la llamada de función, así:

Font textFont = new Font(textFontFamily, textSize, GraphicsUnit.Pixel); 
+0

Esto ayudó a hacerlo más fácil pero igual, gracias de todas formas lo pasé por alto. – formatc

+0

n.p. No pensé que ayudaría con la calidad del renderizado, pero el código más simple siempre es un: D – Hogan