帮忙研究个 ttc 转 ttf 的脚本问题

2015-06-24 13:35:17 +08:00
 bitinn
我之前一直用这段脚本将TrueType Collection分割为独立的TrueType文件进行测试。

https://gist.github.com/kayahr/2479682#file-ttc2ttf-py-L33-L35

包括最近出来的苹方,见我早前写的介绍文: http://bitinn.net/11280/

但今天弄苹方的更新版(刚发布的苹果OS X El Capitan Developer Preview Beta 2里),发现脚本计算内含字体数量的计数是错误的,本来只有12个字体(简繁各6个),现在却变成了24个。

DP1下是没问题的。肯定脚本或字体哪里不对,但我python和字体格式的理解不深,无法排错。请高手分析。

PS:如果需要测试字体,请用这个提取版。字体版权问题大家心里清楚,这里仅作为研究使用。

https://twitter.com/lovegoodbest/status/613561129025966081
7032 次点击
所在节点    Python
13 条回复
bitinn
2015-06-24 13:51:49 +08:00
补充下,问题肯定在L33-L35,但我看了半天TrueType Collection spec也没搞清楚苹果是怎么给ttc加入font name的。换而言之,ttc允许你给一个ttf字体多个名字,例如萍方就附带了.PingFang和PingFang共24个字体名,但实际上只有12个字体文件……
Daniel65536
2015-06-24 18:01:30 +08:00
其实脚本的计算没有出错。
你可以参考: https://www.microsoft.com/typography/otspec/otff.htm

简单来说,这个ttc确实定义了24个otf,也确实包含24个otf,相对应的每两个otf的表的offest与length是相同的,除了这些字体的name表。

两个字体在ttc中共用了大部分文件内容,但是分别使用了两个name表,字体名称就是在name表中定义的。
janxin
2015-06-24 18:11:47 +08:00
字体的zip下载了两次都是压缩包错误,是我的网络问题还是压缩问题...
Daniel65536
2015-06-24 18:15:55 +08:00
唔,我又具体看了下每个表的情况,好像字体只是共用了BASE表(offset相同),不过其他除了name表内容确实是相同的。

修正下上面的说法:

这个ttc包含了24个otf,也确实有24个otf,带点不带点的字体在ttc中是两个字体,带点的字体会在字体册中隐藏,所以你只看到了12个字体,但是文件中确实是有24个字体的,虽然每组字体中差的也就是name表。
bitinn
2015-06-24 18:37:24 +08:00
@Daniel65536 我后来观察到了这个情况,但有几点不能理解:

1. 含有24个字体的DP2版只比含有12个字体的DP1版多了几百K,TTC用了什么压缩方式吗?否则它是怎么做到的?
2. 用这个脚本解DP1和DP2的字体,前者的表是正常的,后者似乎丢失了一些数据,导致我无法用opentype.js打开。具体错误见我发的文章里的更新。
bitinn
2015-06-24 18:39:30 +08:00
@janxin 我想相信是网络问题,我就是从那里下的,我自己都还没下好DP2……
Daniel65536
2015-06-24 19:47:26 +08:00
@bitinn ttc没有带压缩,不过ttc可以把不同字体的表指向相同的offset来节约空间。比如带点不带点的字体的字形是一样的,所以对应的表可以只在ttc后面放一份,然后在前面Offset Table里写上相同的offset。
至于脚本,有可能是因为这种offset相同导致出现奇怪的问题。
至于是不是真是这样,我得先下载DP1的ttc看看到底是不是,不过现在比较忙,估计明天下午才能搞定,到时候大概会把研究结果丢到themex顺便往mai3上的前端群组丢一份吧,v2ex这边传图实在是不方便啊。
ratazzi
2015-06-24 20:10:52 +08:00
为什么不用 fontforge 搞定
Daniel65536
2015-06-25 01:31:00 +08:00
@bitinn opentype.js还没有具体研究,不过fonttools对于DP2的处理是没有问题的,恐怕这和opentype.js中可能存在的bug有关。
如果要具体研究字体还是推荐用fonttools里的pyftinspect或是ttx比较妥当。
bitinn
2015-06-25 13:06:03 +08:00
@Daniel65536 哦,你的意思是ttc2ttf没bug,解出来的ttf字体没错?这超出了我的预期(虽然我最初是准备上个issue给他们)。
bitinn
2015-06-25 13:36:35 +08:00
开了issue,静待官方回复 https://github.com/nodebox/opentype.js/issues/139

或许我该去用fonttools,之前用opentype.js也是因为它比较多web interface,方便啊(不用上传文件,在客户端用JS分析本地文字)。
Daniel65536
2015-06-25 17:14:53 +08:00
研究结果见: http://bbs.themex.net/showthread.php?t=16903866

fonttools就是个完美的本地工具,pyftinspect自带GTK界面,其他的工具都是命令行程序。

另外Mac可以用
brew install https://raw.githubusercontent.com/blackgear/homebrew-formula/master/fonttools.rb
来装fonttools
bitinn
2015-06-25 18:24:55 +08:00
我用opentype.js理由是这个 http://bluejamesbond.github.io/CharacterMap/

不受平台限制,也不用安装东西。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/200788

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX