来自BDF文件中字符的Numpy数组

时间:2016-08-12 17:59:54

标签: python numpy fonts bitmap python-imaging-library

我有一个文件font_file.bdf,需要将其中包含的字符作为numpy数组,其中每个元素都是一个像素。

这是该文件的片段,用于定义'?'字符:

STARTCHAR question
ENCODING 63
SWIDTH 1000 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
70
88
08
10
20
00
20
ENDCHAR

我研究了.bdf文件,以了解它们如何编码数据。基本上,它是位深度为1的位图。我找到了一个枕头模块PIL.BdfFontFile,它可以解释bdf文件。在尝试了这个模块一段时间之后,我能够为字体中的每个字符获取PIL图像并保存它们,看它是否正常工作:

from PIL.BdfFontFile import BdfFontFile

fp = open("font_file.bdf", "r")
bdf_file = BdfFontFile(fp)
bdf_file.compile()
char = '?'
_, __, bounding_box, image = bdf_file[ord(char)]
image.save(char + ".png")

保存的图片如下所示:Question Mark。从它的属性来看它的深度为1,这是有道理的。 (我不确定为什么它似乎倒置了,但如果仍然需要,我可以用numpy进行那种操作。)

有了这个,我试着转换成一个numpy数组:

print numpy.array(image, dtype=numpy.int)

给了我一个不再代表相应角色的数组:

[[1 1 1 1 1]
 [0 1 0 1 1]
 [1 1 1 1 1]
 [1 1 1 1 0]
 [1 0 1 0 1]
 [1 0 1 1 1]
 [0 1 1 1 1]]

我希望看起来像这样的东西:

[[0 1 1 1 0]
 [1 0 0 0 1]
 [0 0 0 0 1]
 [0 0 0 1 0]
 [0 0 1 0 0]
 [0 0 0 0 0]
 [0 0 1 0 0]]

最糟糕的情况是,我自己可以制作一个算法,将PIL图像中的数据转换为numpy数组,但考虑到我之前在PIL图像和numpy数组之间进行转换的经验,我觉得必须有一个更简单的方法(它通常很直接。)

有关如何将PIL图像正确转换为numpy数组或我的问题的其他解决方案的任何想法将不胜感激。

2 个答案:

答案 0 :(得分:0)

事实证明,我看到的意外行为是由于这个SO问题中描述的PIL中的错误:Error Converting PIL B&W images to Numpy Arrays

因此,解决我的问题的关键是在创建numpy数组之前将图像转换为灰度。

我的最终解决方案是对所描述的格式进行小的numpy转换,如下所示:

fp = open("font_file.bdf", "r")
bdf_file = BdfFontFile(fp)
bdf_file.compile()
char = '?'
_, __, bounding_box, image = bdf_file[ord(char)]
print numpy.array(image.convert('L')) / 255

给了我这个:

[[0 1 1 1 0]
 [1 0 0 0 1]
 [0 0 0 0 1]
 [0 0 0 1 0]
 [0 0 1 0 0]
 [0 0 0 0 0]
 [0 0 1 0 0]]

答案 1 :(得分:0)

为了让我得到@drake-mossman 的回答,我不得不修改第一行以读取字节格式的文件:

fp = open("font_file.bdf", "rb")

不幸的是,这意味着 BdfFontFile 脚本目前不支持 unicode 字符(或任何超过 255 的代码点)。