无法在 python 中保存 tiff 图像
Unable to save tiff images in python
我正在尝试使用以下代码将图像对象另存为 .tif
图像:
path = ['../data/', str(i-10)]
mask_path = ['../data/', str(i-10), '_mask']
collage = Image.fromarray(collage, 'L')
collage_mask = Image.fromarray(collage_mask, '1')
collage.save(path, 'tiff')
collage_mask.save(mask_path, 'tiff')
一旦我调用Image.fromarray()
函数,它就变成了一个Image对象,所以我不明白为什么save()
调用不起作用。我收到以下错误:
AttributeError Traceback (most recent call last)
<ipython-input-103-350cd5436fc3> in <module>()
14 collage = Image.fromarray(collage, 'L')
15 collage_mask = Image.fromarray(collage_mask, '1')
---> 16 collage.save(path, 'tiff')
17 collage_mask.save(mask_path, 'tiff')
~\Anaconda3\lib\site-packages\PIL\Image.py in save(self, fp, format, **params)
1928
1929 try:
-> 1930 save_handler(self, fp, filename)
1931 finally:
1932 # do what we can to clean up
~\Anaconda3\lib\site-packages\PIL\TiffImagePlugin.py in _save(im, fp, filename)
1523
1524 else:
-> 1525 offset = ifd.save(fp)
1526
1527 ImageFile._save(im, fp, [
~\Anaconda3\lib\site-packages\PIL\TiffImagePlugin.py in save(self, fp)
745 def save(self, fp):
746
--> 747 if fp.tell() == 0: # skip TIFF header on subsequent pages
748 # tiff header -- PIL always starts the first IFD at offset 8
749 fp.write(self._prefix + self._pack("HL", 42, 8))
AttributeError: 'list' object has no attribute 'tell'
我还尝试将第二个参数删除到 save 中,然后将其硬编码到 path
和 mask_path
变量中。但这也没有用。我尝试了 plt.(path, collage, cmap = cm.gray)
并删除了 Image.fromarray()
调用,因为如果我使用 matplotlib,我不需要将它们转换为 Image
对象。但这造成了以下错误:object does not appear to be a 8-bit string path or a Python file-like object
问题与你的第二个参数无关,而是你的第一个参数:
path = ['../data/', str(i-10)]
collage.save(path, 'tiff')
Image.save
的第一个参数是文件名或打开的文件。但是你传递给它的是一个列表。
我不确定你想在这里完成什么。如果你想要像 ../data/1
这样的路径,你需要构建一个字符串,而不是该字符串的一部分的列表和一个数字作为单独的东西。也许是这样的:
path = f'../data/{i-10}'
或者这个:
path = os.path.join('../data/', str(i-10))
如果你想了解回溯,因为它有点令人困惑...... Pillow 在这里做的是它首先尝试将你的参数视为文件名,然后,如果这不起作用,它会尝试将其视为文件对象。所以你得到的异常是关于你的列表不像文件对象那样工作。您可能从没想过它会像文件对象一样工作,而是像文件名一样工作,所以这会让您感到困惑,这是可以理解的。如果 Pillow 通过将错误转换为信息量更大的错误来处理该错误,也许会更好。但一般来说,像 Pillow 这样的 API 试图为必须以不同方式处理的各种不同类型工作,很难为其编写良好的错误处理。
我正在尝试使用以下代码将图像对象另存为 .tif
图像:
path = ['../data/', str(i-10)]
mask_path = ['../data/', str(i-10), '_mask']
collage = Image.fromarray(collage, 'L')
collage_mask = Image.fromarray(collage_mask, '1')
collage.save(path, 'tiff')
collage_mask.save(mask_path, 'tiff')
一旦我调用Image.fromarray()
函数,它就变成了一个Image对象,所以我不明白为什么save()
调用不起作用。我收到以下错误:
AttributeError Traceback (most recent call last)
<ipython-input-103-350cd5436fc3> in <module>()
14 collage = Image.fromarray(collage, 'L')
15 collage_mask = Image.fromarray(collage_mask, '1')
---> 16 collage.save(path, 'tiff')
17 collage_mask.save(mask_path, 'tiff')
~\Anaconda3\lib\site-packages\PIL\Image.py in save(self, fp, format, **params)
1928
1929 try:
-> 1930 save_handler(self, fp, filename)
1931 finally:
1932 # do what we can to clean up
~\Anaconda3\lib\site-packages\PIL\TiffImagePlugin.py in _save(im, fp, filename)
1523
1524 else:
-> 1525 offset = ifd.save(fp)
1526
1527 ImageFile._save(im, fp, [
~\Anaconda3\lib\site-packages\PIL\TiffImagePlugin.py in save(self, fp)
745 def save(self, fp):
746
--> 747 if fp.tell() == 0: # skip TIFF header on subsequent pages
748 # tiff header -- PIL always starts the first IFD at offset 8
749 fp.write(self._prefix + self._pack("HL", 42, 8))
AttributeError: 'list' object has no attribute 'tell'
我还尝试将第二个参数删除到 save 中,然后将其硬编码到 path
和 mask_path
变量中。但这也没有用。我尝试了 plt.(path, collage, cmap = cm.gray)
并删除了 Image.fromarray()
调用,因为如果我使用 matplotlib,我不需要将它们转换为 Image
对象。但这造成了以下错误:object does not appear to be a 8-bit string path or a Python file-like object
问题与你的第二个参数无关,而是你的第一个参数:
path = ['../data/', str(i-10)]
collage.save(path, 'tiff')
Image.save
的第一个参数是文件名或打开的文件。但是你传递给它的是一个列表。
我不确定你想在这里完成什么。如果你想要像 ../data/1
这样的路径,你需要构建一个字符串,而不是该字符串的一部分的列表和一个数字作为单独的东西。也许是这样的:
path = f'../data/{i-10}'
或者这个:
path = os.path.join('../data/', str(i-10))
如果你想了解回溯,因为它有点令人困惑...... Pillow 在这里做的是它首先尝试将你的参数视为文件名,然后,如果这不起作用,它会尝试将其视为文件对象。所以你得到的异常是关于你的列表不像文件对象那样工作。您可能从没想过它会像文件对象一样工作,而是像文件名一样工作,所以这会让您感到困惑,这是可以理解的。如果 Pillow 通过将错误转换为信息量更大的错误来处理该错误,也许会更好。但一般来说,像 Pillow 这样的 API 试图为必须以不同方式处理的各种不同类型工作,很难为其编写良好的错误处理。