Использование стеков в ImageMagick для выборочного размытия части изображения

Я пытаюсь аннотировать некоторый текст на базовое изображение с помощью тени. Мне не нравятся результаты, которые я получаю при использовании параметра -shadow, поэтому я кладу текст, размываю его, затем снова кладу текст белым цветом, смещенным на несколько пикселей от тени. Вот команда, которую я использую:

convert base_image.jpg \
        -font TT0590M_.ttf \
        -fill gray30 \
        -annotate +0+0 '' -gravity North \
        -annotate +72+32 'ABCDEFGHIJKLM' \
        -blur 0x4 \
        -fill white \
        -annotate +72+27 'ABCDEFGHIJKLM' \
        combined.png

Моя проблема в том, что параметр -blur размывает не только первый слой текста, но и основное базовое изображение. Я хочу, чтобы размывался только первый слой текста, а не базовое изображение.

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

convert base_image.jpg \
        -font TT0590M_.ttf \
        -fill gray30 \
        -annotate +0+0 '' -gravity North \
        \( -annotate +72+32 'ABCDEFGHIJKLM' \
        -blur 0x4 \) \
        -fill white \
        -annotate +72+27 'ABCDEFGHIJKLM' \
        combined.png

Результаты те же — и тень текста, и лежащее в основе базовое изображение размываются. Боюсь, мне не очень повезло в понимании стеков или других команд, которые я должен использовать, чтобы получить эффект, который мне нужен.


person Yardboy    schedule 18.12.2008    source источник


Ответы (1)


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

Важным изменением является то, что я начал с чистого прозрачного холста, а не с базового изображения. После того, как я правильно понял текст, я вставляю базовое изображение в стек, меняю порядок двух изображений в стеке, а затем комбинирую их с помощью составного типа «экрана», который накладывает одно поверх другого.

Еще одно важное замечание: -channel RGBA необходим для того, чтобы размытие работало в сочетании с прозрачностью текстового слоя из-за особенностей работы IM. Почему это необходимо, объясняется на этой странице.

Кроме того, в системах Windows (файл .bat вместо сценария оболочки) одинарные кавычки должны быть двойными, а обратная косая черта «\» должна быть символом «^», иначе все рухнет.

Сценарий ниже является окончательным рабочим результатом (версия * nix):

convert  \
    -size 500x500 xc:transparent \
    -font TT0590M_.ttf \
    -annotate +0+0 '' -gravity North \
    -fill gray30 \
    -annotate +75+35 'ABCDEFGHIJKLMNOPQR\nABCDEFGHIJKLMNOPQR' \
    -channel RGBA \
    -blur 0x4 \
    -fill white \
    -annotate +72+30 'ABCDEFGHIJKLMNOPQR\nABCDEFGHIJKLMNOPQR' \
    -insert 0 base_image.jpg \
    -swap 0,1 \
    -composite -compose screen \
    combined.png
person Yardboy    schedule 18.12.2008