【问题标题】:ImageMagick command without intermediary file fails没有中间文件的 ImageMagick 命令失败
【发布时间】:2015-05-25 18:20:11
【问题描述】:

我正在处理来自 ImageMagick 的名为“Gel”效果的示例,用于 ImageMagick Example pages

我不想在许多步骤中使用中间图像执行 ImageMagick 脚本,而是想在没有中间文件的情况下一步完成。

我的代码如下所示(与示例 95% 相同):

convert.exe -size 150x64 xc:none  -fill green 
-draw "roundrectangle 10,10 140,54 8,8"  

( +clone -alpha extract -blur 0x12 -shade 110x0 
   -normalize -sigmoidal-contrast 16,60% -evaluate multiply .5 
   -roll +4+8 +clone -compose Screen -composite ) -compose In  -composite 

( +clone -alpha extract  -blur 0x2 -shade 0x90 -normalize -blur 0x2  
    +level 60,100%  -alpha On ) -compose Multiply -composite    

-font Verdana-Bold  -pointsize 20  -fill white  -stroke black -gravity Center  
    -annotate 0 "Download" -trim -repage 0x0+7+7   

( +clone -background navy -shadow 80x4+4+4 ) +swap -background none -flatten  
ButtonTest.png"

这些步骤是示例中步骤的副本。

问题是最后一个克隆步骤:

( +clone -background navy -shadow 80x4+4+4 ) +swap -background none -flatten  

使原本非常漂亮的图像变暗。 IE。没有添加阴影。在这一步之前,一个命令运行良好。

此外。如果我在最后一步之前保存图像,如下所示:

convert.exe -size 150x64 xc:none  -fill green 
-draw "roundrectangle 10,10 140,54 8,8"  

( +clone -alpha extract -blur 0x12 -shade 110x0 
   -normalize -sigmoidal-contrast 16,60% -evaluate multiply .5 
   -roll +4+8 +clone -compose Screen -composite ) -compose In  -composite 

( +clone -alpha extract  -blur 0x2 -shade 0x90 -normalize -blur 0x2  
    +level 60,100%  -alpha On ) -compose Multiply -composite    

-font Verdana-Bold  -pointsize 20  -fill white  -stroke black -gravity Center  
    -annotate 0 "Download" -trim -repage 0x0+7+7   
tempbutton.png

然后在 tempbutton 上执行最后一个克隆,如下所示:

convert.exe tempbutton.png
( +clone -background navy -shadow 80x4+4+4 ) +swap -background none -flatten
downloadbutton.png

然后就可以了。

我怎样才能避免将图像保存为最后一步,并执行这个大命令?

【问题讨论】:

    标签: imagemagick imagemagick-convert


    【解决方案1】:

    您指向示例页面的链接并未引导我找到您可能用作模板的内容(说明它“与示例 95% 相同”)。

    但是,为了更好的可读性、删除错字和适应我自己的环境(需要 " (...) " 部分用反斜杠转义,例如:@987654326 @,我在最后一个 -flatten 运算符之前插入了一个额外的 -compose src-over

    convert -size 150x64 xc:none -fill green -draw "roundrectangle 10,10 140,54 8,8" \
                                                                                     \
      \( +clone -alpha extract -blur 0x12 -shade 110x0                               \
         -normalize -sigmoidal-contrast 16,60% -evaluate multiply .5                 \
         -roll +4+8 +clone -compose Screen -composite                                \
      \)                                                                             \
                                                                                     \
      -compose In  -composite                                                        \
                                                                                     \
      \( +clone -alpha extract  -blur 0x2 -shade 0x90 -normalize -blur 0x2           \
         +level 60,100%  -alpha On                                                   \
      \)                                                                             \
                                                                                     \
      -compose Multiply -composite                                                   \
      -font Verdana-Bold  -pointsize 20  -fill white  -stroke black -gravity Center  \
      -annotate 0 "Download" -trim -repage 0x0+7+7                                   \
                                                                                     \
      \( +clone -background navy -shadow 80x4+4+4                                    \
      \)                                                                             \                                                                                      \
      +swap -background none -compose src-over -flatten                              \
        "ButtonTest.png"
    

    原因是这样的:

    1. -compose <some-composite-operator> 是一个图像设置

    2. 其默认值为src-over

    3. 您在编写最终结果图像之前使用的-flatten 运算符只是-layers flatten 操作的快捷方式。

    4. -layers flatten 操作如下:

      “使用当前的-background 颜色创建一个与第一个图像虚拟画布大小相同的画布,然后将每个图像-compose 依次放到该画布上。落在该画布之外的图像将被剪裁。最终图像将具有零虚拟画布偏移。” see IM docu

    5. -compose ... 这样的图像设置会一直持续到完整的命令结束,或者直到它们被稍后在命令行中的另一个-compose ... 设置显式更改。

    6. 您之前提供的-compose Multiply 设置在您执行最后的-flatten(又名-layers flatten)时仍然有效。这给出了你看到的输出......

    但是,当您运行第二个单独的命令来创建按钮时,您会重新开始:

    1. 之前的-compose Multiply 设置不再为人所知。
    2. 显式-compose <something> 设置未用于-flatten 操作。
    3. 因此,隐式默认-compose src-over用于-flatten

    因此,要将该设置集成到 ImageMagick 的单一命令中,您必须在写入输出之前通过运行 -compose src-over -flatten 来重置之前的 -compose multiply

    这里比较"before"(你的命令的输出,左)和"after"(我的命令的输出,右)我提出的修改:


    您应该在此处研究我之前关于“ImageMagick 命令行的架构”主题的回答:

    它解释了以下类别的 ImageMagick 命令行参数的区别。如果您想构建包含多个操作的复杂 IM 命令,则必须了解这些差异:

    1. 图像设置
    2. 图像运算符
    3. 图像序列运算符
    4. 图像堆栈运算符

    【讨论】:

    • 这是一个很棒的答案。非常感谢库尔特
    • @Andy:请随意浏览我的其他答案。我最喜欢的主题 ImageMagick、PDF、PostScript 或 Ghostscript——也许你会在那里找到一些其他的“宝石”...... :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 2013-07-13
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多