在使用字体渲染某些字符时,有可能渲染出空白或者“口”字形,原因在于该字体文件中不包含该字符的字形。

可能的原因包括:

  1. 字符不在字体的cmap表中(cmap表是字体文件声明的支持字符表);
  2. 字符不在字体的glyf表中(glyf表是字体文件中实际包含的字形,类似svg描述);
  3. 未知原因,需要人工进行查看,有些字体比较坑,缺失的字体就随便填个glyf。
    第一种原因的检测方法:

首先我们查看TTFont定义:ttFont: Read/write OpenType and TrueType fonts

可选的参数,还是比较多的

一般我们这样使用:

            ttf = TTFont(font_path, 0, allowVID=0, ignoreDecompileErrors=True, fontNumber=-1)
from fontTools.ttLib import TTFontch = '你'font_path = 'test.ttf'
font = TTFont(font_path)found = False
for table in font['cmap'].tables:if ord(ch) in table.cmap.keys():found = Truebreak

疑惑1. tables是什么?

font有很多节点cmap是其中一个

疑惑2. for table in font['cmap'].tables为什么还需要遍历?
tables有很多类型,所以需要全部遍历一下

TrueType/OpenType Table Modules

疑惑3. table.cmap.keys()是什么样的结构?

使用Python库判断字符是否在字体里

它是一个dict,然后key是unicode编码,value是名字。

疑惑4. ordchr函数是什么?

第二种原因的检测方法:

from fontTools.ttLib import TTFontch = '你'font_path = 'test.ttf'
font = TTFont(font_path)
glyph_name = None
for table in font['cmap'].tables:glyph_name = table.cmap.get(ord(ch))if glyph_name is not None:break
if glyph_name is not None:glyf = font['glyf']found = glyf.has_key(glyph_name) and glyf[glyph_name].numberOfContours > 0
else:found = False

参考

  1. https://stackoverflow.com/questions/47948821/python-imagefont-and-imagedraw-check-font-for-character-support
  2. https://zhuanlan.zhihu.com/p/54379490
  3. https://github.com/fonttools/fonttools/blob/master/Lib/fontTools/ttLib/tables/_g_l_y_f.py
  4. https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6glyf.html
  5. https://github.com/fonttools/fonttools/blob/master/Lib/fontTools/ttLib/tables/_c_m_a_p.py
  6. https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6cmap.html

fontTools库来检测字体文件中是否包含某字符相关推荐

  1. 可以使用FontForge查看TTC字体文件中,包含哪些字体

    FontForge Releases · fontforge/fontforge · GitHub 下载安装( 略) 启动FontForge 打开字体文件 这个文件中,包含两个字体:宋体,新宋体.图中 ...

  2. vue+python把woff字体文件中的字体全部读取出来

    获取woff字体文件的字符编码 from fontTools.ttLib import TTFontfont = TTFont("7ef51293.woff") extraName ...

  3. ML之xgboost:解读用法之xgboost库的core.py文件中的get_score(importance_type=self.importance_type)方法

    ML之xgboost:解读用法之xgboost库的core.py文件中的get_score(importance_type=self.importance_type)方法 目录 xgboost之skl ...

  4. python查询字符串是否包含某字符串_python 判断检测字符串中是否包含指定字符或字符串(比如:?)...

    in: 10px auto; padding: 0px; color: rgb(17, 17, 17); font-family: Verdana, Arial, Helvetica, sans-se ...

  5. python判断字符串里的字符_python 判断检测字符串中是否包含指定字符或字符串(比如:?)...

    in: 10px auto; padding: 0px; color: rgb(17, 17, 17); font-family: Verdana, Arial, Helvetica, sans-se ...

  6. python判断字符串里的字符_Python检测字符串中是否包含某字符集合中的字符

    目的 检测字符串中是否包含某字符集合中的字符 方法 最简洁的方法如下,清晰,通用,快速,适用于任何序列和容器 def containAny(seq,aset): for c in seq: if c ...

  7. 知其然(3)*.java文件中可以包含多个类,但最多只能有一个类,其修饰符为public

    *.java文件中可以包含多个类,但最多只能有一个类,其修饰符为public. 测试1:文件名Dog.java,文件内容如下:[2个类均为public] public class Dog{Dog(){ ...

  8. Spark从本地文件中统计包含某个字母的行数

    Spark从本地文件中统计包含某个字母的行数: import org.apache.spark.SparkConf; import org.apache.spark.sql.Dataset; impo ...

  9. Java main方法_解释Java中的main方法,及其作用_一个java文件中可包含多个main方法

    public static void main(String[] args) {} 或者 public static void main(String args[]) {} main方法是我们学习Ja ...

最新文章

  1. Linux内存管理学习3 —— head.S中的段页表的建立
  2. linux+shell+整数计算器,Shell(())实现对整数进行数学运算
  3. typeScript面试必备之-通识七:typeScript中的可索引接口(数组,对象)+类类型接口...
  4. Linux(Ubuntu,Cent OS)环境安装mkfontscale mkfontdir命令以及中文字库
  5. php下载文件代码 数据库,PHP备份数据库生成SQL文件并下载的函数代码
  6. mysql主从复制时间配置_MySQL主从复制配置
  7. 编写一个程序,计算|X-Y|的值,并将结果存入RESULT单元中,其中X和Y都为带符号字数据。
  8. rebase参数以及注意事项
  9. Android studio 老虎机小游戏
  10. 超详细的Python实现百度云盘模拟登陆(模拟登陆进阶)
  11. 班长团支书福音——爬虫+腾讯云短信平台实现自动提醒同学体温上报 【附源码】
  12. php计算指数函数,指数函数运算法则公式有哪些
  13. tplink连接服务器失败_tplink路由器网络已连接但是上不了网怎么办?
  14. Android 获取日历日程事件
  15. 【学术版】《最强大脑记忆力训练教程》
  16. 通往财富自由之路详细笔记(16)
  17. 信息安全结业复习题(选择 + 填空 + 简答 + 计算 + 设计 )含历年考题
  18. 现代漫威联名钢铁侠车型开售 售价21.55万元起
  19. GNSS星历数据读取
  20. Ant Design of Vue 中 日期时间控件 禁止选中的(日期——)设置

热门文章

  1. 纽约大学理工学院:MULTIMEDIA SIGNAL COMPRESSION: SPEECH AND
  2. 计算机无法识别移动硬盘怎么办,电脑识别不出来移动硬盘怎么办
  3. php中调整图片大小,php 调整图片尺寸的简单示例
  4. android自动夜间模式,夜晚的故事(android夜间模式实现)
  5. 华中科技大学计算机视觉张朋,计算机视觉与深度学习前沿研讨会圆满举办
  6. CSR蓝牙开发资源大全(软件代码资料)
  7. linux C语言多线程 轻进程 LWP:Light Weight Process
  8. oracle使用decode实现竖表转横表 (列转行)
  9. CNAS仪器校准人员需要遵守哪些规范?
  10. linux中dd命令增加内存使用率,Linux 下使用 dd 命令进行硬盘 I/O 性能检测