V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
工单节点使用指南
• 请用平和的语言准确描述你所遇到的问题
• 厂商的技术支持和你一样也是有喜怒哀乐的普通人类,尊重是相互的
• 如果是关于 V2EX 本身的问题反馈,请使用 反馈 节点
47042
V2EX  ›  全球工单系统

思源字体是不是有点问题

  •  
  •   47042 · 2019-10-23 12:43:50 +08:00 · 4013 次点击
    这是一个创建于 1637 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我用 python 写了一个程序,自动把文字转成图片。今天实现了类似 word 的两端对齐功能(之前是类似左对齐)但是实现后发现了问题,部分汉字的高度不在同一水平线上,甚至有头部被削去几个像素的现象。

    如图:

    (上面是旧的,即不使用两端对齐,下面是新的,注意看“日”)

    old1.JPG

    new1.JPG

    (注意看数字 92、百分号、还有“了”下移了)

    old2.JPG

    new2.JPG

    我试了更换字体,由 SourceHanSansCN-Regular.ttf 换用 SourceHanSansSC-Regular.ttf ,“日”、92 的问题不出现了,可是整行水平方向不是很齐。还换过微软雅黑,就完全看不出这个问题。

    由于在写入文字的实现上没有什么区别,特别是 y 坐标确定的位置应该是不变的。所以我的推测是,由于两端对齐需要对一行文字进行分词,加入一个平均的偏移量,然后逐个在加上偏移的位置写入文字,我怀疑这个过程中由于是逐一写入而非整行写入,导致文字不对齐。

    大家有比较熟悉字体的吗?怎么解决这个问题?

    第 1 条附言  ·  2019-10-23 13:48:24 +08:00
    各位可以试试示例代码:
    https://pastebin.com/3Qix1xsD
    第 2 条附言  ·  2019-10-23 13:56:56 +08:00

    测试代码输出的图片,上为不分词整行写入图片,下为逐个写入。

    建议点开图片放大,注意看数字100的顶部、争议再起的“再”与左右不在同一水平线上。

    fonttest.png

    第 3 条附言  ·  2019-10-23 14:31:19 +08:00
    我找到大概原因了,有可能是思源没有提供官方的 ttf,https://github.com/Pal3love/Source-Han-TrueType 这边下载的经过转换的 ttf 可能会有这个问题。我现在用 otf 就没有出现这个问题。
    第 4 条附言  ·  2019-10-23 14:54:15 +08:00
    换用 otf 之后没有解决问题,只是出现问题的字不同了,前面以为解决了问题。
    11 条回复    2019-10-23 14:54:45 +08:00
    codehz
        1
    codehz  
       2019-10-23 12:53:17 +08:00 via Android
    你用啥渲染的文字总得写出来吧(
    47042
        2
    47042  
    OP
       2019-10-23 12:57:48 +08:00
    @codehz 用的是 pillow 里面 truetype 的方式,然后直接 draw.text 上去
    learnshare
        3
    learnshare  
       2019-10-23 13:05:04 +08:00
    这要深入了解字体、字形、对齐以及绘图算法了
    简单的办法是换其他字体再试
    47042
        4
    47042  
    OP
       2019-10-23 13:42:07 +08:00
    @learnshare


    我换过字体啊,雅黑没这个问题。

    我写了段代码,各位看看有什么问题吗?(请从这边下载 SourceHanSansCN-Regular.ttf 字体 https://github.com/Pal3love/Source-Han-TrueType,然后放同目录下)

    import os
    import re
    import sys
    from PIL import Image, ImageDraw, ImageFont

    text = "在流行 VPN 服务 NordVPN 证实遭到入侵但披露 100%滞后的新闻传出之后,为什么不要使用 VPN 服务的争论再起。VPN 是一种代理服务器,服务商能看到用户的所有流量"
    font = ImageFont.truetype(os.path.join("", "SourceHanSansCN-Regular.ttf"), 18)
    im = Image.new("RGB", (1000, 200), (255,255,255))
    draw = ImageDraw.Draw(im)
    draw.text((20, 20), text, fill=(0, 0, 0), font=font)

    p = re.compile(r'([\u4e00-\u9fa5])')
    str_list = p.split(text)
    words = [w for w in str_list if len(w.strip()) > 0]
    width = 20
    for word in words:
    draw.text((width, 80), word, fill=(0, 0, 0), font=font)
    width += font.getsize(word)[0]

    im.save("testfont.png")
    47042
        5
    47042  
    OP
       2019-10-23 13:44:03 +08:00
    上面是旧的,下面是新的,注意看 100 的顶部,还有汉字水平对齐的问题(如“争论再起”的“再”)


    ![testfont.png]( https://i.loli.net/2019/10/23/G6ju9gWPkmnXOrB.png)
    47042
        6
    47042  
    OP
       2019-10-23 13:47:38 +08:00
    @47042 不想用 gist 贴代码,这边贴上来缩进没有了。
    可以参考这边: https://pastebin.com/3Qix1xsD
    kokutou
        7
    kokutou  
       2019-10-23 13:50:34 +08:00 via Android
    别用雅黑。。会有版权问题好像。。。
    试试文泉驿吧。。。
    47042
        8
    47042  
    OP
       2019-10-23 13:52:20 +08:00
    @kokutou 我不想用雅黑,所以用了思源,而且觉得思源也挺好的,结果出了这么诡异的问题
    skiy
        9
    skiy  
       2019-10-23 13:54:16 +08:00
    @47042 试试普惠体看看?
    47042
        10
    47042  
    OP
       2019-10-23 14:31:31 +08:00
    我找到大概原因了,有可能是思源没有提供官方的 ttf,https://github.com/Pal3love/Source-Han-TrueType 这边下载的经过转换的 ttf 可能会有这个问题。我现在用 otf 就没有出现这个问题。
    47042
        11
    47042  
    OP
       2019-10-23 14:54:45 +08:00
    我错了。。用了 otf 还是有问题。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   947 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:45 · PVG 04:45 · LAX 13:45 · JFK 16:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.