在ImageMagick中使用堆栈以选择性地模糊图像的一部分

3

我正在尝试在基础图像上注释一些文本,并添加一个投影效果。我不喜欢使用-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

常常发生这种情况,我在发布问题后继续努力解决,最终成功了。

重要的改变是我从一个空白的透明画布开始而不是从基础图像开始。等我调整好文字后,将基础图像插入到堆栈中,交换两个图像在堆栈中的顺序,然后使用“屏幕”合成类型将它们组合在一起,一个覆盖另一个。

还有一个重要的注意事项:需要使用-channel RGBA,以便模糊与文本层的透明度协同工作,由于IM的一些特殊性质。为什么需要这样做可以在此页面上找到解释。

此外,在Windows系统(.bat文件而不是shell脚本)中,单引号需要替换为双引号,反斜杠“\”需要替换为插入符“^”,否则所有内容都会崩溃。

下面的脚本是最终的工作结果(*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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接