下面的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")
创建的图像(黑色的白点而不是完全白色) -
为什么会出现这种奇怪的行为?
答案 0 :(得分:1)
由于您的输入类型为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)