低级别C - 逐个像素地显示文本

时间:2010-11-14 20:06:24

标签: c text low-level

我正在开发一个小项目,我必须编写一个低级应用程序。我想在该应用程序中显示文本,我甚至希望它是反锯齿(àlaClearType)。不允许使用库,我必须逐个像素地绘制每个char。

最好的方法是什么?你能推荐一些已知的算法吗?我该如何存储/阅读字体?

谢谢!

4 个答案:

答案 0 :(得分:3)

您的意思是您只想平滑现有位图字体的边缘?如果您的原始字体是16x32并且您希望以8x16或类似的方式渲染它,这很容易,但如果您没有更高分辨率的位图,那么平滑是一项非常重要的操作,需要进行大量的猜测。在那种情况下,我会查找2xsai算法(这为这种事情提供视觉上令人愉悦的结果)并首先执行它以将字体升级为双倍分辨率,然后使用区域平均算法将其缩小(即从4像素正方形的平均值中取出每个目标像素)。

我还建议您保存最终的“消除锯齿”位图字体并在程序中使用它,而不是在运行时执行所有这些工作。

答案 1 :(得分:2)

全部放在一起:

有两种主要类型的字体:

1)Monospaced:所有字符都有固定大小,并为每个字符定义一个位图。无需抗锯齿(您可以对位图中的灰度级进行硬编码)。调整大小时看起来很可怕。

2)True Type:每个字母由Bezier曲线的一组参数定义。可以轻松扩展到任何大小,但需要大量的程序逻辑(和处理能力!)。抗锯齿在这里很有用(尤其是子像素渲染技术)。

我认为你想使用位图字体和重新缩放?您可以预先计算其中的几个,从而避免复杂的运行时逻辑。

正如R.所建议的那样,将位图保持在灰度而不是BW的更高分辨率将有所帮助。我建议使用可被大多数小数整除的大小,以便可以轻松缩小位图。此外,如果此分辨率足够高,则可以将其保持在BW并缩小到灰度(使用曲面积分)。

编辑:随时编辑它,请不要投票。把所有这些评论放在一起。

答案 2 :(得分:0)

很难建立一个好的字体引擎,特别是如果你需要进行缩放和消除锯齿。所以我建议你采取简单的方法:

  1. 决定您要使用的字体和尺寸。
  2. 为您需要使用的每种字体/大小组合生成位图字体。这可以使用Bitmap Font Generator等工具完成。
  3. 在程序中使用位图字体。 Blitting位图应该相对容易。
  4. 如果您想要更多功能,我建议您在尝试制作自己的解决方案之前先使用FreeType这样的引擎。

答案 3 :(得分:0)

好吧,读取一个TTF(或任何其他)字体并将一些字形渲染到位图中 很难,因为你知道一些关于光栅化和贝塞尔曲线的东西。不好的一点是,如果你希望文本看起来很好,那就需要大量的代码。别名字体很难呈现,我不是在谈论暗示。需要有一个常规的字距调整,多字符序列,决定哪些字形映射到你的角色以及编码内容,...

您可能想要使用预渲染的位图字体 - 然后整个渲染操作是一个简单的图像复制,最终进行一些重新取样或旋转;但是,你失去了矢量字体功能。

我的建议是采用FreeType并使用它,它就是一个很好的库,并且可以静态链接并且非常容易地消除不必要的膨胀。