Это моя команда 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
как скрипт оболочки дает те же результаты.
Поэтому я искал, спрашивал на сервере дискурса IM и запускал эту процедуру на 2 компьютерах с разным дистрибутивом (Debian Wheezy, Ubuntu Server 14.04)
Примечание / РЕДАКТИРОВАТЬ 1: Запуск команды в терминале с тем же файлом дает отличный результат.
РЕДАКТИРОВАТЬ 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,45 МБ дискового пространства.
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
настройка в командной строке имеет приоритет и отменяет все остальные настройки.
Других решений пока нет …