4

我有点困惑,因为我可以在我的 windows 窗体上显示每个字符串和每种字体,但作为图像并不总是可能的。也许我的代码有问题。但让我告诉你我在尝试什么。

起初我有这个:

    Label l = new Label();

    l.Text = "Ì CSharp Î";

    this.Font = new Font("Code 128", 80);

    l.Size = new System.Drawing.Size(300, 200);

    this.Controls.Add(l);
    this.Size = new Size(300, 200);

windows窗体中的字符串+代码128字体

这很好。现在我想尝试使用与图像相同的字体保存相同的字符串。我找到了这段代码,我认为这就是如何做到这一点

        private static Image DrawText(string text, Font font, Color textColor, Color backColor)
        {
            //first, create a dummy bitmap just to get a graphics object
            Image img = new Bitmap(1, 1);
            Graphics drawing = Graphics.FromImage(img);

            //measure the string to see how big the image needs to be
            SizeF textSize = drawing.MeasureString(text, font);

            //free up the dummy image and old graphics object
            img.Dispose();
            drawing.Dispose();

            //create a new image of the right size
            img = new Bitmap((int)textSize.Width, (int)textSize.Height);

            drawing = Graphics.FromImage(img);

            //paint the background
            drawing.Clear(backColor);

            //create a brush for the text
            Brush textBrush = new SolidBrush(textColor);

            drawing.DrawString(text, font, textBrush, 0, 0);
            drawing.Save();
            textBrush.Dispose();
            drawing.Dispose();

            return img;
        }

        var i = DrawText("Ì CSharp Î", new Font("Code 128", 40), Color.Black, Color.White);

如果我保存图像,我会得到:

在此处输入图像描述

我不明白。我使用与我在 Windows 窗体上使用的相同的字符串和相同的字体。为什么呢?以及如何避免这个问题?

PS:我使用的字体是在这里下载的,但我也用其他字体对其进行了测试,但它并不总是有效。

4

3 回答 3

3

好吧,这很奇怪,但您使用的代码与 Label 用于绘制文本的代码不同。Label 控件默认使用 TextRenderer.DrawText(),这是一个调用 GDI 函数 (DrawTextEx) 的函数。您的 Graphic.DrawString() 调用调用 GDI+ 函数,该函数使用完全不同的文本呈现引擎。它有一些布局问题,这就是为什么 TextRenderer 被添加到 .NET 2.0

我不知道这两个函数映射字体的方式不同。但谁知道呢,这并不完全是标准字体。请改用 TextRenderer。Label 的 DrawToBitmap() 方法是一种备用解决方案。

于 2012-07-19T11:47:09.623 回答
0

您下载的字体似乎不起作用。尝试构建您安装的字体的同一作者的不同版本的字体。首先从 c:\windows\fonts 中删除旧字体“Code 128”,然后将新字体拖放到同一文件夹中。

于 2012-07-19T10:37:32.250 回答
0

http://msdn.microsoft.com/en-us/library/164w6x6z.aspx

指出

如果 familyName 参数指定的字体未安装在运行应用程序的机器上或不受支持,则将替换为 Microsoft Sans Serif

我认为你需要让自己满意,你得到的字体new Font("Code 128", 40)是你指定的字体。您是否在同一系统上运行此代码?字体是否与程序一起安装或存储在本地?字体在这两种情况下都可用吗?

我会尝试这个来测试:

Label l = new Label();
l.Text = "Ì CSharp Î";
this.Font = new Font("Code 128", 80);
l.Size = new System.Drawing.Size(300, 200);
this.Controls.Add(l);
this.Size = new Size(300, 200);
var i = DrawText(l.Text, this.Font, Color.Black, Color.White);

如果结果仍然不同,嗯嗯......然后需要考虑更多!

于 2012-07-19T10:40:54.637 回答