防止 TrueType 字体的抗锯齿(或子像素渲染)

Posted

技术标签:

【中文标题】防止 TrueType 字体的抗锯齿(或子像素渲染)【英文标题】:Prevent anti-aliasing (or sub-pixel rendering) of a TrueType font 【发布时间】:2017-10-15 10:36:10 【问题描述】:

这是 .ttf 字体的呈现方式:

我使用 FontForge 创建了这个纯矢量 TrueType 字体。 我想在需要基于矢量的字形的应用程序上使用此字体,并且不支持加载 .ttf 嵌入式位图(似乎没有这个问题)

在某些配色方案中,Windows 所做的这种亚像素渲染会使字体完全不可读。这种效果存在于大多数 ttf 字体中,但在像我这样具有像素完美边缘的字体上更为明显。

有没有人知道任何可编程的提示技巧或字体设置,可以让字体呈现像素完美而不是红色/蓝色光晕?我希望字体在不修改操作系统以禁用 ClearType 或类似的情况下正常工作。

澄清一下,这是一个关于利用 TrueType 指令集或更改我可能忽略设置的 TrueType 字体设置(不是系统/应用程序设置)的问题正确地,使字体清晰呈现(如果可能的话)。

【问题讨论】:

您是否想让一个应用程序在本地禁用 ClearType(而不是整个操作系统)使用此字体?或者它是否适用于字体的每次使用,即使是动态完成的(当用户从​​已安装字体列表中选择时,应用程序作者可能以前从未见过它)? @BenVoigt 第二种情况 - 这不是应用程序编程问题。使用基于 GDI/GDI+ 的字体渲染的 Windows 应用程序似乎是罪魁祸首(尽管它可能不受此限制)。我希望 TTF 指令集专家知道可以解决问题的调整:developer.apple.com/fonts/TrueType-Reference-Manual/RM05/… 当您提到“不支持加载 .ttf 嵌入式位图的应用程序”时,您是否确定不支持嵌入式位图,或者您是否已经在您的字体中尝试过它们并且它们没用过?如果是后者,您是否尝试过this blog post 中描述的技巧来鼓励渲染器使用它们? @BrianNixon 我假设不支持,因为我尝试过的所有应用程序的行为基本相同,除非它们使用与 WinAPI(FreeType 等)无关的字体​​呈现)。谢谢你的链接。这种极其复杂的方法可能正是我所需要的,尽管如果没有 MS Mincho 出于任何原因利用它,我(或任何人)都不知道会做如此荒谬的事情。 @BrianNixon 嘿,您可以添加您的评论作为答案吗,它有效。我简直不敢相信这是解决方案,但它完全解决了我在每个使用 WinAPI 进行字体渲染的应用程序中的问题(基本上是一切)。 【参考方案1】:

工作解决方案

感谢 Brian Nixon 发布解决方案 URL,感谢 Erik Olofsson 研究并在他的博客上发布解决方案。

Erik Olofsson 提供了一种解决方案,强制 Windows 字体 API 在渲染时优先使用 .ttf 嵌入位图,优先于字形。

详细解决方法可以在http://www.electronicdissonance.com/2010/01/raster-fonts-in-visual-studio-2010.html找到


解决方案总结

    将“繁体中文”代码页添加到 OS/2 Panpose 表中。 使用“ISO 106046-1”(Unicode、UCS-2)编码。 包括以下看似随机的平假名字符的字形: い - U+3044 う - U+3046 か - U+304B ひ - U+3057 の - U+306E ん - U+3093

这份名单不是开玩笑

【讨论】:

【参考方案2】:

在某些颜色方案中,Windows 所做的这种亚像素渲染使字体完全不可读。

听起来好像 ClearType 没有正确校准。

只有当文本颜色与显示器的颜色平面匹配时,才可能显示“像素完美”。对于黑色或灰度文本,这意味着灰度显示(例如,高分辨率和昂贵的数字单色显示在医学成像领域很流行)。

否则,您会遇到颜色分量在显示器上物理分离这一基本事实。 ClearType 的概念是调整图像以补偿颜色平面之间的实际物理偏移。

具有高精度套准的印刷媒体最接近多色平面而没有任何偏移。

现在,在某些情况下禁用 ClearType 仍然有意义 - 当图像打算保存在文件中而不是显示在本地显示器上时,禁用 ClearType 可以产生在更广泛的范围内清晰易读的结果显示和压缩也更好。 (但为了获得最佳效果,请发送矢量并让最终用户显示补偿其特定的子像素结构)

在 GDI 中,ClearType 的控制是通过LOGFONT 结构设置的,该结构命令文本绘图函数使用哪些字体系列、大小和属性。在 GDI+ 中,在 Graphics 实例上使用 SetTextRenderingHint

因为 ClearType 的使用是由应用程序同时设置的大小、重量和其他属性,所以无论有无请求,您的字体都会受到请求。但是,ClearType 并非与所有字体兼容,通过强制不兼容,您将避免单独使用 ClearType。

The LOGFONT documentation对ClearType有如下评论:

以下情况不支持 ClearType 抗锯齿:

文本在打印机上呈现。 显示设置为 256 色或更少。 文本呈现给终端服务器客户端。 字体不是 TrueType 字体或带有 TrueType 轮廓的 OpenType 字体。例如,以下不支持 ClearType 抗锯齿:Type 1 字体、没有 TrueType 轮廓的 Postscript OpenType 字体、位图字体、矢量字体和设备字体。 字体已调整嵌入位图,适用于包含嵌入位图的任何字体大小。例如,这在东亚字体中很常见。

此外,TTF 格式中的gasp 表指定了几个字段来影响 ClearType 的使用。

https://www.microsoft.com/typography/otspec/gasp.htm 的文档 和https://fontforge.github.io/fontinfo.html#gasp

当然,请确保head 表中的“针对 ClearType 优化”位未设置。

【讨论】:

最后一个选项实际上并不排除应用 ClearType,因为许多应用程序只会忽略嵌入的位图,而其他的与字体无关。否则,嵌入的位图有时确实可以解决问题。 ClearType 使用其默认设置进行设置,我在许多其他机器上尝试过相同的字体,结果相同。 @Nowayz:我注意到自从操作系统开始注意到高密度显示器的存在以来,大多数软件不再使用典型的字体大小。例如,以 11.8pt 而不是 12 呈现。这可能导致不满足“包含嵌入位图的字体大小”条件。 "ClearType 使用其默认设置进行设置" 您是否尝试过运行校准向导?如果 ClearType 调整到错误的亚像素模式,它会做非常糟糕的事情。 虽然绝对需要适当的大小,但这似乎不是许多应用程序忽略嵌入位图的原因。似乎很多只是不会加载它们(可能与渲染设置相关?)。 我没有调整 ClearType 设置。我已经在 3 或 4 台具有不同屏幕且安装了全新 Windows 的机器上测试了默认设置,以确保没有人为修改任何内容。当问题在所有具有默认 ClearType 配置的测试机器上持续存在时,我对修复操作系统设置并不感兴趣。我宁愿使用 TTF 指令集架构来提示字体或任何可能的东西,我希望不必为这么小的东西学习。

以上是关于防止 TrueType 字体的抗锯齿(或子像素渲染)的主要内容,如果未能解决你的问题,请参考以下文章

基于图片的抗锯齿方法

平滑的网页字体,性感的抗锯齿显示

在 OpenGL ES 2.0 中渲染到纹理时的抗锯齿

emWin6.x抗锯齿

透明位图上的抗锯齿文本

游戏中的抗锯齿技术Anti-Alasing提炼总结