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

15

以下是.ttf字体的渲染方式:

字体渲染方式

我使用FontForge创建了这个仅包含矢量的TrueType字体。我想在需要矢量基础字形而不支持加载.ttf嵌入式位图(好像没有这个问题)的应用程序上使用此字体。

在特定的配色方案下,Windows的次像素渲染会使字体完全无法阅读。这种效果存在于大多数ttf字体中,但对于像我的这样具有像素完美边缘的字体来说,它更加强烈。

是否有人知道任何可编程的提示技巧或字体设置,可以使字体以像素完美的方式呈现,而不是出现红/蓝色光环?我希望字体可以正常工作,而不需要修改操作系统禁用ClearType或类似功能。

澄清一下,这是关于利用TrueType指令集或更改我可能忽略设置的TrueType字体设置(而不是系统/应用程序设置)的问题,以使字体可辨认(如果可能)。


你想让一个应用程序在本地禁用 ClearType 使用这种字体吗(而不是全局操作系统)?还是希望它适用于字体的每个使用,即使是动态完成的(当用户从已安装字体列表中选择时,因此应用程序作者可能以前从未见过它)? - Ben Voigt
@BenVoigt 第二种情况 - 这不是一个应用程序编程问题。使用GDI / GDI +字体渲染的Windows应用程序似乎是主要罪魁祸首(尽管可能不限于此)。我希望TTF指令集的专家知道一些微调方法,可以解决这个问题:https://developer.apple.com/fonts/TrueType-Reference-Manual/RM05/Chap5.html - Nowayz
当您提到“不支持加载嵌入式位图的应用程序”时,您确定没有支持嵌入式位图,还是说您已经在字体中尝试过它们但未被使用?如果是后者,您是否尝试过此博客文章中描述的技巧来鼓励渲染器使用它们? - Brian Nixon
@BrianNixon 我假设没有支持,因为我尝试过的所有应用程序的行为都大致相同,除非它们使用与WinAPI无关的字体渲染(FreeType等)。感谢提供链接。这种极其复杂的方法可能是我需要的,尽管没有人会知道要做这样荒谬的事情,除非是像MS Mincho那样为了某种原因而利用它。 - Nowayz
@BrianNixon 嗨,你能把你的评论加入到答案里吗?它起作用了。我简直不敢相信那就是解决方案,但它完全修复了我在使用WinAPI进行字体渲染(基本上所有应用程序)时遇到的问题。 - Nowayz
2个回答

11

工作解决方案

感谢Brian Nixon发布解决方案的链接,以及Erik Olofsson在其博客上研究并发布解决方案。

Erik Olofsson提供了一种解决方案,强制Windows字体API优先使用嵌入式.ttf位图而不是字形进行渲染。

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


解决方案摘要

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

此列表不是玩笑


0
在某些颜色方案下,Windows 进行的子像素渲染会使字体完全无法阅读。
听起来好像 ClearType 没有正确校准。
只有当文本颜色与显示器的颜色平面匹配时,才能实现“像素完美”的显示。对于黑色或灰度文本,这意味着需要使用灰度显示器(例如,在医学成像领域中,高分辨率和昂贵的数字单色显示器很受欢迎)。
否则,您将遇到一个基本事实,即颜色分量在显示器上是物理分离的。ClearType 的概念是调整图像以补偿颜色平面之间的实际物理偏移量。
具有高精度注册的印刷媒体是最接近多个颜色平面而没有任何偏移的情况。
现在,在某些情况下禁用 ClearType 仍然是有意义的——当图像旨在保存在文件中而不是在本地显示时,禁用 ClearType 可以产生在更广泛的显示器范围内可读并且压缩效果更好的结果。(但是为了获得最佳结果,请发送矢量并让最终用户显示器补偿其特定的子像素结构)
在GDI中,通过LOGFONT结构来控制ClearType,该结构命令文本绘制函数使用哪种字体系列、大小和属性。在GDI+中,使用Graphics实例上的SetTextRenderingHint
由于ClearType的使用与大小、重量和其他属性同时设置,因此您的字体可能会被请求使用或不使用ClearType。但是,并非所有字体都兼容ClearType,通过强制不兼容性,您将避免仅针对您的字体使用ClearType。
关于ClearType,LOGFONT文档有以下说明:
以下情况不支持ClearType抗锯齿技术:
  • 文本在打印机上呈现。
  • 显示器分辨率设置为256色或更低。
  • 文本呈现到终端服务器客户端。
  • 字体不是TrueType字体或具有TrueType轮廓的OpenType字体。例如,以下字体不支持ClearType抗锯齿技术:Type 1字体、没有TrueType轮廓的Postscript OpenType字体、位图字体、矢量字体和设备字体。
  • 字体具有调整嵌入式位图,对于包含嵌入式位图的任何字号都是如此。例如,在东亚字体中常见这种情况。

  • 此外,TTF格式中的表有多个指定字段来影响ClearType使用。

    enter image description here

    请参阅https://www.microsoft.com/typography/otspec/gasp.htmhttps://fontforge.github.io/fontinfo.html#gasp中的文档。

    当然,确保在head表中未设置“为ClearType优化”的位。


    @Nowayz:我注意到自从操作系统开始注意到高密度显示器的存在以来,大多数软件不再使用典型的字体大小。例如,采用11.8pt进行渲染,而不是12pt。这可能会导致不满足“包含嵌入式位图的字体大小”条件。 - Ben Voigt
    "ClearType已使用其默认设置进行安装。您尝试运行过校准向导吗?如果调整到错误的子像素模式,ClearType效果会非常糟糕。" - Ben Voigt
    我没有调整ClearType设置。我在3或4台不同屏幕的全新Windows安装上测试了默认设置,以确保没有人为修改过。当所有测试过的机器都使用默认ClearType配置时,我并不真正关心修复操作系统设置。我宁愿能够使用TTF指令集架构来提示字体或其他可能的东西,但我希望不必为这么小的事情学习它。 - Nowayz
    @Nowayz:我认为我可能已经在TTF文件中找到了一些适合你目的的结构。 - Ben Voigt
    测试了所有可能的字距值,以查看是否有任何渲染差异,但没有任何一个造成了任何渲染差异(至少在我的字体中)。 - Nowayz
    显示剩余3条评论

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接