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

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

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

1 Ответ

7 голосов
/ 18 декабря 2008

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

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

Еще одно примечание к импорту: необходим 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
...