RGB 数组转 PIL 图像

RGB array to PIL image

我有一个 rgb 元组数组

array = [(144, 144, 133), (85, 87, 75), (140, 87, 70), (129, 107, 105), (129, 107, 105), (194, 179, 171), (178, 164, 159), (100, 105, 122), (36, 38, 57), (59, 48, 49), (59, 48, 49), (152, 149,
 148), (152, 149, 148), (0, 0, 0), (0, 0, 0), (98, 81, 84)...]

我想制作一个正方形并更改为 PIL 图片。

    dt = np.dtype('int,int,int')
    array2d = np.array(array, dt)
    
    im_pil = Image.fromarray(obj=array2d.reshape(int(math.sqrt(size)), int(math.sqrt(size))), mode='RGB')
    data = io.BytesIO()
    im_pil.save(data, "bmp")

由于某些我不知道的原因,它将每个数字分开,例如(144,144,133) -> (144,0,0), (0,144,0), (0,0,133), (0,0,0)

我的问题是初始数组的形状吗?还是围绕它的修改? 有任何想法吗?当然我试过 np.array(array, np.uint8) 同样的问题

提前致谢。

我相信,我们的问题出在你的 reshape 函数上。您将数组重塑为形状为 [sqrt(size),sqrt(size)] 的二维数组。您需要的是一个形状为 [sqrt(size),sqrt(size),3](x 维度,y 维度,3 个 RGB 值)的 3d 数组。

要解决你的问题你应该这样做

im_pil = Image.fromarray(obj=array2d.reshape(int(math.sqrt(size)), int(math.sqrt(size)),3), mode='RGB')

而不是这个:

im_pil = Image.fromarray(obj=array2d.reshape(int(math.sqrt(size)), int(math.sqrt(size))), mode='RGB')

试试这个:

arr3d = arr.reshape(2,3,2)
Image.fromarray(arr3d,'RGB').show()