C# 为什么不能将任何字体保存为图像?(但要在我的windows窗体上显示它)
我有点困惑,因为我可以在我的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
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我有点麻烦,但那很好;)