从列表转换为 np 数组到 JPEG 时出错
Error when converting from list to np array to JPEG
在我的代码中,我需要将图像转换为 numpy 数组,然后从数组转换为列表。对列表进行一些更改后,我需要转换回图像,但出现此错误
Traceback (most recent call last):
File "/home/owner/anaconda3/envs/proj1/lib/python3.7/site-packages/PIL/Image.py", line 2714, in fromarray
mode, rawmode = _fromarray_typemap[typekey]
KeyError: ((1, 1, 3), '<i8')
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/owner/PycharmProjects/arrays3/test.py", line 31, in <module>
im = Image.fromarray(b)
File "/home/owner/anaconda3/envs/proj1/lib/python3.7/site-packages/PIL/Image.py", line 2716, in fromarray
raise TypeError("Cannot handle this data type: %s, %s" % typekey)
TypeError: Cannot handle this data type: (1, 1, 3), <i8
我知道错误是由于从数组到列表再返回的转换而发生的,但我不确定为什么。下面是一些产生相同错误但未修改图像数据内容的代码,如打印语句 returns true.
im = Image.open("wp2793461-windows-98-wallpaper-pack.jpg")
a = np.asarray(im)
lst = a.tolist()
b = np.asarray(lst)
print(np.array_equal(a, b))
im = Image.fromarray(b)
im.save("new.jpg")
好难题!我正在查看 a
和 b
之间的区别,发现 numpy 的 dtype
两者不同。
>>> print(a.dtype)
uint8
>>> print(b.dtype)
int64
如果您按以下方式创建 b
,它将再次起作用:
b = np.asarray(lst, dtype=a.dtype)
在我的代码中,我需要将图像转换为 numpy 数组,然后从数组转换为列表。对列表进行一些更改后,我需要转换回图像,但出现此错误
Traceback (most recent call last):
File "/home/owner/anaconda3/envs/proj1/lib/python3.7/site-packages/PIL/Image.py", line 2714, in fromarray
mode, rawmode = _fromarray_typemap[typekey]
KeyError: ((1, 1, 3), '<i8')
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/owner/PycharmProjects/arrays3/test.py", line 31, in <module>
im = Image.fromarray(b)
File "/home/owner/anaconda3/envs/proj1/lib/python3.7/site-packages/PIL/Image.py", line 2716, in fromarray
raise TypeError("Cannot handle this data type: %s, %s" % typekey)
TypeError: Cannot handle this data type: (1, 1, 3), <i8
我知道错误是由于从数组到列表再返回的转换而发生的,但我不确定为什么。下面是一些产生相同错误但未修改图像数据内容的代码,如打印语句 returns true.
im = Image.open("wp2793461-windows-98-wallpaper-pack.jpg")
a = np.asarray(im)
lst = a.tolist()
b = np.asarray(lst)
print(np.array_equal(a, b))
im = Image.fromarray(b)
im.save("new.jpg")
好难题!我正在查看 a
和 b
之间的区别,发现 numpy 的 dtype
两者不同。
>>> print(a.dtype)
uint8
>>> print(b.dtype)
int64
如果您按以下方式创建 b
,它将再次起作用:
b = np.asarray(lst, dtype=a.dtype)