使用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,))
方法二:
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: error setting from dictionary“错误。
对于要保存的tiff文件,我可以对.save参数进行哪些修改?
完全回溯
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
发布于 2021-06-23 18:41:44
tifftools
python库可以做到这一点。它可以作为命令行工具(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
的作者。
https://stackoverflow.com/questions/68010752
复制相似问题