PIL的Image.frombuffer会创建错误的图像

时间:2017-03-28 19:55:35

标签: python numpy python-imaging-library

我正在尝试从1d numpy整数数组创建一个图像,以便对图像中的数组进行更改。似乎Image.frombuffer完全符合我的需要。有我的尝试:

from PIL import Image
import numpy as np

data = np.full(100, 255, dtype = np.int32)
img = Image.frombuffer('RGB', (10, 10), data)
print(list(img.getdata()))

我希望看到一个包含100个元组(0, 0, 255)的列表。但我实际得到的是(0, 0, 255), (0, 0, 0), (0, 0, 0), (0, 255, 0), (0, 0, 0), (0, 0, 0), (255, 0, 0), (0, 0, 0), (0, 0, 255), (0, 0, 0), (255, 0, 0), ...

这种行为的原因是什么?

1 个答案:

答案 0 :(得分:1)

'RGB'每像素使用三个字节。您提供的缓冲区是一个数据类型为numpy.int32的数组,每个元素使用四个字节。所以你有一个不匹配。

处理它的一种方法是使用模式'RGBA'

img = Image.frombuffer('RGBA', (10, 10), data)

这是否是一个好的解决方案取决于你将如何处理图像。

另请注意,RGBA像素的(255,0,0,0)或(0,0,0,255)是否取决于data中整数的endianess

对于RGB图像,可以选择以下方法:

data = np.zeros(300, dtype=np.uint8)
# Set the blue channel to 255.
data[2::3] = 255
img = Image.frombuffer('RGB', (10, 10), data)

如果没有更多问题的背景信息,我不知道这对您是否有用。