下面的 python/pillow 代码创建一个 150x150 数组并用 255/FF 填充它,然后将其保存为 bmp。但保存的图像并不是预期的白色 bmp。相反,它看起来像一个点缀着白色的黑色图像。这是为什么?
c = [[(255, 255, 255)]*150 for i in range(150)]
ci = 0
cj = 0
for ci in range(150):
for cj in range(150):
c[ci][cj] = (255, 255, 255) #Also tried with 0/255 transparency and in hex etc.
c_array = np.asarray(c)
im2 = Image.fromarray(c_array, mode="RGB")
im2.save("test.bmp")
创建图像(黑色上有白点,而不是全白)-
及其十六进制版本显示,不知何故,并非所有 FF 都进入了 bmp -
为什么会有这种奇怪的行为?
由于您的输入类型是 int
,c_array
会将您的数据存储为 int32(或 int64,请参阅 numpy 的 default behavior for int
)。
>>> c = [[(255, 255, 255)]*150 for i in range(150)]
>>> c_array = np.asarray(c)
>>> c_array.dtype
dtype('int32')
在 Image.fromarray
中导入时,c_array
被视为 int8
的字节串,因为您指定了 mode="RGB"
(3x8-bit pixels) 。由于每个元素都是 int32,因此每个值的字节串为 \xff\x00\x00\x00
,从而创建您看到的图像。
更简单的更正方法是指定 numpy 数组的类型:
c_array = np.asarray(c, dtype=np.uint8)
我是一名优秀的程序员,十分优秀!