C# 为什么不能将任何字体保存为图像?(但要在我的windows窗体上显示它)

C# 为什么不能将任何字体保存为图像?(但要在我的windows窗体上显示它),c#,.net,image,fonts,barcode,C#,.net,Image,Fonts,Barcode,我有点困惑,因为我可以在我的windows窗体上用每种字体显示每一个字符串,但作为一个图像并不总是可能的。也许我的代码有问题。但让我告诉你我在尝试什么 首先,我有这样一个问题: Label l = new Label(); l.Text = "Ì CSharp Î"; this.Font = new Font("Code 128", 80); l.Size = new System.Drawing.Size(300, 200); this.Cont

我有点困惑,因为我可以在我的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:我使用的字体是下载的,但我也用其他字体测试了它,它并不总是工作。

你下载的字体不工作。请尝试使用与您安装的字体相同的作者提供的字体。 首先从c:\windows\fonts中删除旧字体“代码128”,然后将新字体拖放到同一文件夹中。

声明

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

我认为您需要满足自己的要求,从
新字体(“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);

如果结果仍然不同,嗯。。。那就需要多想想了

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


我不知道这两个函数映射字体的方式不同。但谁知道呢,这并不是一种标准字体。改用文本渲染器。标签的DrawToBitmap()方法是一种回退解决方案。

不太可能,但可能使用不同的字体大小会影响效果?我尝试了12个-输出相同,只是更小;)我的意思是标签的尺寸是80,图像的尺寸是40(即不同)。但我猜这不会有什么不同。是的,我试过了,但没有改变任何事情。我认为那不会起作用。不知何故,许多字体,如符号和条形码,都不起作用。我相信,如果我们得到一个问题的答案“为什么字体x的工作形式,而不是作为图像”,我们将知道如何解决这个问题。我做了同样的项目。用同样的字体和你我有同样的结果和你。但与其他(条形码)字体相比,它工作得非常完美。恐怕不完全完美,因为它没有包含适当的空格字符;但是它确实不会使TextRenderer跳闸..嗨,是的,代码在同一个系统上运行。字体已安装,我也可以选择未安装字体的路径-这应该也可以。我添加了var I=DrawText(l.Text,this.Font,Color.Black,Color.White);但结果是一样的:在我的表单中,我得到了正确的字体,而不是图像。这真的很奇怪。谢谢,很高兴知道有两种不同的渲染器。所以我应该试着用TextRenderer来画这个图像?我不知道怎么做,但我会读一些关于这方面的东西。好的,DrawToBitmap可以工作,而TextRenderer我有点麻烦,但那很好;)