Объединение 2 команд GraphicsMagick в 1 команду, как в ImageMagick

Я использовал ImageMagick для создания нового измененного изображения с водяным знаком, с помощью этой единственной команды (в PHP):

exec("convert -filter Lanczos {$original_image} -thumbnail {$max_width}x{$max_height} -quality 90 {$watermark} -gravity center -unsharp 2x0.5+0.7+0 -composite {$cached}");

Теперь я переключился на GM и ищу способ запустить 1 команду для выполнения той же задачи. Единственный способ, который я нашел, - разделить его на 2 отдельные команды:

//create the resized image
  exec("gm convert -filter Lanczos {$original_image} -thumbnail {$max_width}x{$max_height} -quality 90 -unsharp 2x0.5+0.7+0 {$cached}");
  //apply the watermark and recreate the watermarked image, overwriting the previously resized image
  exec("gm composite -quality 90 -dissolve 100 -gravity center {$watermark} {$cached} {$cached}");

Есть ли способ объединить их в одну единственную команду и тем самым, возможно, также сократить ресурсы и использование диска?

1 ответ

Решение

На это я получил следующий ответ от Боба Фризенхана, сопровождающего GraphicsMagick:

Вы не сказали, какую версию GraphicsMagick вы используете. Современные версии поддерживают опцию -compose, которая может быть помещена в командную строку после имени входного файла, чтобы запомнить используемый алгоритм компоновки. Этот алгоритм композиции затем используется, если для создания композиции используются операторы -mosaic или -extent. Вы также можете использовать опцию -page после имени входного файла, чтобы найти изображение, когда оно составлено из предыдущих изображений в списке. Из-за слабости обработки команд преобразования в GM операторы -mosaic или -extent должны быть последней командой перед сохранением выходного файла. Я полагаю, что -Moseick в ImageMagick должен быть версией -mosaic, которая добавляет больше возможностей (например, -mosaic может не поддерживать гравитацию, а -composite поддерживает). Похоже, что GraphicsMagick должен реализовывать что-то полностью совместимое с ImageMagick -composite. В любом случае, существует эффективный обходной путь, если вам нужно использовать существующие команды GM. Если у вас есть современный GraphicsMagick, который поддерживает "gm batch", то вы можете использовать кодер "mpr" ("Постоянный реестр Magick") для запоминания промежуточных изображений между командами, и вы можете легко адаптировать свои две команды для выполнения с полной эффективностью, используя существующие командные строки. Этот пример оболочки Unix должен дать вам несколько идей:

{
   echo convert seaworld.jpg mpr:temporary
   echo convert mpr:temporary crap.jpg
} | gm batch -prompt off -echo on
convert seaworld.jpg mpr:temporary
convert mpr:temporary crap.jpg

Обратите внимание, что выходные данные первой команды были сохранены (как дескриптор изображения, который изначально используется в GraphicsMagick) в "mpr: временный", а затем вторая команда взяла ввод из "mpr: временный" и записала окончательный выходной файл. Вы можете использовать произвольные строковые аргументы для mpr:, чтобы вы могли иметь несколько изображений "в полете". При таком подходе вы можете использовать "gm convert" и "gm композитный" в одной пакетной команде. Я не уверен, как лучше всего получить доступ к этому пакетному средству из PHP, но если PHP может передавать на него команды из канала, то он может работать довольно долго в качестве совместного процесса с PHP и сэкономить значительное время вычислений и накладные расходы.

Другие вопросы по тегам