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

StackOverflow https://stackoverflow.com/questions/376887

Вопрос

Я пытаюсь прокомментировать некоторый текст на базовом изображении с помощью выпадающей тени.Мне не нравятся результаты, которые я получаю от использования опции -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

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

Это было полезно?

Решение

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

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

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

Кроме того, в системах 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top