OSX NSFont 与 Photoshop 中完全相同的字体不同

Posted

技术标签:

【中文标题】OSX NSFont 与 Photoshop 中完全相同的字体不同【英文标题】:OSX NSFont differs from the exact same font in Photoshop 【发布时间】:2015-02-04 09:55:13 【问题描述】:

我在 Photoshop 中将我的字体设置为 Helvetica Neue Regular 22pt - 没有任何额外的自定义。

现在我需要在我的 OSX 应用程序中获得完全相同的结果,这似乎很难实现。

我使用

修改我的 NSTextField 的字体
self.label.font = [NSFont fontWithName:@"HelveticaNeue" size:22];

我创建了 HelveticaNeue(regular) 和 HelveticaNeue-Medium、Photoshop 和 OSX 的比较。 似乎 OSX 部分总是更粗一些,并且字母间距略有减小。

也许可以玩一会儿并使用 NSAttribuedString 在 OSX 上调整字体,直到它与 Photoshop 字体匹配,但这真的有必要吗?字体不应该完全一样吗?

【问题讨论】:

【参考方案1】:

有很多方法可以渲染字体。显然,Photoshop 有自己的字体渲染引擎,它不同于 NSTextField 默认所做的。

如果您放大图像尺寸(以不尝试使结果平滑的方式),您会看到 Photoshop 渲染使用灰度抗锯齿,而 OS X 渲染使用亚像素抗锯齿。 OS X 渲染有彩色条纹。当以正常尺寸渲染时,这些颜色最终会照亮 LCD 屏幕中的不同 RGB 元素。与其看起来是彩色的,不如说它看起来像是亮度的变化。基本上,亚像素抗锯齿使用 LCD 像素内的颜色元素布局来提高其可以渲染的分辨率。

我还怀疑 OS X 渲染引擎正在使用亚像素字形定位。这允许字形的大小和间距更接近字体的规定,在渲染到像素网格时做出更小的妥协。例如,看第一行(Helvetica Neue 22pt: Photoshop)。 “H”和“e”之间以及“l”和“v”之间的间距在我看来是错误的。 OS X 在我看来更好看。

如果您自己渲染文本,您可以使用CGContextSetShouldSubpixelQuantizeFonts() 关闭亚像素抗锯齿,并使用CGContextSetShouldSubpixelPositionFonts() 关闭亚像素定位。 (文档建议关闭子像素定位也会关闭子像素抗锯齿,尽管我不确定为什么会这样。)看看这是否会产生更像 Photoshop 给你的结果。

顺便说一下,也可以调整 Photoshop 渲染字体的方式。仅仅因为两个东西表面上呈现相同的字体,并不意味着它们会产生相同的像素。

【讨论】:

以上是关于OSX NSFont 与 Photoshop 中完全相同的字体不同的主要内容,如果未能解决你的问题,请参考以下文章

使用 Objective-C 获取 Photoshop 的动作列表

检查 NSFont 在 Swift 中是不是为粗体

Cocoa NSFont 'leading' 属性构建错误

Cocoa NSFont 'leading' 属性构建错误

字体“SF Mono”的 NSFont 名称是啥?

从 NSFont 获取所有字符