Сплит многостраничный TIFF с питоном - PullRequest
7 голосов
/ 09 марта 2012

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

Ответы [ 6 ]

8 голосов
/ 10 августа 2012

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

ImageMagick работал для меня очень хорошо.Если разделить файл 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.

4 голосов
/ 05 апреля 2012

Я использую 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 может выполнять большую часть обработки, поэтому вы, вероятно, сможете достичь желаемого результата одной командой.

1 голос
/ 20 апреля 2016

В следующем примере файл 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
0 голосов
/ 22 мая 2019

После установки ImageMagick в Windows.Попробуйте выполнить следующее в командной строке

1.Проверка преобразования файла ImageMagick в формате tif

magick convert input.tif out.tif

2.Преобразование одного многостраничного файла TIF в несколько файлов

magick convert -verbose input.tif otput.png
0 голосов
/ 09 марта 2012

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

...