你没有 764 字节,因为如果你太短就会抛出异常:
>>> Image.frombytes('1', [79, 78], bytes(764))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/mjpieters/Development/venvs/stackoverflow-3.7/lib/python3.7/site-packages/PIL/Image.py", line 2331, in frombytes
im.frombytes(data, decoder_name, args)
File "/Users/mjpieters/Development/venvs/stackoverflow-3.7/lib/python3.7/site-packages/PIL/Image.py", line 786, in frombytes
raise ValueError("not enough image data")
ValueError: not enough image data
虽然您可以制作 784 字节的过大图像:
>>> Image.frombytes('1', [79, 78], bytes(784))
<PIL.Image.Image image mode=1 size=79x78 at 0x104D2ACF8>
PIL 接受的 79 x 78 图像的最小字节数是 780 字节。因为您正在创建一个'1' 模式图像,所以每个字节都有 8 个像素,因此您只需要math.ceil(79 / 8),即每行 10 个字节。
要查看bytes 对象的长度,请打印len() 函数结果:
>>> with open('data0', 'rb') as f:
... letter_data = f.read(28 * 28)
... print(len(letter_data))
...
784
但是,您对数据使用了错误的模式。 '1' 是一种on 或off 的图像格式,只有0 或1 有意义。图像训练数据每像素使用一个完整字节或 256 个可能的值,因此您希望使用 'L' 模式加载它:
letter_image = Image.frombytes('L', (28, 28), letter_data)
使用'L'时,会使用每个字节的全部256个可能值,并且必须传入28 * 28字节,否则如果真的只有764字节就会报错:
>>> image = Image.frombytes('L', (28, 28), letter_data[:764])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/mjpieters/Development/venvs/stackoverflow-3.7/lib/python3.7/site-packages/PIL/Image.py", line 2331, in frombytes
im.frombytes(data, decoder_name, args)
File "/Users/mjpieters/Development/venvs/stackoverflow-3.7/lib/python3.7/site-packages/PIL/Image.py", line 786, in frombytes
raise ValueError("not enough image data")
ValueError: not enough image data
使用letter_image.save('/tmp/0.png'),data0 中的第一张图片导出为 PNG 图像,如下所示: