第一次玩PIL(和numpy)。我试图通过mode =' 1'生成黑白棋盘图像,但它不起作用。
from PIL import Image
import numpy as np
if __name__ == '__main__':
g = np.asarray(dtype=np.dtype('uint8'), a=[
[0, 1, 0, 1, 0, 1, 0, 1, ],
[1, 0, 1, 0, 1, 0, 1, 0, ],
[0, 1, 0, 1, 0, 1, 0, 1, ],
[1, 0, 1, 0, 1, 0, 1, 0, ],
[0, 1, 0, 1, 0, 1, 0, 1, ],
[1, 0, 1, 0, 1, 0, 1, 0, ],
[0, 1, 0, 1, 0, 1, 0, 1, ],
[1, 0, 1, 0, 1, 0, 1, 0, ],
])
print(g)
i = Image.fromarray(g, mode='1')
i.save('checker.png')
抱歉浏览器可能会尝试插入这个,但它是一个8x8的PNG。
我错过了什么?
相关PIL文档:https://pillow.readthedocs.org/handbook/concepts.html#concept-modes
$ pip freeze
numpy==1.9.2
Pillow==2.9.0
wheel==0.24.0
答案 0 :(得分:1)
将模式1
与numpy数组一起使用时似乎存在问题。作为解决方法,您可以使用模式L
并在保存之前转换为模式1
。下面的代码片段会生成预期的棋盘格。
from PIL import Image
import numpy as np
if __name__ == '__main__':
g = np.asarray(dtype=np.dtype('uint8'), a=[
[0, 255, 0, 255, 0, 255, 0, 255],
[255, 0, 255, 0, 255, 0, 255, 0],
[0, 255, 0, 255, 0, 255, 0, 255],
[255, 0, 255, 0, 255, 0, 255, 0],
[0, 255, 0, 255, 0, 255, 0, 255],
[255, 0, 255, 0, 255, 0, 255, 0],
[0, 255, 0, 255, 0, 255, 0, 255],
[255, 0, 255, 0, 255, 0, 255, 0]
])
print(g)
i = Image.fromarray(g, mode='L').convert('1')
i.save('checker.png')
答案 1 :(得分:1)
我认为这是一个错误。据报道on Github。虽然有些fix has been commited,但它似乎没有解决这个问题。如果您使用模式“L”,然后将图像转换为模式“1”,一切正常,因此您可以将其用作解决问题的解决方法:
from PIL import Image
import numpy as np
if __name__ == '__main__':
g = np.asarray(dtype=np.dtype('uint8'), a=[
[0, 255, 0, 255, 0, 255, 0, 255, ],
[255, 0, 255, 0, 255, 0, 255, 0, ],
[0, 255, 0, 255, 0, 255, 0, 255, ],
[255, 0, 255, 0, 255, 0, 255, 0, ],
[0, 255, 0, 255, 0, 255, 0, 255, ],
[255, 0, 255, 0, 255, 0, 255, 0, ],
[0, 255, 0, 255, 0, 255, 0, 255, ],
[255, 0, 255, 0, 255, 0, 255, 0, ],
])
print(g)
i = Image.fromarray(g, mode='L').convert('1')
i.save('checker.png')
答案 2 :(得分:0)
正如另一个答案所指出的那样,你遇到了一个Pillow bug,接受的答案很好。
作为PIL / Pillow的替代方案,您可以使用pypng
,或者您可以使用我最近放在github上的numpngw
模块:https://github.com/WarrenWeckesser/numpngw(它包含所有样板文件一个python包,但基本文件是numpngw.py
。)
以下是使用numpngw.write_png
创建棋盘图像的示例。这将创建位深 1 的图像:
In [10]: g
Out[10]:
array([[1, 0, 1, 0, 1, 0, 1, 0],
[0, 1, 0, 1, 0, 1, 0, 1],
[1, 0, 1, 0, 1, 0, 1, 0],
[0, 1, 0, 1, 0, 1, 0, 1],
[1, 0, 1, 0, 1, 0, 1, 0],
[0, 1, 0, 1, 0, 1, 0, 1],
[1, 0, 1, 0, 1, 0, 1, 0],
[0, 1, 0, 1, 0, 1, 0, 1]], dtype=uint8)
In [11]: import numpngw
In [12]: numpngw.write_png('checkerboard.png', g, bitdepth=1)
这是它创建的图像:
答案 3 :(得分:0)
只需使用PyPNG:
import numpy as np
if __name__ == '__main__':
g = np.asarray(dtype=np.dtype('uint8'), a=[
[0, 1, 0, 1, 0, 1, 0, 1, ],
[1, 0, 1, 0, 1, 0, 1, 0, ],
[0, 1, 0, 1, 0, 1, 0, 1, ],
[1, 0, 1, 0, 1, 0, 1, 0, ],
[0, 1, 0, 1, 0, 1, 0, 1, ],
[1, 0, 1, 0, 1, 0, 1, 0, ],
[0, 1, 0, 1, 0, 1, 0, 1, ],
[1, 0, 1, 0, 1, 0, 1, 0, ],
])
print(g)
import png
i = png.from_array(g, mode='L;1')
i.save('checker.png')