为什么python / pil不能将填充了FF的2d数组保存为完全白色的bmp图像?

时间:2017-03-16 01:08:37

标签: python pillow

下面的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")

创建的图像(黑色的白点而不是完全白色) -

enter image description here

及其十六进制版本显示,不知道所有的FF都没有进入bmp - enter image description here

为什么会出现这种奇怪的行为?

1 个答案:

答案 0 :(得分:1)

由于您的输入类型为intc_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)