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:
Y así es como se ve:
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:
Esto es resultado con Graphics.DrawString()
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:
Este resultado es el dibujo:
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:
Exactamente lo mismo, gracias por las sugerencias y respuestas.
¿Con qué formato de gráficos está transmitiendo la imagen? –
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
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. –