Python_FontTools使用

2023-11-07

Font_Tools的使用
1、fontTools使用总结
from fontTools.ttLib import TTFont
# 加载字体文件:
font = TTFont('local_fonts.woff')

# 保存为xml文件:
font.saveXML('local_fonts.xml')

# 获取各节点名称,返回为列表
print(font.keys())  # ['GlyphOrder', 'head', 'hhea', 'maxp', 'OS/2', 'hmtx', 'cmap', 'loca', 'glyf', 'name', 'post', 'GSUB']

# 获取getGlyphOrder节点的name值,返回为列表
print(font.getGlyphOrder())  # ['glyph00000', 'x', 'uniF013', 'uniF4D4', 'uniEE40', 'uniF7E1', 'uniF34B', 'uniE1A0', 'uniF1BE', 'uniE91E', 'uniF16F', 'uniF724']
print(font.getGlyphNames())  # ['glyph00000', 'uniE1A0', 'uniE91E', 'uniEE40', 'uniF013', 'uniF16F', 'uniF1BE', 'uniF34B', 'uniF4D4', 'uniF724', 'uniF7E1', 'x']

# 获取cmap节点code与name值映射, 返回为字典
print(font.getBestCmap())  # {120: 'x', 57760: 'uniE1A0', 59678: 'uniE91E', 60992: 'uniEE40', 61459: 'uniF013', 61807: 'uniF16F', 61886: 'uniF1BE', 62283: 'uniF34B', 62676: 'uniF4D4', 63268: 'uniF724', 63457: 'uniF7E1'}

# 获取glyf节点TTGlyph字体xy坐标信息
print(font['glyf']['uniE1A0'].coordinates)  # GlyphCoordinates([(50, 335),(50, 468),(76, 544),(95, 638),(148, 676),(202, 710),(282, 710),(402, 710),(459, 617),(487, 574),(504, 501),(520, 437),(519, 335),(520, 271),(508, 166),(494, 126),(466, 46),(362, -39),(282, -49),(176, -35),(115, 37),(43, 121),(43, 335),(135, 335),(135, 154),(177, 95),(229, 35),(282, 35),(343, 35),(385, 107),(428, 155),(428, 339),(428, 515),(385, 576),(344, 635),(286, 635),(218, 635),(179, 583),(135, 506)])

# 获取glyf节点TTGlyph字体xMin,yMin,xMax,yMax坐标信息
print(font['glyf']['uniE1A0'].xMin, font['glyf']['uniE1A0'].yMin,
      font['glyf']['uniE1A0'].xMax, font['glyf']['uniE1A0'].yMax)  # 0 -49 521 711
      
# 获取glyf节点TTGlyph字体on信息
print(font['glyf']['uniE1A0'].flags)  # array('B', [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0])

# 获取GlyphOrder节点GlyphID的id信息, 返回int型
print(font.getGlyphID('uniE1A0'))  # 7
2、加载字体文件
 font = TTFont('local_fonts.woff')
3、保存为xml文件:
font.saveXML('local_fonts.xml')
4、获取各节点名称,返回为列表:
font.keys()
# ['GlyphOrder', 'head', 'hhea', 'maxp', 'OS/2', 'hmtx', 'cmap', 'loca', 'glyf', 'name', 'post', 'GSUB']
5、获取getGlyphOrder节点的name值,返回为列表:
font.getGlyphOrder()
# ['glyph00000', 'x', 'uniF013', 'uniF4D4', 'uniEE40', 'uniF7E1', 'uniF34B', 'uniE1A0', 'uniF1BE', 'uniE91E', 'uniF16F', 'uniF724']
font.getGlyphNames()
# ['glyph00000', 'uniE1A0', 'uniE91E', 'uniEE40', 'uniF013', 'uniF16F', 'uniF1BE', 'uniF34B', 'uniF4D4', 'uniF724', 'uniF7E1', 'x']
6、获取cmap节点code与name值映射, 返回为字典:
font.getBestCmap() 
# {120: 'x', 57760: 'uniE1A0', 59678: 'uniE91E', 60992: 'uniEE40', 61459: 'uniF013', 61807: 'uniF16F', 61886: 'uniF1BE', 62283: 'uniF34B', 62676: 'uniF4D4', 63268: 'uniF724', 63457: 'uniF7E1'}
7、获取glyf节点TTGlyph字体xy坐标信息:
font['glyf']['uniE1A0'].coordinates
# GlyphCoordinates([(50, 335),(50, 468),(76, 544),(95, 638),(148, 676),(202, 710),(282, 710),(402, 710),(459, 617),(487, 574),(504, 501),(520, 437),(519, 335),(520, 271),(508, 166),(494, 126),(466, 46),(362, -39),(282, -49),(176, -35),(115, 37),(43, 121),(43, 335),(135, 335),(135, 154),(177, 95),(229, 35),(282, 35),(343, 35),(385, 107),(428, 155),(428, 339),(428, 515),(385, 576),(344, 635),(286, 635),(218, 635),(179, 583),(135, 506)])
8、获取glyf节点TTGlyph字体xMin,yMin,xMax,yMax坐标信息:
font['glyf']['uniE1A0'].xMin
font['glyf']['uniE1A0'].yMin
font['glyf']['uniE1A0'].xMax
font['glyf']['uniE1A0'].yMax
# 0 -49 521 711
9、获取glyf节点TTGlyph字体on信息(0表示弧形/1表示矩形):
font['glyf']['uniE1A0'].flags
# array('B', [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0])
10、 获取GlyphOrder节点GlyphID的id信息, 返回int型:
font.getGlyphID('uniE1A0')
# 7
11、 将woff2文件转成ttf文件并解析:
from fontTools.ttLib import TTFont
from fontTools.ttLib.woff2 import decompress


woff2_path = "./woff/704224.woff2"
ttf_path = './woff/704224.ttf'
xml_path = './woff/704224.xml'
decompress(woff2_path, ttf_path)  # 将woff2文件转成ttf文件
font = TTFont(ttf_path)
font.saveXML(xml_path)
12、 识别woff.2/ttf/woff的字体结果
from PIL import ImageFont, Image, ImageDraw
from io import BytesIO
import ddddocr
from fontTools.ttLib import TTFont
from fontTools.ttLib.woff2 import decompress


# woff2_path = "./woff/704224.woff2"
# ttf_path = './woff/704224.ttf'
# xml_path = './woff/704224.xml'
# decompress(woff2_path, ttf_path)  # 将woff2文件转成ttf文件
# _font = TTFont(ttf_path)
# _font.saveXML(xml_path)


def font_to_img(_code, filename):
    """将字体画成图片"""
    img_size = 1024
    img = Image.new('1', (img_size, img_size), 255)
    draw = ImageDraw.Draw(img)
    font = ImageFont.truetype(filename, int(img_size * 0.7))
    txt = chr(_code)
    x, y = draw.textsize(txt, font=font)
    draw.text(((img_size - x) // 2, (img_size - y) // 2), txt, font=font, fill=0)
    return img


def identify_word(_ttf_path):
    """识别ttf字体结果"""
    font = TTFont(_ttf_path)
    ocr = ddddocr.DdddOcr()
    for cmap_code, glyph_name in font.getBestCmap().items():
        bytes_io = BytesIO()
        pil = font_to_img(cmap_code, _ttf_path)
        pil.save(bytes_io, format="PNG")
        word = ocr.classification(bytes_io.getvalue())  # 识别字体
        print(cmap_code, glyph_name, word)
        # with open(f"./img/{cmap_code}_{glyph_name}.png", "wb") as f:
        #     f.write(bytes_io.getvalue())
        

13、 乱码字母数字转成图片
from PIL import ImageFont, Image, ImageDraw
from io import BytesIO
import ddddocr
from fontTools.ttLib import TTFont


def luan_word_to_img(text, _ttf_path, img_path='./word.png'):
    """将字体画成图片"""
    img_size = 1024
    img = Image.new('1', (img_size, img_size), 255)
    draw = ImageDraw.Draw(img)
    word_size = int(img_size * (1 / len(text)))
    font = ImageFont.truetype(_ttf_path, word_size)
    x, y = draw.textsize(text, font=font)
    draw.text(((img_size - x) // 2, (img_size - y) // 2), text, font=font, fill=0)
    # img.show()
    # img.save(img_path)
    bytes_io = BytesIO()
    img.save(bytes_io, format="PNG")
    word = ocr.classification(bytes_io.getvalue())  # 识别字体
    # print(text, word)
    return [text, word]


ocr = ddddocr.DdddOcr()
luan_word_to_img('┋', './woff/599427.ttf')
luan_word_to_img('㑁', './woff/7SourceHanSansCN-Normal-2500.ttf')
luan_word_to_img('㖉㒍', './woff/7SourceHanSansCN-Normal-2500.ttf')
14、网页上的乱码字和ttf的camp_code的转换
  • 乱码字= chr(cmap_code) ; ord(乱码字)=cmap_code
    from fontTools.ttLib import TTFont
    ttf_path = './woff/704224.ttf'
    _font = TTFont(ttf_path)
    for cmap_code, glyph_name in _font.getBestCmap().items():
        # print(glyph_name.replace("uni", r"\u").encode('utf-8').decode('unicode_escape'))
        print(f"cmap_code:{cmap_code}, chr(cmap_code):{chr(cmap_code)}, glyph_name: {glyph_name}")
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python_FontTools使用 的相关文章

随机推荐

  • 2021-01-13

    Jacinto 7处理器设备和子系统概述 上 本文概述TI下一代汽车处理器系列的主要架构特征和优势 这张幻灯片列出了Jacinto 7 SoC的不同方面 我将在后续章节中介绍这些内容 这里讨论的特性一般适用于Jacinto 7系列中的所有派
  • [学习日志]伤害生效由谁来决定?

    伤害生效由谁来决定 普通攻击 使用动画事件 用动画事件是最普遍的一种方式 假如我的伤害生效是在动画结束之后呢 攻击动画片段只有2秒时长 要在3秒才对敌方造成伤害 那么动画事件就做不到了 计时器 把伤害生效是点交给计时器去操作 攻击的时候开始
  • 网络拓扑的分类

    一 按网络所覆盖的地理范围分类 1 局域网 LAN 局域网Local Area Network 简称 LAN 是一种私有网络 一般在一座建筑物内或建筑物附近 比如家庭 办公室或工厂 局域网络被广泛用来连接个人计算机和消费类电子设备 通过网络
  • swift 之AVFoundation自定义相机界面拍照、录像、保存到相册、合成视频

    1 自定义相机拍照 自定义相机 1 前置和后置摄像头 typedef NS ENUM NSInteger AVCaptureDevicePosition AVCaptureDevicePositionUnspecified 0 AVCapt
  • CVPR 2020

    Editing in Style Uncovering the Local Semantics of GANs 作者 Edo Collins Sabine S sstrunk School of Computer and Communica
  • 笔试题目1

    腾讯笔试 2 假设函数f1的时间复杂度O n 那么f1 f1的时间复杂度为 A O n B O n n C O n log n D 以上都不对 这个题目我的思路是A 讨论后答案应该是D 因为f1的返回值不确定 如果是个数组当然复杂度就不同了
  • linux基础——vim及bash的使用

    vim vim介绍 vim是linux里的文本编辑工具 是vi的升级版的软件 是程序员文本编辑器 用来写程序的工具 安装 yum install vim y 用法 命令模式 yy 复制当前行 5yy 向下复制5行 copy dd 删除 剪切
  • 使用vue里面el-upload,照片反显后,然后再上传照片,发现上传的照片只要最新上传的,之前反显的照片没有了,解决办法如下

    第一步 首先先将照片反显存到两个数组里面如图 第二步 照片上传成功回调里面就在查看添加照片这个数组接着push 就可以了 切记先反显的时候把之前数据添加到里面
  • R Plot添加中文及其他字体【showtext】

    文章目录 前言 R Packages showtext 安装 简单示例 加载字体 更多详见 前言 之前 一个群里的群友 想要在它画的图上加入中文 保存为PDF之后 中文字符也不变成乱码 当时随手推荐了一个R package showtext
  • Linux的shell编程(四)

    六 bash程序的调试 在编程过程中难免会出错 有的时候 调试程序比编写程序花费的时间还要多 shell程序同样如此 shell程序的调试主要是利用bash命令解释程序的选择项 调用bash的形式是 bash 选择项shell程序文件名 几
  • Conda安装失败:Solving environment: failed with initial frozen solve. Retrying with flexible solve.

    Conda安装包安装包出现错误 比如 conda install imutils 出现如下错误 Collecting package metadata current repodata json done Solving environme
  • linux qt通过ps获取进程

    在linux 当中 通过qt 程序获取进程的名称 来对后续进行操作 QProcess m process m process start ps ef if m process waitForFinished const QByteArray
  • 按钮卡片特效代码集锦

    css最好看最全的按钮卡片样式 动画效果大全 纯css样式打造的20款按钮特效和11款卡片合集 喜欢的可以收藏 备开发时使用 按钮代码
  • 机器学习模型评估指标

    在机器学习建模过程中 针对不同的问题 需采用不同的模型评估指标 主要分为两大类 分类 回归 一 分类 1 混淆矩阵 2 准确率 Accuracy 3 错误率 Error rate 4 精确率 Precision 5 召回率 Recall 6
  • 【6】测试用例设计-输入域+输出域+异常分析+错误出错法

    目录 输入域测试 输出域测试 异常分析 错误猜测 输入域测试 极端测试如学生成绩0分 1分 2分 情况很少这种 特殊值如 99 0 99 长时间输入内存溢出 内存泄露 输出域测试 异常分析 异常操作验证系统容错性 出现错误时 故障恢复的能力
  • 泛型和包装类

    1 泛型 1 1泛型的定义 泛型是程序设计语言的一种特性 允许程序员在强类型程序设计语言中编写代码时定义一些可变部分 那些部分在使用前必须作出指明 各种程序设计语言和其编译器 运行环境对泛型的支持均不一样 将类型参数化以达到代码复用提高软件
  • 构建seq2seq模型的常见问题

    1 seq2seq模型 输入是一个词向量 而不是词向量列表 对吧 是的 对于seq2seq模型 输入和输出都需要被转换成词向量形式 对于输入来说 通常会将一个句子转换成一个词向量序列 具体地 对于每个单词或者字符 都会将其对应成一个词向量
  • 广联达C++一面(坐等感谢信)

    括号中是我的回答 自我介绍 介绍一个最近做过的项目 不需要非得是C 相关的 回答了节点属性标注系统 在里面负责哪一部分 介绍了三个部分 说了自己负责的是统计和二阶段预测 主要是用主动探测的方法扩展节点信息 随机性检测是怎么做的 用的什么信息
  • Java EE学习笔记(1:Servlet & JSP)

    Servlet简介 Servlet技术规范是JavaEE技术规范中的一个重要组成部分 Servlet是一种独立于平台和协议的服务器端的Java应用程序 可以生成动态的Web页面 实际上 Servlet不仅仅是用于返回HTML的页面的 比如
  • Python_FontTools使用

    目录 Font Tools的使用 1 fontTools使用总结 2 加载字体文件 3 保存为xml文件 4 获取各节点名称 返回为列表 5 获取getGlyphOrder节点的name值 返回为列表 6 获取cmap节点code与name