来自 BDF 文件中字符的 Numpy 数组
Numpy array from characters in BDF file
我有一个文件,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 的位图。我找到了一个 pillow 模块,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 图像和 PIL 图像之间进行转换的经验numpy 数组(通常很简单。)
任何有关如何将 PIL 图像正确转换为 numpy 数组或解决我的问题的其他方法的任何想法都将不胜感激。
事实证明,我所看到的意外行为是由于 PIL 中的错误造成的,如以下 SO 问题所述: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]]
为了让@drake-mossman 的答案生效,我必须修改第一行以读取字节格式的文件:
fp = open("font_file.bdf", "rb")
不幸的是,这意味着 BdfFontFile 脚本当前不支持 unicode 字符(或超过 255 的任何代码点)。
我有一个文件,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 的位图。我找到了一个 pillow 模块,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 图像和 PIL 图像之间进行转换的经验numpy 数组(通常很简单。)
任何有关如何将 PIL 图像正确转换为 numpy 数组或解决我的问题的其他方法的任何想法都将不胜感激。
事实证明,我所看到的意外行为是由于 PIL 中的错误造成的,如以下 SO 问题所述: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]]
为了让@drake-mossman 的答案生效,我必须修改第一行以读取字节格式的文件:
fp = open("font_file.bdf", "rb")
不幸的是,这意味着 BdfFontFile 脚本当前不支持 unicode 字符(或超过 255 的任何代码点)。