Неудачные результаты при пакетном преобразовании с помощью командной строки ImageMagick в Linux

Это моя команда 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 Вот

2

Решение

Я не уверен, что это ответ. Пока что это чистая спекуляция. Так что здесь идет …

Установив ограничения на 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 необходим доступ к промежуточному кэш-память / память пикселей, прежде чем он может доставить окончательный результат.

Эта потребность в хранении пиксельного кэша может быть удовлетворена различными ресурсами:

  • куча памяти,
  • карта анонимной памяти,
  • карта дисковой памяти,
  • прямой диск.

ImageMagick постепенно использует все эти ресурсы:

  • Когда память кучи исчерпана, она сохраняет пиксели на анонимной карте.
  • Когда анонимная карта памяти исчерпана, она создает кэш пикселей на диске и пытается отобразить ее в памяти.
  • Когда память карты памяти исчерпана, она просто использует стандартный дисковый ввод-вывод.

Дисковое хранилище дешевое, но очень медленное: оно примерно на 3 величины (в тысячу раз) медленнее, чем память. Некоторые улучшения скорости (до 5 раз) могут быть получены с помощью сопоставления памяти с дисковым кешем.

ImageMagick знает о различных способах управления количеством этих ресурсов:

  1. Встроенные значения по умолчанию. Этими ограничениями являются: 768 файлов, 3 ГБ области изображения, 1,5 ГБ памяти, карта памяти 3GiB и 18,45 МБ дискового пространства.

  2. policy.xml файл конфигурации. Пожалуйста, посмотрите, что у вас есть policy.xml файл. использование convert -list policy сначала найти местоположение этого файла. Тогда используйте cat /some/path/policy.xml чтобы увидеть его содержание. (Файл использует синтаксис XML. Не забудьте: все, что включено в <!-- а также --> это комментарий!) Он также содержит комментарии, объясняющие различные детали. policy.xml может определить гораздо больше вещей, чем просто ограниченные ресурсы. Настройки в policy.xml иметь приоритет над встроенными значениями по умолчанию, если они определены там.

  3. Переменные среды. Вот список переменных среды, которые могут ограничивать ресурсы IM: MAGICK_AREA_LIMIT (пределы области изображения), MAGICK_DISK_LIMIT (ограничение дискового пространства), MAGICK_FILE_LIMIT (максимальное количество открытых файлов), MAGICK_MEMORY_LIMIT (ограничение кучи памяти), MAGICK_MAP_LIMIT (предел карты памяти), MAGICK_THREAD_LIMIT (максимальное количество нитей лимит) и MAGICK_TIME_LIMIT (максимальное прошедшее время в секундах). Эти переменные среды, если установлены, имеют приоритет над policy.xml Конфигурационный файл

  4. -limit <name> <value> настройки в командной строке. Следующие <names> признаются:

    • width (максимальная ширина изображения). Когда лимит превышен, генерируется исключение и обработка останавливается.
    • height (максимальная высота изображения). Когда лимит превышен, генерируется исключение и обработка останавливается.
    • area (максимальное количество байтов для любого отдельного изображения, которое должно находиться в кэш-памяти пикселей). Когда лимит превышен, включается автоматическое кэширование на диск (возможно, с отображением в памяти).
    • memory (максимальная память, выделенная для кэша пикселей из анонимной отображенной памяти или кучи).
    • map (максимальный объем для карты памяти, выделенной для пиксельного кэша).
    • disk (максимальный объем дискового пространства, разрешенный для использования кешем пикселей). Когда лимит превышен, пиксельный кеш не создан и брошено роковое исключение.
    • files (максимальное количество открытых файлов кэша пикселей). При превышении лимита все последующие пиксели, кэшированные на диск, закрываются и открываются по требованию.
    • thread (максимальное количество потоков, которые могут параллельно).
    • time (максимальное время в секундах, которое процессу разрешено выполнять). Когда этот предел превышен, генерируется исключение, и обработка останавливается.

    -limit настройка в командной строке имеет приоритет и отменяет все остальные настройки.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]