PIL未生成图像。
PIL未生成图像。
我对PIL不太了解,所以我在尝试使用其中的函数时遇到了问题:
从PIL库中导入Image模块
导入numpy库
创建一个3x3像素的图像数组:
[[[0, 0, 0],
[255, 255, 255],
[0, 0, 0]],
[[255, 255, 255],
[0, 0, 0],
[255, 255, 255]],
[[0, 0, 0],
[255, 255, 255],
[0, 0, 0]]]
使用数组创建一个图像对象
显示图像
然而,当我想要使用它时,却在第13行出现了以下错误:
TypeError
无法处理此数据类型:(1, 1, 3), 但令人惊讶的是,当我使用 Image.png (该图像非常小,仅为3x3像素) 似乎没有其他人遇到同样的问题,或者我可能遗漏了什么。image_array = np.array(Image.open('Image.png'))
时,它没有报错,而这个图像和数组与之前完全相同:
PIL无法生成图像的问题可能是由于以下原因导致的:使用np.array()
创建的图像数组的数据类型为int64
,而不是np.uint8
。为了检查数据类型,可以使用print(image_array.dtype)
。由于数据类型不正确,这将导致图像占用的内存空间是必要的8倍。为了避免创建一个不必要大的图像数组,然后通过创建另一个版本来更正,这个版本现在需要的内存空间是原来的9倍,建议在第一次创建时就使用正确的数据类型。因此,应该使用以下代码创建图像数组:image_array = np.array([[[0, 0, 0], [255, 255, 255], [0, 0, 0]], [[255, 255, 255], [0, 0, 0], [255, 255, 255]], [[0, 0, 0], [255, 255, 255], [0, 0, 0]]], dtype=np.uint8)
。
问题原因:在使用PIL库将数组转换为图像时,可能会出现PIL无法形成图像的问题。这通常是由于数组的数据类型不正确所致。
解决方法:可以尝试使用数据类型转换或在定义数组时使用dtype=np.unit8
参数来解决该问题。另外,如果内存是一个问题,也可以直接使用np.array([[],[],[]], dtype=np.unit8)
来定义数组。如果想要构建一个int64类型的数组,可以在将其传递给PIL之前使用copy=False
来返回原始数组而不是副本。
在使用PIL库将数组转换为图像时,如果出现PIL无法形成图像的问题,可以通过进行数据类型转换或在定义数组时使用正确的数据类型来解决。此外,还可以使用copy=False
来返回原始数组,避免创建副本。