V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
bitinn
V2EX  ›  Python

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

  •  
  •   bitinn ·
    bitinn · 2015-06-24 13:35:17 +08:00 · 7283 次点击
    这是一个创建于 3458 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我之前一直用这段脚本将TrueType Collection分割为独立的TrueType文件进行测试。



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

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

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

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

    https://twitter.com/lovegoodbest/status/613561129025966081
    13 条回复    2015-06-25 18:24:55 +08:00
    bitinn
        1
    bitinn  
    OP
       2015-06-24 13:51:49 +08:00
    补充下,问题肯定在L33-L35,但我看了半天TrueType Collection spec也没搞清楚苹果是怎么给ttc加入font name的。换而言之,ttc允许你给一个ttf字体多个名字,例如萍方就附带了.PingFang和PingFang共24个字体名,但实际上只有12个字体文件……
    Daniel65536
        2
    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
        3
    janxin  
       2015-06-24 18:11:47 +08:00
    字体的zip下载了两次都是压缩包错误,是我的网络问题还是压缩问题...
    Daniel65536
        4
    Daniel65536  
       2015-06-24 18:15:55 +08:00
    唔,我又具体看了下每个表的情况,好像字体只是共用了BASE表(offset相同),不过其他除了name表内容确实是相同的。

    修正下上面的说法:

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

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

    或许我该去用fonttools,之前用opentype.js也是因为它比较多web interface,方便啊(不用上传文件,在客户端用JS分析本地文字)。
    Daniel65536
        12
    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
        13
    bitinn  
    OP
       2015-06-25 18:24:55 +08:00   ❤️ 1
    我用opentype.js理由是这个 http://bluejamesbond.github.io/CharacterMap/

    不受平台限制,也不用安装东西。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   858 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 21:11 · PVG 05:11 · LAX 13:11 · JFK 16:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.