我有一个文件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数组或我的问题的其他解决方案的任何想法将不胜感激。
答案 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 的代码点)。