C#字体字符渲染(GDI Bug)?

时间:2010-12-31 21:11:29

标签: c# fonts gdi+ rendering gdi

我试图将字符“t”绘制到位置(0,0)的位图,然后保存位图。但是,每当我这样做时,角色将呈现在x = 8(对于大小42)。每个字体大小的偏移量可以不同,当大小为36时,偏移量为6.这似乎是与GDI相关的错误。如何查询创建此偏移量的此值?我尝试了“GetCharABCWidthsFloat”,但左右轴承将为零。我试过“GetTextMetrics”,但这没有用。我注意到这篇文章提到了它,但没有提到如何修复它http://support.microsoft.com/kb/307208

作为一种测试方法,我尝试在(-8,0)处渲染t,最后渲染为(0,0)。有谁知道我怎么能得到这个偏移值?我对一起黑客攻击不感兴趣,但却是一个真正可行的解决方案。

GetMeasureString,GetLineSpacing无济于事。

示例代码:

static class Program
{
    static void Main(string[] args)
    {
        FontStyle style = FontStyle.Regular;
        FontFamily fontFamily = new FontFamily("Times New Roman");
        Font font = new Font("Times New Roman", 48, style);

        Bitmap bitmap = new Bitmap(64, 64);
        Graphics graphic = Graphics.FromImage(bitmap);

        SolidBrush blackBrush = new SolidBrush(Color.Black);
        graphic.FillRectangle(blackBrush, 0, 0, 64, 64);
        graphic.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;

        SizeF size = graphic.MeasureString("t", font);
        float lineSpacing = fontFamily.GetLineSpacing(FontStyle.Regular);

        graphic.DrawString("t", font, Brushes.White, new Point(0, 0));
        bitmap.Save("t.png");
        graphic.Dispose();
    }
}

1 个答案:

答案 0 :(得分:4)

尝试StringFormat.GenericTypographic

graphic.DrawString("t", font, Brushes.White, new Point(0, 0), StringFormat.GenericTypographic);