使用GDI +绘制文本时是否可以定义精确的字体大小?

时间:2012-05-31 09:47:18

标签: 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);
}

效果很好。这是渲染文本:

enter image description here

我想让文字更大一些。如果我将11设置为字体大小,这就是我得到的:

enter image description here

它太大了我想要的东西。 我尝试了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);          
}

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

我不知道C#或.Net库,但是,查看this page,似乎选择AntiAlias TextRenderingHint应该关闭提示并启用抗锯齿功能。这将为您提供更多中间尺寸,但可能更模糊。

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

为了避免这种情况,大多数字体都有“提示”,当分辨率有限时,它会给出四舍五入的特殊情况规则。结果就是你看到了“步数”。

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