基本位图字体渲染

时间:2011-01-11 04:44:45

标签: c# c++ algorithm graphics rendering

虽然我在过去做过这样的话题,但这是从头到尾完成位图字体渲染的最基本方法。我希望有人能在这里看到我做错了什么。

虽然这是一个很长的帖子,如果Bug#1得到修复,它可以解决所有问题。这个问题涉及C#(Bug#1)和C ++(Bug#2,Bug#3)。

对于位图字体渲染,我正在做两件事

1)在C#中创建大小为2056x2056的位图。我首先在512x512图像上绘制一个字符,然后我将图像的大小调整为128.我之所以这样做是因为我可能会在以后添加对文本的影响。这也引入了Bug#1(见下文)。

2)为每个字符渲染一个单独的矩形(参见Bug#2和Bug#3)。

我遇到的问题是正确渲染序列中的不定字符。会出现UV问题或字母间距问题。现在进入错误

错误#1:字体大小 我在512px图形上渲染的字体是120.图形将调整大小的是128,这是4倍小。在那里,我希望字体大小为30.保存位图后,我会在GIMP中查看它进行调查。我要做的一件事是从GIMP中为我的位图中的一个角色画一个角色。这将给出有趣的结果,虽然我不确定它是否错误。从下图中可以看出,正确的绘制是让GIMP在“30 pt”处绘制角色,但是,如果我在“30px”绘制它,它会明显变小。之所以如此重要,是因为后来在C ++中我将地图模式设置为“SetMapMode(dc,MM_TEXT);”。虽然,MSDN详细说明,MM_TEXT是“每个逻辑单元映射到一个设备像素”。

事实证明,GIMP将“30pt”翻译为“40px”。因此,对于我的C ++代码,我将创建大小为“40”的字体,因为我将MapMode设置为像素文本设置。这就是为什么首先修复bug是如此重要的原因。如果要修复此错误,那么它可以修复错误#1和#2。

我对Bug#1的问题,出了什么问题?我应该将地图模式设置为其他内容吗?我将角色绘制成512px图形,然后调整图形大小。这是一个关键步骤,所以我可能会对角色的较大版本产生影响。

Bug#2:UV's 由于我每128个像素存储一次字符,因此很容易获得每个字符的位图X / Y值。但是,我不确定能够在多大程度上推进UV以正确地绘制它们。我尝试过基本上像Promit一样发布的AngelCode位图字体渲染,但是,因为我不确定它们是如何生成它们的值,所以我可能在这里错了。您可以在下面的两张图片中看到我正在计算我的UV错误。

我对Bug#2的问题,我怎样才能正确推进我的紫外线?我找到位图X / Y的方式没有任何问题,只是我如何移动它们进行渲染。

Bug#3:信件放置 我不确定如何纠正移动我的角色甚至正确地获得距离。目前我只做“A + B + C”。这个地图看起来是正确的,但是,如果你看下面的Arial图像,“j”在“n”和“f”之间看起来不合适。 Arial的“b”和“y”似乎也有问题,还有Times New Roman的一些问题。

我对Bug#3的问题,如何正确推进我的角色?

Arial渲染:

Times New Roman:

值得注意的是,我对使用任何外部库(例如FreeType)或任何“黑客”都不感兴趣。我希望使用windows api正确完成此操作。做其中任何一个都不值得讨论,如果我想使用它们,我很久以前就已经完成了这个。

由于电路板中的源标签已损坏,我将在pastebins中发布示例源。

C#(位图绘图):http://pastebin.com/zpPPZVm0 C ++(字体渲染):http://pastebin.com/mHrUatEb

1 个答案:

答案 0 :(得分:1)

1 - 点和像素是不同的单位。所以那里没有错误。搜索“字体点像素”以获得解释。

3 - 对于比例字体(如Arial),每个字符的宽度都不同。在更高级的sceanrios中,字符组合与其各自宽度的总和相比可以具有不同的宽度。您可以开始阅读MeasureString(http://msdn.microsoft.com/en-us/library/system.drawing.graphics.measurestring.aspx)并阅读有关字体渲染的相关文章。