gpt4 book ai didi

c# - 为什么无法将任何字体保存为图像? (但要在我的窗体上显示它)

转载 作者:行者123 更新时间:2023-11-30 12:13:26 25 4
gpt4 key购买 nike

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

起初我有这个:

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

string + code 128 font in windows form

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

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

如果我保存图片,我会得到这个:

enter image description here

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

PS:我用的字体是下载的here但我也用其他字体测试过它,但它并不总是有效。

最佳答案

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

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

关于c# - 为什么无法将任何字体保存为图像? (但要在我的窗体上显示它),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11557513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com