使用python拆分多页tiff

使用python拆分多页tiff,python,python-imaging-library,tiff,Python,Python Imaging Library,Tiff,使用python拆分多页TIFF的最佳方法是什么?PIL似乎不支持多页图像,而且我还没有为python的libtiff找到确切的端口。PyLibTiff会是一条路吗?有人能提供一个简单的例子,说明我如何在一个TIFF中解析多个页面吗 您可以将其转换为PDF并使用pyPDF拆分页面我确实使用ImageMagick作为外部程序将多页传真转换为可视PNG: /usr/bin/convert /var/voip/fax/out/2012/04/fax_out_L1_17.tiff[0] -scale 5

使用python拆分多页TIFF的最佳方法是什么?PIL似乎不支持多页图像,而且我还没有为python的libtiff找到确切的端口。PyLibTiff会是一条路吗?有人能提供一个简单的例子,说明我如何在一个TIFF中解析多个页面吗

您可以将其转换为PDF并使用pyPDF拆分页面

我确实使用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

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可以进行大量处理,因此您可能可以在一个命令中实现所需的结果。

一个项目(披露:我是主要作者之一,这个问题是促使我研究它的原因之一)使得这很容易。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)

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开头,也可能不总是以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
真的很神奇!!:)


到文档有更多的细节。这也适用于我的windows计算机。

以下内容将具有多个帧的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
在Windows中安装后。在命令提示符下尝试以下操作

1。测试图像Magick tif文件转换

magick convert input.tif out.tif
2。将一个多页tif文件转换为多个文件

magick convert -verbose input.tif otput.png

我宁愿不转换为PDF,拆分,并转换回TIFF,除非绝对没有其他方法拆分多页TIFF。这似乎是一种向后提取单个页面的方法,但如果我错了,请随时纠正我……PIL对“多图像”文档的支持有限——它至少可以处理动画GIF中的单个帧——不过,我不知道TIFF加载插件是否允许您阅读每个页面。你能发一个链接到你的一个TIFF吗?不幸的是没有。。。我现在处理的材料是敏感的,我不知道如何从头开始生成通用的多页tiff。我尝试过在gimp中导出多个层,但没有效果。你有代码示例吗?我可以在我的机器上试试。你们可以试试Python魔杖。它是建立在ImageMagick的基础上的,可以进行分离。您好,我也有同样的问题,我编写了这个模块来操作多页tiff。您可以打开多页tiff并逐个保存页面。。。如果你真的想在Python中执行,numpy整形的目的是什么?@speedplane因为
getdata
返回图像的一个平坦的可缩放项@tacaswell在“get_frame()”完成后,有没有办法将提取的帧转换为png或jpeg文件?@comproch
PIL.image.fromarray(stack_wrapper_instance.get_frame(i)).save('name.png')
numFramesPerTif-如何计算?它当前未定义。它是多图像tiff文件中的图像数。我不知道如何确定thoughnumFramesPerTif=img.n_帧