为什么无法保存任何字体的形象吗? (但我的Windows窗体上显示)(Why is it not

2019-09-19 19:13发布

我是有点困惑,因为我可以显示每串在我的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);

嗯,这是非常精细的。 现在,我想尽量节省相同的字符串与相同的字体图像。 我发现这个代码,我想这就是如何做到这一点

        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:该即时通讯使用的是下载的字体这里 ,但我和其他字体测试它也和它并不总是工作。

Answer 1:

那么,这是相当奇怪,但标签用来绘制文本你没有使用相同的代码。 标签控制使用TextRenderer.DrawText()由缺省情况下,一个pinvokes GDI函数(DrawTextEx)的功能。 你Graphic.DrawString()调用调用GDI +功能,它采用了完全不同的文本渲染引擎。 它有一些布局的问题,这就是为什么TextRenderer得到加入到.NET 2.0

我不知道这两个函数映射的字体不同的。 但谁知道,这不完全是一个标准的字体。 使用TextRenderer代替。 标签的DrawToBitmap()方法是一个回退溶液。



Answer 2:

它的接缝您下载的字体不工作。 试试这个不同势版本的字体从建立你已经安装了一个相同的作者。 首先删除老字号“128码”,从C:\ WINDOWS \字体,然后拖动ñ丢弃新在同一文件夹。



Answer 3:

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

指出

如果familyName参数指定了未安装在机器上运行的应用程序或不支持的字体,Microsoft无衬线将被取代的

我认为你需要让自己满足你得到的字体new Font("Code 128", 40)是你指定的家庭。 你运行在同一系统上这个代码? 在安装或使用该程序localy存储的字体? 是字体在这两种情况下实际可用?

我想试试这个测试:

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

如果结果仍然不同,以及嗯...一定要去想想更多!



文章来源: Why is it not possible to save any font as image? (But to display it on my windows form)