使用python拆分多页TIFF的最佳方法是什么? PIL似乎不支持多页图像,我没有找到python的libtiff的确切端口。 PyLibTiff会走的路吗?有人可以提供一个简单的例子,说明我如何解析TIFF中的多个页面?
答案 0 :(得分:8)
一个项目(披露:我是主要作者之一,这个问题是促使我研究它的事情之一)这使得这很容易PIMS。 PIMS的核心本质上是以下类的清理和通用版本。
进行基本帧提取+简单迭代的类。
import PIL.Image
class Stack_wrapper(object):
def __init__(self,fname):
'''fname is the full path '''
self.im = PIL.Image.open(fname)
self.im.seek(0)
# get image dimensions from the meta data the order is flipped
# due to row major v col major ordering in tiffs and numpy
self.im_sz = [self.im.tag[0x101][0],
self.im.tag[0x100][0]]
self.cur = self.im.tell()
def get_frame(self,j):
'''Extracts the jth frame from the image sequence.
if the frame does not exist return None'''
try:
self.im.seek(j)
except EOFError:
return None
self.cur = self.im.tell()
return np.reshape(self.im.getdata(),self.im_sz)
def __iter__(self):
self.im.seek(0)
self.old = self.cur
self.cur = self.im.tell()
return self
def next(self):
try:
self.im.seek(self.cur)
self.cur = self.im.tell()+1
except EOFError:
self.im.seek(self.old)
self.cur = self.im.tell()
raise StopIteration
return np.reshape(self.im.getdata(),self.im_sz)
答案 1 :(得分:5)
Imagemagick为我工作真的很棒。 Wnen分割tiff文件,基本上从tiff转换为tiff,可以使用标志强制将输出文件保存到单独的tiff文件。为此,请尝试
convert input.tif output-%d.tif
%d运算符是C-Printf样式%d。因此,如果您需要3场运行序列,您可以说
convert input.tif output-%3d.tif
等等。%d被图像的“场景”编号替换。现在,场景编号可能也可能不总是从0开始(如果你想那样,则为1)。要按照您想要的方式设置序列,请尝试
convert input.tif -scene 1 output-%3d.tif
这将从您提供的计数开始顺序。
convert -scene 1 input.TIF output-%d.TIF
output-1.TIF
output-2.TIF
output-3.TIF
Magick确实!! :)
文档中的This link有更多详细信息。这也适用于我的Windows机器。
答案 2 :(得分:4)
我使用ImageMagick作为外部程序将多页传真转换为可查看的PNG:
/usr/bin/convert /var/voip/fax/out/2012/04/fax_out_L1_17.tiff[0] -scale 50x100% -depth 16 /tmp/fax_images/fax_out_L1_17-0-m.png
会将首页转换为PNG
aaa.tiff [1]将是第二页,依此类推。
或者要提取所有图像,请执行:
convert -verbose fax_in_L1-1333564876.469.tiff a.png
fax_in_L1-1333564876.469.tiff[0] TIFF 1728x1078 1728x1078+0+0 1-bit Bilevel DirectClass 109KiB 0.030u 0:00.030
fax_in_L1-1333564876.469.tiff[1] TIFF 1728x1078 1728x1078+0+0 1-bit Bilevel DirectClass 109KiB 0.020u 0:00.010
fax_in_L1-1333564876.469.tiff[2] TIFF 1728x1078 1728x1078+0+0 1-bit Bilevel DirectClass 109KiB 0.020u 0:00.010
fax_in_L1-1333564876.469.tiff=>a-0.png[0] TIFF 1728x1078 1728x1078+0+0 1-bit Bilevel DirectClass 12KiB 0.030u 0:00.019
fax_in_L1-1333564876.469.tiff=>a-1.png[1] TIFF 1728x1078 1728x1078+0+0 1-bit Bilevel DirectClass 8KiB 0.040u 0:00.039
fax_in_L1-1333564876.469.tiff=>a-2.png[2] TIFF 1728x1078 1728x1078+0+0 1-bit Bilevel DirectClass 32KiB 0.070u 0:00.070
因此,要将一个多页TIFF拆分为多页TIFF,您必须执行:
convert in-12345.tiff /tmp/out-12345.tiff
然后使用临时文件:/ tmp / out-12345 - * .tiff
然而,ImageMagick可以进行大量处理,因此您可以在一个命令中实现所需的结果。
答案 3 :(得分:1)
以下将具有多个帧的tif文件拆分为tif文件,其中每个文件是一帧。
def parse_tif(filePath):
img = Image.open(filePath)
for i in range (numFramesPerTif):
try:
img.seek(i)
img.save('Block_%s.tif'%(i,))
except EOFError: #end of file error
答案 4 :(得分:0)
在Windows中安装ImageMagick之后。在命令提示符下尝试以下操作
1。测试ImageMagick tif文件转换
magick convert input.tif out.tif
2。将一个多页tif文件转换为多个文件
magick convert -verbose input.tif otput.png
答案 5 :(得分:-2)
您可以将其转换为PDF并使用pyPDF分割页面