因为我试图用平滑和渲染的每个组合来绘制字符串与Graphics.DrawString()
我想文本渲染器会更好地绘制我的字符串,但我认为是错误的。ASP.NET TextRenderer.DrawText可怕的文本图像
这是它是如何应该看起来像:
,这是它的样子:
这里是我的代码:
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);
是我的PxtoEm
方法错了?
public float PxtoEm(int px)
{
float em = (float)(Convert.ToDouble(Convert.ToDouble(px) * Convert.ToDouble(72)/Convert.ToDouble(objBitmap.HorizontalResolution)));
return em;
}
我需要一些建议,因为这真的很糟糕,随着更大的字体变得更糟,图像也没有收缩。
UPDATE:得到它与更大的字体(即20像素)工作,但用较小的字体也被那种会清除一些字母:
这是它是如何suposed要与字体宋体10px的:
这导致与Graphics.DrawString()
正如你所看到的,它确实不是很好,但最接近我。我做了一些修改代码,并得到了较大的字体效果会更好:
这是它是如何suposed要与Arial字体为20px:
这是抽取结果:
这里是更改后的代码(我直接下了em方法并使用了像素,切换到Graphics.DrawString()而不是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);
如果有人有一些建议,可能会编写不同的方法来缩小文本大小,并使用上面的代码来放大,因为它很好地工作,发布它,我会尝试它!
更新3:最终找到了解决方案,解决方案相当简单: 请勿使用透明背景!
和设置:
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;
下面是白色背景上的这些设置最终图像:
完全一样的,感谢的建议和答复。
什么图形格式你流图像? – 2012-01-27 18:47:43
格式是Png,因为背景是透明的。我现在正在尝试使用TextRenderer时没有任何变化,但是我回到了Graphics.DrawString agian,结果更好一些。当我得到正确的组合后,我会发贴。 – formatc 2012-01-27 18:52:34
酷,只是检查,以确保你没有尝试使用GIF,因为这会失去alpha通道,并给你类似的丑陋结果。 – 2012-01-27 19:04:41