7

我正在使用以下代码在位图上绘制文本:

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#) 绘制文本时,是否可以“微调”渲染文本的大小?


编辑:更完整的代码片段(根据要求):

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);          
}
4

2 回答 2

4

Graphics.DrawString() 存在严重且无法解决的精度问题,仅适用于打印机等高分辨率设备。

请改用 .NET 2.0 TextRenderer.DrawText() 方法。

于 2012-05-31T11:26:05.767 回答
4

我不知道 C# 或 .Net 库,但是,查看这个页面,似乎选择AntiAliasforTextRenderingHint应该关闭提示并打开抗锯齿。这会给你更多的中间尺寸,但可能是更模糊的文本。

问题是字体提示。当字体的细节(如衬线的笔划宽度或大小)与目标设备的分辨率处于同一顺序时,简单地将设计单位缩放到设备单位可能会导致不平衡、不均匀的文本,尤其是在没有任何抗锯齿的情况下种类。

为了避免这种情况,大多数字体都有“提示”,当分辨率有限时,这些提示给出了四舍五入的特殊规则。效果是您在尺寸上看到“台阶”。

如果你想避免这些步骤,你必须关闭“提示”。这将导致光栅化器忽略特殊的四舍五入规则,而只是将设计单位直接缩放到设备单位。这使您可以拥有真正线性缩放的文本。权衡是文本在小尺寸下可能看起来不太好。抗锯齿可以改善对称性,但对许多人来说,文本可能看起来很模糊。

于 2012-05-31T16:54:09.507 回答