Это моя IM-команда:
/usr/bin/convert 'src.tif' -limit memory 0 -limit map 0 -limit file 0 -alpha transparent -clip -alpha opaque -resize 800x600 'end.png' 2>&1
Таким образом, это удалит белый фон моего TIFF, отсекая путь, указанный в файле. Он будет изменен и сохранен как прозрачный PNG.
Я не получил никаких ошибок от IM, запускающих это.
Но если я запустил эту команду с PHP, чтобы выполнить ее около 13000 файлов, я иногда получаю эти ошибки:
sh: line 1: 25065 Killed /usr/bin/convert \ 'public_html/source_files/XXXX123/XXXX123/XXXX123.tif' \ -limit memory 0 -limit map 0 -limit file 0 -alpha transparent \ -clip -alpha opaque -resize 800x600 \ 'public_html/converted/XXXX123/XXXX123/XXXX123_web.png' 2>&1 sh: line 1: 25702 Killed /usr/bin/convert \ 'public_html/source_files/XXXX123/XXXX123/XXXX123.tif' \ -limit memory 0 -limit map 0 -limit file 0 -alpha transparent \ -clip -alpha opaque -resize 800x600 \ 'public_html/converted/XXXX123/XXXX123/XXXX123_web.png' 2>&1
Но большая проблема: некоторые из фотографий сломаны. Ниже «плохое» изображение слева, «хорошее» изображение справа (ondrag / на темном фоне вы видите проблему лучше):
При запуске команды вручную результат был в порядке. Только при запуске этого скрипта PHP-скрипта будут отображаться неверные результаты. ( PHP-скрипт )
Я запускаю сценарий таким образом: php55 run.php
. Простой цикл с find
как shell-скрипт обеспечивает одинаковые результаты.
Поэтому я искал, задал на сервере обмена сообщениями IM и запускал эту процедуру на двух машинах с разным дистрибутивом (Debian Wheezy, Ubuntu Server 14.04)
Примечание / РЕДАКТИРОВАНИЕ 1: Выполнение команды в терминале с тем же файлом обеспечивает идеальный результат.
EDIT 2: Добавлен пример файла TIFF здесь
Я не уверен, что это ответ. Пока это чистое предположение. Итак, здесь идет …
Установив ограничения на значение 0
, вы в основном говорите ImageMagick: «Ваши ресурсы не ограничены вообще. Вам не нужно заботиться о каких-либо ограничениях».
Что делать, если не было предела? Удалите все -limit ... 0
частей из вашей команды. В этом случае ImageMagick будет использовать встроенные значения по умолчанию или другие параметры (которые могут содержаться в файле policy.xml вашей установки IM или через различные переменные среды ). Вы можете запросить текущие пределы вашей системы с помощью следующей команды:
identify -list resource
В моей системе я получаю следующие значения:
File Area Memory Map Disk Thread Throttle Time --------------------------------------------------------------------------- 192 4.295GB 2GiB 4GiB unlimited 1 0 unlimited
Что делать, если вы установили эти ограничения на разумную величину, которая соответствует действительно доступным ресурсам вашей системы? Предполагая, что у вас есть: 8 ГБ ОЗУ, 50 ГБ свободного места на диске и множество свободных инодов на вашем диске. Затем попробуйте установить его следующим образом: -limit disk 10GB -limit memory 3GB -limit map 6GB
.
Для всех своих этапов обработки и промежуточных шагов ImageMagick нуждается в доступе к кеш-памяти / хранилищу промежуточных пикселей , прежде чем он сможет доставить конечный результат.
Эта потребность в хранилище кеш-памяти может быть удовлетворена различными ресурсами:
ImageMagick использует все эти ресурсы постепенно:
Дисковое хранилище дешево, но очень медленно: оно находится в 3-х величинах (в тысячу раз) медленнее памяти. Некоторые улучшения скорости (до 5 раз) могут быть получены с помощью сопоставления памяти в кэш на основе диска.
ImageMagick знает о различных способах управления объемом этих ресурсов:
Встроенные значения по умолчанию . Эти ограничения: 768 файлов, 3 ГБ области изображения, 1,5 ГБ памяти, карта памяти 3GiB и 18,45EB дискового пространства.
policy.xml
конфигурации policy.xml
. Посмотрите, что находится в вашем собственном файле policy.xml . Используйте convert -list policy
чтобы сначала найти местоположение этого файла. Затем используйте cat /some/path/policy.xml
чтобы увидеть его содержимое. (Файл использует синтаксис XML. Не забывайте: все, что содержится в <!--
и -->
является комментарием!) В нем также содержатся комментарии, объясняющие различные детали. Policy.xml может определять гораздо больше, чем только доступные ресурсы ограничения. Настройки в файле policy.xml имеют приоритет над встроенными значениями по умолчанию, если они определены там.
Переменные среды . Ниже приведен список переменных среды, которые могут ограничить ресурсы IM: MAGICK_AREA_LIMIT
(пределы области изображения), MAGICK_DISK_LIMIT
(ограничение на пробел на диске), MAGICK_FILE_LIMIT
(максимальное ограничение количества открытых файлов), MAGICK_MEMORY_LIMIT
(ограничение памяти кучи), MAGICK_MAP_LIMIT
(ограничение карты памяти ), MAGICK_THREAD_LIMIT
(максимальное ограничение количества потоков) и MAGICK_TIME_LIMIT
(максимальное истекшее время в секундах). Эти переменные среды, если они установлены, имеют приоритет над файлом конфигурации policy.xml .
-limit <name> <value>
в командной строке . Признаются следующие <names>
:
width
(максимальная ширина изображения). Когда предел превышен, исключение прекращается и обработка прекращается. height
(максимальная высота изображения). Когда предел превышен, исключение прекращается и обработка прекращается. area
(максимальное количество байтов для любого отдельного изображения, которое должно находиться в пиксельной кеш-памяти). Когда предел превышен, наступает автоматическое кэширование на диск (возможно, с отображением памяти). memory
(максимальная память, выделенная для кеша пикселей из анонимной отображаемой памяти или кучи). map
(максимальное количество для карты памяти, выделенной для кеша пикселей). disk
(максимальный объем дискового пространства, разрешенный для использования кешами пикселей). Когда предел превышен, кеш пикселя не создается и генерируется фатальное исключение. files
(максимальное количество открытых файлов кеш-пикселей). Когда предел превышен, все последующие пиксели, кэшированные на диск, закрываются и снова возобновляются по требованию. thread
(максимальное количество потоков, которое может параллельно). time
(максимальное время в секундах, которое разрешено выполнить процессу). Когда этот предел выдается, происходит исключение и прекращение обработки. Параметр -limit
в командной строке принимает приоритет и отменяет все остальные настройки.