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

2024-01-06

我有点困惑,因为我可以在 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:我使用的字体已下载here http://www.jtbarton.com/Barcodes/Code128.aspx但我也用其他字体测试过它,但它并不总是有效。


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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么无法将任何字体另存为图像? (但要在我的Windows窗体上显示它) 的相关文章

随机推荐

  • 使用 Tweepy 自动直接消息响应

    我目前正在使用 python 中的 tweepy 包作为 DM 侦听器 我希望在收到发件人的消息后回复他们 我有以下内容 class StdOutListener StreamListener def init self self twee
  • 如何写入 7z 存档格式的二进制数据?

    我一直在研究 7z 存档格式的格式描述和源代码 但在编写有效的容器时仍然遇到困难 我想我可以创建一个空容器 无论如何 这是我的开始 std ofstream ofs archivename c str std ios binary std
  • 批处理文件编辑 ini 文件中的行

    我有一个自动生成的 ini 文件 它的第二行始终是 Version W XX Y ZZ Where W是主版本号 XX是次要版本 Y是构建和ZZ是修订版 我需要打开该 ini 文件并使用批处理文件编辑该行 以便删除该版本中的内部版本号和修订
  • 使用 C++ 在 Linux 中创建计时器队列 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我在 Windows 中使用 C 实现了一个项目 该项目创建一个计时器队列 向其中添加条目 在计时器到期时执行回调函数 等待下一个计时
  • 如何使用Java日历从日期中减去X天?

    有人知道使用Java日历从日期中减去X天的简单方法吗 我还没有找到任何函数可以让我直接从 Java 中的日期减去 X 天 有人能指出我正确的方向吗 取自这里的文档 http docs oracle com javase 7 docs api
  • 获得 Android 用户消息平台的同意

    我正在尝试使用 Admob 实现 UE 同意 让用户选择是否想要在 Android 中显示个性化广告 我正在通过用户消息平台的 资金选择 来做到这一点 我遵循了这个快速入门指南 https developers google com adm
  • Sphinx实时索引配置?

    我是 Sphinx 的新手 我需要 Linux 服务器中实时索引 sphinx config 的示例代码 对于近实时索引 您可以使用增量方法 http sphinxsearch com docs 1 10 delta updates htm
  • C 标准库中包含哪些内容?

    我将举一个例子GNU C 库 http www gnu org software libc manual html mono libc html Opening and Closing Files文档 13 1 打开和关闭文件 本节描述打开
  • 当你有 std::string 时如何使用 basic_istream

    我有一个使用 basic istream 作为参数的函数 并且我有一个 std string 其中包含我需要传递它的数据 我怎么做 您可以将字符串数据放入流中 std string x std stringstream ss x put s
  • 比较器 - int 不能取消引用[重复]

    这个问题在这里已经有答案了 我在这里看到了如何使用 Comparator 接口对 ArrayList 进行排序的示例 所以我尝试了一下 对于字符串 它工作得很好 但是对于我想要排序的一个变量是整数 它不会编译 说 int 不能取消引用 我该
  • 如何让屏幕暂停? [复制]

    这个问题在这里已经有答案了 可能的重复 如何阻止 C 控制台应用程序立即退出 https stackoverflow com questions 2529617 how to stop c console application from
  • 在 C++ 中使用 OpenCV 2.4 计算凸面缺陷

    我正在使用 OpenCV 2 4 来计算图像的凸包 我还进行了一些处理以消除图像中的一些噪声 这与问题并不真正相关 计算凸包的代码如下 cv Mat sourceImage assume something is already here
  • 如何将HTML文件转换为word? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要将 HTML 文档作为 Word DOC 文件保存在内存中 有人可以给我一些可以用来执行此操作的
  • JFreeChart 中的 LogAxis 上未显示小刻度

    我在用着JFreeChart绘制一些数据并使用LogAxis对于范围轴 我很困惑为什么我似乎无法在轴上显示小刻度 但网格线显示得很好 如果我不使用LogAxis我可以使用以下命令打开和关闭小刻度setMinorTickMarksVisibl
  • 具有拖放功能的示例任务应用程序

    app js App Em Application create App IndexRoute Em Route extend model function return newTasks Em A id 1 name Task 1 id
  • 这是 JavaScript 中的一个简单的去抖动函数吗?

    var debounce function fn delay var timeoutId return function debounced if timeoutId clearTimeout timeoutId timeoutId set
  • CSS 选择最多 N 层的嵌套元素

    我有许多嵌套元素 并且我尝试仅选择前 N 层 下面显示了一个工作示例 其中我选择了前 7 个级别并设置了它们的样式 这正是我想要的 但是 我希望有一种选择这些元素的简化方法 在我的实际用例中 我不知道嵌套元素的总数 并且我试图选择前 50
  • 使用 Rcpp Sugar 将平均值和标准差传递到 dnorm()

    我正在将一些 R 代码转换为 Rcpp 代码 并且需要计算给定均值向量和标准差向量的观察向量的可能性 如果我假设平均值为 0 标准差为 1 我可以编写这个函数 运行这个函数需要加载 inline 和 Rcpp 包 dtest1 cxxfun
  • 与 jMockit 结合的测试覆盖率报告

    我正在使用 jmockit 和 Ant 对于每个测试文件运行 index html文件在覆盖率报告文件夹中创建 覆盖 对于多个测试文件 这index html被覆盖 我正在寻找所有文件的综合报告 应该做什么 我读过有关使用 ser文件 但我
  • 为什么无法将任何字体另存为图像? (但要在我的Windows窗体上显示它)

    我有点困惑 因为我可以在 Windows 窗体上显示每种字体的每个字符串 但作为图像并不总是可能的 也许我的代码有问题 但让我告诉你我正在尝试什么 一开始我有这个 Label l new Label l Text CSharp this F