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

//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 ответ

Я получил от этого ответ от Боба Фрисенхана, MainMain GraphicsMagick:

Вы не сказали, какую версию GraphicsMagick вы используете. Современные версии поддерживают параметр -compose, который можно поместить в командную строку после имени входного файла, чтобы запомнить алгоритм композиции. Этот алгоритм композиции затем используется, если для выполнения композиции используются операторы -mosaic или -extent. Вы также можете использовать опцию -page после имени входного файла, чтобы найти изображение, когда оно составлено с предыдущими изображениями в списке. Из-за слабости в обработке команд GM-преобразования операторы -mosaic или -extent должны быть последней командой перед сохранением выходного файла. Я считаю, что ImageMagick -composite должен быть версией -mosaic, которая добавляет больше возможностей (например, -mosaic может не поддерживать гравитацию, но -composite). Кажется, что GraphicsMagick должен реализовать что-то полностью совместимое с ImageMagick -composite. Несмотря на это, существует эффективный обходной путь, если вам нужно использовать ваши существующие команды GM. Если у вас есть современный GraphicsMagick, который поддерживает "gm batch", вы можете использовать кодер "mpr" ("Магический постоянный реестр") для запоминания промежуточных изображений между командами, и вы можете легко адаптировать ваши две команды для выполнения с полной эффективностью, используя существующие командные строки. Этот пример оболочки 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: tempor" и записала окончательный выходной файл. Вы можете использовать произвольные строковые аргументы для "mpr:", чтобы вы могли иметь несколько изображений "в полете". При таком подходе вы можете использовать "gm convert" и "gm composite" в одной команде. Я не уверен, как лучше всего получить доступ к этому пакетному средству с PHP, но если PHP сможет передавать ему команды из канала, то он может работать довольно долгое время как совлокальный процесс с PHP и экономить значительное время и накладные расходы.

licensed under cc by-sa 3.0 with attribution.