ImageFont检测缺少的字形(Python Pillow)

时间:2016-09-04 11:30:55

标签: python python-3.x pillow

这是一个简短的example

from PIL import ImageFont, ImageDraw

draw = ImageDraw.Draw(image)

# use a bitmap font
font = ImageFont.load("arial.pil")

draw.text((10, 10), "hello", font=font)

# use a truetype font
font = ImageFont.truetype("arial.ttf", 15)

draw.text((10, 25), "world", font=font)
  

我想知道字体是否缺少渲染文本中的任何字形。

当我尝试渲染一个缺少的字形时,我得到一个空方格。

draw.text((10, 10), chr(1234), font=font)
  • 如何以编程方式确定缺少的字形?
  • 如何在 ttf 文件中列出可用的字形?

这两个问题几乎相同。

  

我更喜欢使用Pillow来确定我想要的东西。   PyPI的其他模块也很受欢迎。

1 个答案:

答案 0 :(得分:2)

有{' fontTools'包,包括用于读取和查询TrueType字体的python类。这样的事情是可能的

from fontTools.ttLib import TTFont
f = TTFont('/path/to/font/arial.ttf')
print(f.getGlyphOrder())      # a list of the glyphs in the order 
                              # they appear
print(f.getReversedGlyphMap() # mapping from glyph names to Id
id = f.getGlyphID('Euro')     # The internal code for the Euro character, 
                              # Raises attribute error if the character
                              # isn't present.

从字符到字形的映射通常很复杂,并且在字体的cmap表中定义。它是二进制部分,但可以使用

进行检查
f.getTableData('cmap')

字体可以有多个cmap表。 freetype interface也可以读取ttf文件。可以使用freetype来尝试渲染一个角色,并查看结果:这会很慢。

import freetype as ft
face = ft.Face('arial.ttf')
face.set_size(25*32)
face.load_char(‽)
bitmap = face.glyph.bitmap.buffer
if bitmap == [255, 255, 255, 255, 0, 255, 255, 0, 255, 255, 0, 255, 255, 0, 255, 255, 0, 255, 255, 255, 255]:
     print("No interobang in the font")