Создание и разбиение больших многостраничных изображений TIFF

5236
Karol S

Мне нужно как создавать, так и разбивать многостраничные TIFF-изображения размером от 2 до почти 100 страниц (A4, 300 dpi, 2500 × 3500 px). Задание периодически выполняется скриптом на сервере Linux x64. В настоящее время я использую Imagemagick. Меньшие случаи не представляют никаких проблем, но большие делают.

Мне нужно радикально уменьшить количество памяти, используемой во время операции.

Например, это:

convert *.jpg -compress lzw output.tif 

(70 файлов JPEG) потребляет около 4,6 ГБ ОЗУ, хотя каждый вход составляет менее 2 МБ, результирующий файл - менее 250 МБ.

Обратная операция:

convert input.tif output-%04d.png 

имеет похожие проблемы.

Из того, что я прочитал, это происходит потому, что Imagemagick сначала загружает и декодирует все входные изображения и только после этого начинает кодировать их в выходной файл.

Как я могу создавать и разделять многостраничные изображения TIFF без такого огромного объема памяти? Мне не обязательно использовать ImageMagick, подойдет любой другой бесплатный инструмент.

4
Чтобы взглянуть на это немного: КАЖДОЕ изображение размером 2500 × 3500 пикселей будет занимать как минимум 2500 × 3500 × 3 байта, поскольку оно находится в памяти. Это составляет 26250000 байтов на изображение, всего 1837500000 байтов для 70 изображений. Затем вы создаете ДУБЛИКАТ этого в TIF, всего 3675000000. Затем вы запрашиваете сохранить его с использованием сжатия lzw; некоторые буферы, вероятно, требуются для этого. Возможно, добавьте буферы для записи ... Обработка 70-100 страничных файлов не легка, особенно если страницы не что иное, как растровые изображения. Hannu 9 лет назад 0
@ Ханну Не легко для кого? Реальный мир говорит, что есть концепция потоковых преобразований, и распаковка огромного стека изображений в памяти одновременно - хромая и бесполезная. polkovnikov.ph 8 лет назад 0
Первый пример `convert` выше создает один PAGED tiff. В зависимости от того, как Imagemagick работает внутри, вы МОЖЕТЕ действительно иметь «огромный стек изображений в памяти». Hannu 8 лет назад 0

1 ответ на вопрос

1
tarikki

У меня была такая же проблема сегодня, когда я пытался разделить 1700 изображений, 1G TIF файл. 16 ГБ памяти было недостаточно, затем попытался кэшировать ее на диске, но это было медленно, и он легко исчерпал более 100 ГБ на жестком диске, ничего не добившись (это, вероятно, было ошибкой).

Но, очевидно, Imagemagick может извлечь конкретный tif из исходного файла, не загружая его полностью, поэтому смог разделить больший файл с помощью простого скрипта bash:

END=2000 for ((i=1;i<=END;i++));do echo $i convert bigassfile.tif[$i] -scene 1 split/smallerfile_$i.tif done 

Не знаю, как создать большой файл без нехватки памяти, так что, может быть, это половина ответа?