Сплит многостраничный tiff с python

каков наилучший способ разделить многостраничный TIFF с python? PIL, похоже, не поддерживает многостраничные изображения, и я не нашел точный порт для libtiff для python. Будет ли PyLibTiff путь идти? Может ли кто-нибудь привести простой пример того, как я могу анализировать несколько страниц в TIFF?

5 ответов


Я использую ImageMagick в качестве внешней программы для преобразования многостраничного факса в видимые PNGs:

/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-*.Тифф

Однако ImageMagick можно сделать много обработки, так что вы можете достичь желаемого результата в одной команде.


проект (раскрытие: который я один из главных авторов, этот вопрос был одним из вещей, которые побудили меня работать над ним), который делает это легко, это 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)

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

магия в самом деле!! :)

этой ссылке к документации имеет больше деталей. Это работает и на моей машине 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

вы можете преобразовать его в PDF и использовать pyPDF для разделения страниц