我要打开图像的url,然后使用PIL的Image.open
方法打开图像。将PIL TiffImageFile转换为numpy数组时,PIL TiffImageFile的tile属性会丢失。
为什么会这样?
我犯错了吗?
这是示例代码:
from urllib.request import urlopen
from PIL import Image
import numpy as np
url = "https://some_url_to_tiff_file"
img = Image.open(urlopen(url))
#If I call img.tile here, the info shows.
img_np = np.asarray(img)
#img_np = np.array(img) also causes a problem
#If I call img.tile here, the list is empty.
答案 0 :(得分:2)
这是Pillow的代码中的问题。方法case
执行行self.tile = []
。调用TiffImageFile._load_libtiff
或np.array(img)
时会调用该方法,因为numpy访问了np.asarray(img)
属性,并且该属性的实现调用了__array_interface__
,后者调用了self.tobytes()
,并在self.load()
实例中导致对TiffImageFile
的调用。
self._load_libtiff()
属性可以在不使用numpy的情况下被意外破坏。例如,
tile
In [25]: img = Image.open('foo.tiff')
In [26]: img.tile
Out[26]: [('tiff_lzw', (0, 0, 499, 630), 0, ('RGB', 'tiff_lzw', False))]
In [27]: img2 = img.convert(mode='RGB')
In [28]: img.tile
Out[28]: []
文档字符串的第一行是“返回此图像的转换后的副本”,因此令人惊讶的是,该方法更改了convert
属性。我称它为枕头错误,但也许有充分的理由说明这种副作用。