拆分多页Tiff文件,并将每个帧/页面保存为一个Tiff



使用Python,我试图导入一个多页tiff文件,按页面/框架将其拆分,然后将每个页面保存为tiff文件。

有两种方法我已经相对接近我想要的结果,但在将分割页保存为tiff时,它们似乎都失败了。

方法1:

from PIL import Image

currentFileName = "image.tif"
currentRevisedFullFileName = "/dbfs/mnt/temp/"+currentFileName
im = Image.open(currentRevisedFullFileName)
numberOfFrames = img.n_frames

for i in range(numberOfFrames):
im.seek(i)
im.save('page_%s.tif'%(i,))

方法2:

from PIL import Image, ImageSequence
currentFileName = "image.tif"
currentRevisedFullFileName = "/dbfs/mnt/temp/"+currentFileName
im = Image.open(currentRevisedFullFileName)
for j, page in enumerate(ImageSequence.Iterator(im)):
pageTifFileName = currentFileName.split(".")[0] + "-" + str(j+1).zfill(3) + ".TIF"
pageTifPathName = "/dbfs/mnt/temp/" + pageTifFileName
page.save(pageTifPathName, "Tiff")

如果我将文件名的后缀从"替换为",则第二种方法非常有效;。TIF";至";。jpg";并用";Jpeg";总体安排然而,当我试图像上面的代码中那样将其保存为Tiff时,我会得到一个错误,指向";page.save(("代码行。

对于这两种方法,我都得到了";RuntimeError:从字典设置"时出错;错误

关于我可以对.save参数进行哪些修改以保存tiff文件,有什么意见吗?

全回溯

RuntimeError                              Traceback (most recent call
last) <command-3375652163217349in <module>
4   print("i = {} and tif file name = {}".format(i, tiff_file))
5   print("tiff_file = {}".format(tiff_file))
----> 6   splitTif(tiff_file)
<command-3558528313119511in splitTif(currentFileName)
10       im.seek(i)
11       print("i = {} imgSeek = {} at position {}".format(i, im.seek(i), im.tell()))
---> 12       im.save('page_%s.tif'%(i,))
13     except EOFError:
14       print("EXCEPTION = {}".format(EOFError))
/databricks/python/lib/python3.7/site-packages/PIL/Image.py in
save(self, fp, format, **params)    2170     2171         try:
-> 2172             save_handler(self, fp, filename)    2173         finally:    2174             # do what we can to clean up
/databricks/python/lib/python3.7/site-packages/PIL/TiffImagePlugin.py
in _save(im, fp, filename)    1638         tags.sort()    1639        
a = (rawmode, compression, _fp, filename, tags, types)
-> 1640         e = Image._getencoder(im.mode, "libtiff", a, im.encoderconfig)    1641         e.setimage(im.im, (0, 0) + im.size) 
1642         while True:
/databricks/python/lib/python3.7/site-packages/PIL/Image.py in
_getencoder(mode, encoder_name, args, extra)
449     except AttributeError as e:
450         raise OSError(f"encoder {encoder_name} not available") from e
--> 451     return encoder(mode, *args + extra)
452 
453 
RuntimeError: Error setting from dictionary

tifftoolspython库可以做到这一点。它可以作为命令行工具(tifftools split <input file>(运行,也可以从python:运行

import tifftools
info = tiff_tools.read_tiff(<input file>)
for ifd in info['ifds']:
tifftools.write_tiff(ifd, <output path>)

该库将在tiff文件中保留与每个图像相关的所有标签,并且不会以任何方式重新压缩图像。

因此,以您的代码为基础,这将是:

import tifftools
currentFileName = "image.tif"
currentRevisedFullFileName = "/dbfs/mnt/temp/"+currentFileName
info = tifftools.read_tiff(currentRevisedFullFileName)
for i, ifd in enumerate(info['ifds']):
tifftools.write_tiff(ifd, 'page_%s.tif'%(i,))

免责声明:我是tifftools的作者。

最新更新