由于我尝试使用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;
}
我需要一些建议,因为这真的太糟糕了,大字体会变得更糟,图像也不会缩小。
更新:让它使用更大的字体(即20px),但使用较小的字体,它会在某些字母上被删除:
这就是字体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;
以下是白色背景上的这些设置的最终图像:
完全相同,感谢您的建议和回复。
答案 0 :(得分:3)
我不确定它会有所帮助,但为什么不在没有函数调用的情况下创建字体,如下所示:
Font textFont = new Font(textFontFamily, textSize, GraphicsUnit.Pixel);
答案 1 :(得分:2)
将Graphics.TextRenderingHint
设为SingleBitPerPixelGridFit
。
答案 2 :(得分:2)
我使用类似的功能生成了一些生成图像按钮的东西,我遇到了内核问题,而且字体没有拉伸到所需的字体。以下设置让我非常接近我想要的但仍然不是100%。
objGraphics2.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
objGraphics2.TextRenderingHint = System.Drawing.Drawing2D.TextRenderingHint.AntiAliasGridFit;
答案 3 :(得分:0)
我不确定这是否可以解决问题,但我在Direct3D中绘制文字时遇到了类似问题,请查看PixelOffsetMode,将其设置为Half
。