Инструмент обрезки изображения (Python)

Я пленочный фотограф, который много занимается кадрированием/изменением размера изображения. Поскольку я снимаю на пленку, мне приходится сканировать негативы и обрезать каждый кадр из пакетного сканирования. Мой сканер сканирует четыре полосы по шесть изображений в каждой (24 кадра/кропа за сканирование).

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

Из сканирования каждый кадр должен создавать TIFF размером 37 МБ с разрешением 240 точек на дюйм (когда я обрезаю и экспортирую в Adobe Lightroom). Вместо этого Cropper выводит TIFF размером 13 МБ с разрешением 72 DPI.

Терминал (я на Mac) предупреждает меня о «декомпрессионной бомбе» всякий раз, когда я запускаю Cropper. Мой друг в тупике и предложил спросить Stack Overflow.

У меня нет опыта работы с Python. Я могу предоставить код, который он написал, и команды, которые дает мне Терминал.

Мысли? Это было бы очень признательно и позволило бы сэкономить ОГРОМНОЕ время. СПАСИБО!

ERROR MESSAGE: /Library/Python/2.7/site-packages/PIL/Image.py:2192: DecompressionBombWarning: Image size (208560540 pixels) exceeds limit of 89478485 pixels, could be decompression bomb DOS attack.

person Macca    schedule 06.09.2014    source источник


Ответы (2)


PIL просто пытается защитить вас. Он не будет открывать большие изображения, так как это может быть вектором атаки для злоумышленника, который даст вам большое изображение, которое будет расширяться, чтобы использовать всю память. Цитата из PIL.Image.open() документации:

Предупреждение: для защиты от потенциальных DOS-атак, вызванных «декомпрессионными бомбами». (т. е. вредоносные файлы, которые распаковываются в огромное количество данных и предназначены для сбоя или нарушения работы из-за использования большого количества памяти), Pillow выдаст DecompressionBombWarning, если образ превышает определенный предел.

Поскольку вы не являетесь злоумышленником и не принимаете изображения ни от кого другого, вы можете просто отключить ограничение:

from PIL import Image

Image.MAX_IMAGE_PIXELS = None

Параметр Image.MAX_IMAGE_PIXELS вообще отключает проверку. Вы также можете установить его в (высокое) целочисленное значение; значение по умолчанию — 1024 * 1024 * 1024 // 4 // 3, почти 90 миллионов пикселей или около 250 МБ несжатых данных для 3-канального изображения.

Обратите внимание, что для версий PIL до 4.3.0 по умолчанию происходит только выдача предупреждения. Вы также можете отключить предупреждение:

import warnings
from PIL import Image

warnings.simplefilter('ignore', Image.DecompressionBombWarning)

И наоборот, если вы хотите полностью запретить загрузку таких изображений, превратите предупреждение в исключение:

import warnings
from PIL import Image

warnings.simplefilter('error', Image.DecompressionBombWarning)

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

Начиная с PIL v5.0.0 (выпущено в январе 2018 г.), изображения, использующие удвоенное количество пикселей в качестве значения MAX_IMAGE_PIXELS, приведут к исключению PIL.Image.DecompressionBombError.

Обратите внимание, что эти проверки также применяются к операции Image.crop()< /a> (вы можете создать большое изображение, обрезав его), и вам необходимо использовать версию PIL 6.2.0 или новее (выпущено в октябре 2019 г.), если вы хотите воспользоваться этой защитой при работе с файлами GIF или ICO.

person Martijn Pieters    schedule 06.09.2014
comment
Благодарю вас! Этот бит об отключении ограничения пикселей только что сэкономил мне ЧАСЫ, пытаясь понять, как с этим справиться. - person coredumperror; 09.05.2018
comment
@buran: спасибо за предупреждение! Это важная деталь, поэтому я обновил свой ответ. - person Martijn Pieters; 07.04.2020

Из документов по Pillow:

Предупреждение. Для защиты от потенциальных DOS-атак, вызванных "декомпрессионными бомбами" (т.е. вредоносные файлы, которые распаковываются в огромный объем данных и предназначены для сбоя или нарушения работы из-за использования большого количества памяти), Pillow выдаст DecompressionBombWarning, если образ превышает определенный предел. При желании предупреждение можно превратить в ошибку с помощью warnings.simplefilter('error', Image.DecompressionBombWarning) или полностью подавить с помощью warnings.simplefilter('ignore', Image.DecompressionBombWarning). См. также документацию по ведению журнала, чтобы предупреждения выводились в средство ведения журнала вместо stderr.

person Hugo    schedule 09.09.2014