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

PIL's Image.frombuffer creates wrong image

我正在尝试从 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), ...

这种行为的原因是什么?

'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)

没有更多关于问题的上下文,我不知道这对你是否有用。