Многостраничный питон изменения размера TIFF - PullRequest
0 голосов
/ 05 июня 2018

Первый пост здесь, хотя я уже потратил несколько дней на поиск различных запросов здесь.Python 3.6, Обработка подушек и tiff.
Я бы хотел автоматизировать одну из наших ручных задач, изменив размеры некоторых изображений с очень большого до формата А4.Мы работаем в формате TIFF, который иногда (часто) содержит более одной страницы.Поэтому я написал:

from PIL import Image,
...
def image_resize(path, dcinput, file):
    dcfake = read_config(configlocation)["resize"]["dcfake"]
    try:
        imagehandler = Image.open(path+file)
        imagehandler = imagehandler.resize((2496, 3495), Image.ANTIALIAS)
        imagehandler.save(dcinput+file, optimize=True, quality=95)
    except Exception:

Но очень (не) очевидно, что конвертируется только первая страница TIFF.Это не совсем то, что я ожидаю от этой библиотеки, однако попытался копать и нашел способ перечислять каждую страницу из TIFF и сохранять ее как отдельный файл.

 imagehandler = Image.open(path+file)
        for i, page in enumerate(ImageSequence.Iterator(imagehandler)):
            page = page.resize((2496, 3495), Image.ANTIALIAS)
            page.save(dcinput + "proces%i.tif" %i, optimize=True, quality=95, save_all=True)

Теперь я могу использовать imagemagick или некоторые внутренние команды для преобразования нескольких страниц в одну, но это не то, что я хочу делать, так как это приводит к усложнению кода.

Мойвопрос, есть ли единорог, который может помочь мне:
1) изменить размер всех страниц данного многостраничного tiff на лету
2) создать tiff из нескольких tiff
Я бы хотел сосредоточитьсятолько на модулях Python.
Thx.

1 Ответ

0 голосов
/ 08 июня 2018

Посмотрите на этот пример.Это будет половина ширины и высоты каждой страницы TIF:

from PIL import Image
from PIL import ImageSequence
from PIL import TiffImagePlugin

INFILE  = 'multipage_tif_example.tif'
OUTFILE = 'multipage_tif_resized.tif'

print ('Resizing TIF pages')
pages = []
imagehandler = Image.open(INFILE)
for page in ImageSequence.Iterator(imagehandler):
    new_size = (page.size[0]/2, page.size[1]/2)
    page = page.resize(new_size, Image.ANTIALIAS)
    pages.append(page)

print ('Writing multipage TIF')
with TiffImagePlugin.AppendingTiffWriter(OUTFILE) as tf:
    for page in pages:
        page.save(tf)
        tf.newFrame()

Предполагается, что она будет работать с более поздних версий Pillow 3.4.x (работает с версией 5.1.0 на моем компьютере).

Ресурсы:

  • Обсуждаемый AppendingTiffWriter здесь .
  • Образцы TIF-файлов можно загрузить здесь .
...