我正在尝试从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), ...
这种行为的原因是什么?
答案 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)
如果没有更多问题的背景信息,我不知道这对您是否有用。