自从我尝试使用
我的 PxtoEm 方法是否有问题?
我需要一些建议,因为这真的很糟糕,在使用较大字体时会变得更糟,而图像不会缩小。
更新:使用更大的字体(即20px)可以工作,但是在某些字母上,使用较小的字体会有点被擦除:
这是使用Arial 10px字体时应该的样子:
如下所示: 这是使用
如下所示: 正如您所看到的,它确实不是很好,但是我最接近的。我对代码进行了一些更改,并使用较大字体获得了更好的结果:
这是使用Arial 20px字体时应该的样子:
如下所示: 这是绘制结果:
如下所示: 这是更改后的代码(我放弃了em方法并直接使用像素,改用Graphics.DrawString()而不是TextRenderer.DrawText())。
如果有人对于较小文本大小的编写方法有建议,并且使用上述代码可以很好地处理较大文本,请发表意见,我会尝试!
更新3:最终找到了解决方案,而且解决方案相当简单:不要使用透明背景!
设置如下:
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;
以下是使用这些设置在白色背景下的最终图像:
完全相同,感谢建议和回复。