我正在做一个小项目,我必须编写一个低级应用程序。我想在该应用程序中显示文本,我什至希望它具有抗锯齿(à la ClearType)。不允许使用库,我必须逐个像素地绘制每个字符。
做这个的最好方式是什么?你能推荐一些已知的算法吗?我应该如何存储/读取字体?
谢谢!
你的意思是你只想平滑现有位图字体的边缘?如果您的原始字体是 16x32 并且您想以 8x16 或类似的方式渲染它,这很容易,但如果您没有更高分辨率的位图开始,则平滑是一项非常重要的操作,涉及大量猜测。在这种情况下,我会查找2xsai
算法(它会为这种事情提供视觉上令人愉悦的结果)并首先执行它以将字体放大到双倍分辨率,然后使用区域平均算法将其缩小(即取每个目标像素来自 4 像素正方形的平均值)。
我还建议保存您最终的“抗锯齿”位图字体并在您的程序中简单地使用它,而不是在运行时执行所有这些工作。
放在一起:
字体主要有两种:
1)等宽:所有字符都有固定的大小,并且您为每个字符定义一个位图。不需要抗锯齿(您可以硬编码位图中的灰度)。调整大小时看起来很糟糕。
2) True Type:每个字母由贝塞尔曲线的一组参数定义。可以轻松缩放到任何大小,但需要大量程序逻辑(和处理能力!)。抗锯齿在这里很有用(尤其是亚像素渲染技术)。
如我所见,您想使用位图字体和重新缩放?您可以只预先计算其中几个,从而避免复杂的运行时逻辑。
正如 R. 所建议的,将位图保持在灰度而不是 BW 的更高分辨率会有所帮助。我建议使用可被大多数小数整除的大小,以便可以轻松缩小位图。此外,如果此分辨率足够高,则可以将其保持为 BW 并缩小为灰度(使用表面积分)。
编辑:随意编辑它,请不要投票。把所有这些评论放在一起。
好吧,鉴于您了解一些有关光栅化和贝塞尔曲线的知识,读取 TTF(或任何其他)字体并将一些字形渲染到位图中并不难。不好的一点是,如果你想让文本看起来不错,就需要大量的代码。别名字体很难渲染,我不是在谈论暗示。需要有一个例程来调整字距,多字符序列,决定哪些字形映射到您的字符以及编码的东西,......
您可能想要使用预渲染的位图字体 - 然后整个渲染操作是一个简单的图像副本,最终会进行一些重新采样或旋转;但是,您失去了矢量字体功能。
我的建议是使用 FreeType 并使用它,它是一个很好的库,可以很容易地静态链接并消除不必要的膨胀。
很难建立一个好的字体引擎,尤其是当你需要进行缩放和抗锯齿的时候。所以我建议你走简单的路:
如果您想要更多功能,我建议您在尝试制作自己的解决方案之前先考虑使用FreeType之类的引擎。