Numpy破坏了PIL TiffImageFile的tile属性

时间:2019-01-31 01:31:55

标签: python numpy python-imaging-library tiff

我要打开图像的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.

1 个答案:

答案 0 :(得分:2)

这是Pillow的代码中的问题。方法case执行行self.tile = []。调用TiffImageFile._load_libtiffnp.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属性。我称它为枕头错误,但也许有充分的理由说明这种副作用。