【发布时间】:2012-01-27 18:19:51
【问题描述】:
由于我尝试使用Graphics.DrawString() 进行平滑和渲染的每种组合来绘制字符串,所以我认为文本渲染器会更好地绘制我的字符串,但我认为这是错误的。
它应该是这样的:
这就是它的样子:
这是我的代码:
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;
}
我需要一些建议,因为这真的很糟糕,更大的字体会变得更糟,而且图像不会缩小。
更新:可以使用更大的字体(即 20 像素),但使用较小的字体会在某些字母上被删除:
这就是 Arial 10px 字体应该是这样的:
这是Graphics.DrawString()的结果
如您所见,它确实不是很好,但我得到的最接近。我对代码进行了一些更改,并使用更大的字体获得了更好的结果:
这就是 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;
这是在白色背景上具有这些设置的最终图像:
一模一样,谢谢建议和回复。
【问题讨论】:
-
您将图像流式传输为什么图形格式?
-
格式是 PNG 因为背景是透明的更好的。当我得到正确的组合时,我会发布 agian。
-
酷,只是检查以确保您没有尝试使用 GIF,因为那样会丢失 alpha 通道并给您类似的丑陋结果。