C# 使用GDI+;绘制文本时,是否可以定义精确的字体大小;?
我使用以下代码在位图上绘制文本:C# 使用GDI+;绘制文本时,是否可以定义精确的字体大小;?,c#,windows,gdi+,C#,Windows,Gdi+,我使用以下代码在位图上绘制文本: using (Font font = new Font("Arial", 10.0f, FontStyle.Bold, GraphicsUnit.Point)) { //draw the text graphics.DrawString("Some text", font, Brushes.White, rect, stringFormat); } 很好用。以下是渲染文本: 我想把文本放大一点。如果我将11设置为字体大小,我得到的结果如下:
using (Font font = new Font("Arial", 10.0f, FontStyle.Bold, GraphicsUnit.Point))
{
//draw the text
graphics.DrawString("Some text", font, Brushes.White, rect, stringFormat);
}
很好用。以下是渲染文本:
我想把文本放大一点。如果我将11设置为字体大小,我得到的结果如下:
这对我想要的东西来说太大了。
我试过10.25,10.5等等,但结果和10一样
我还尝试将GraphicsUnit
设置为Pixel
,但其行为相同(无法设置自定义字体大小)
我的问题是:
使用GDI+(C#)绘制文本时,是否有可能“微调”渲染文本的大小?
编辑: 更完整的代码段(根据要求): Graphics.DrawString()存在严重且无法解决的精度问题,它仅适用于打印机等高分辨率设备 请改用.NET 2.0 TextRenderer.DrawText()方法。我不知道C#或.NET库,但是,看看,为
TextRenderingHint
选择AntiAlias
应该关闭提示并打开反锯齿。这将为您提供更多的中间尺寸,但可能是更模糊的文本
问题是字体暗示。当字体的细节(如衬线的笔划宽度或大小)与目标设备的分辨率顺序相同时,简单地将设计单位缩放到设备单位可能会导致文本不平衡、不均匀,尤其是在没有任何类型的抗锯齿的情况下
为了避免这种情况,大多数字体都有“提示”,当分辨率受到限制时,这些提示给出了四舍五入的特殊大小写规则。其效果是在尺寸中看到“台阶”
如果你想避免这些步骤,你必须关闭“暗示”。这将导致光栅化器忽略特殊的舍入规则,直接将设计单位缩放到设备单位。这使您可以真正线性缩放文本。权衡的结果是,文本在小尺寸时可能看起来不太好。抗锯齿可以改善对称性,但对许多人来说,文本可能看起来模糊。试试
textrendinghint.ClearTypeGridFit
我试过graphics.textrendinghint=textrendinghint.ClearTypeGridFit,但它会给出同样的结果。我怀疑你的StringFormat
是错误的。IIRC,我成功地使用了FitBlackBox
。事实上,我根据非常具体的高度设置将字体宽度调整为一个整数。有一件事我忘了提及:该代码用于ASP.NET 3.5应用程序中的.ashx服务。使用System.Windows.Forms程序集(默认情况下不包括)安全吗?我尝试了TextRenderer.DrawText()方法。字体大小9.7的渲染效果与我问题中的第一张图片相似,而9.8的渲染效果与第二张图片相似。所以基本上它不起作用。是否有一些标志/选项需要设置?我尝试将GraphicsUnit设置为Pixel and leppie suggestion,但运气不佳。请改进您的代码片段,以显示位图是如何创建的。在调试器中检查其HorizontalResolution属性。HorizontalResolution为96.0fTextRenderer.DrawText在dpi级别上有一些舍入问题,而不是96 dpi,这是由于这行WindowsFont()this.logFont.lfHeight=-(int)Math.天花((双)WindowsGraphicsCacheManager.MeasurementGraphics.DeviceContext.DpiY*(双倍)尺寸/72.0);
using (Bitmap bitmap = new Bitmap(width, height))
using (Graphics graphics = Graphics.FromImage(bitmap))
using (Font font = new Font("Arial", 10.0f, FontStyle.Bold, GraphicsUnit.Point))
{
graphics.SmoothingMode = SmoothingMode.AntiAlias;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
Rectangle rect = new Rectangle(0, 0, width, height);
//method 1
StringFormat stringFormat = new StringFormat();
stringFormat.Alignment = StringAlignment.Center;
stringFormat.LineAlignment = StringAlignment.Center;
graphics.DrawString("Some text", font, Brushes.White, rect, stringFormat);
//method 2
TextFormatFlags flags = TextFormatFlags.HorizontalCenter |
TextFormatFlags.VerticalCenter | TextFormatFlags.WordBreak;
TextRenderer.DrawText(graphics, "Some text", font, rect, Color.White, flags);
bitmap.Save(stream, ImageFormat.Png);
}