2

在我的程序中,我需要生成一个位图,其中所有数字字符(0..9)从左到右排列,加上一些其他字符。

用户将从 UI 中选择:

  1. 所需的字体,和
  2. 所需的字符高度(以像素为单位)。

所以我想创建一个位图,然后从这个位图中创建一个图形,然后将数字一个一个地绘制到这个位图中,然后将它保存到磁盘。

我在几个小时内无法弄清楚:如何创建具有正确大小的字体,以便数字“0”具有用户给定的高度?

我使用了 Font 构造函数中的所有参数,使用 StringFormat 的属性,使用 MeasureString/MeasureText/MeasureCharacterRanges,我尝试通过 P/Invoke(具有正/负 nHeight)使用本机 CreateFont() 创建字体。所有称为“大小”或“高度”的参数似乎都表示某个比“0”大得多的假设字符的大小。

我确实阅读了关于线高、em 高度、上升、下降等的理论。似乎没有关于角色真实高度的概念,没有填充和间距等

我的问题又是:给定“0”字形的字体名称和所需的像素高度,我如何创建一种字体来绘制具有所需高度的字形?

我将不胜感激任何指导。

稍后编辑关于我的项目的更多细节:它是一个带有大显示屏的嵌入式设备,我需要为设计人员提供一种简单的方法来生成和尝试他们喜欢的位图字体。生成此类位图字体的 Windows 工具对我来说似乎是一个很好的解决方案。

4

2 回答 2

1

虽然我之前发布的内容与我之前发布的内容相差不远,但它实际上并没有奏效。在对此进行猛烈抨击时,我发现有趣的是,graphics.MeasureString("M", ...) 报告的高度远大于 graphics.MeasureString("MM", ...)。在手动计算字体大小时,我发现第一个(与 GetEMSize 的响应相关)实际上是全线大小。最后,我意识到数字的实际字符大小不需要与任何指标相关,无论是真实的还是.net。

于 2013-11-05T11:56:45.247 回答
0

我相信您可以使用此字体构造函数GraphicsUnit指定为像素。然后它应该创建具有适当大小的字体。

添加测试代码 - 根据您的情况进行相应编辑,不要判断样式,我只是想要一些可以粘贴到 LINQPad 中并生成图像的东西。

using (var font = new Font("Arial",10,FontStyle.Regular, GraphicsUnit.Pixel))
using (var image = new Bitmap(30, 15))
using (var graphics = Graphics.FromImage(image))
{
    graphics.FillRectangle(Brushes.White, new Rectangle(0, 0, 30, 15));
    graphics.DrawString("Ay", font, Brushes.Black, 0, 0);
    image.Save(@"E:\test.bmp", ImageFormat.Bmp);
}

请记住,在按像素设置大小时,字体中的所有字符都需要适合该范围,这意味着字母带有下降线和字母带有上升线。

于 2012-08-22T18:03:13.897 回答