没有中间文件的ImageMagick命令失败

没有中间文件的ImageMagick命令失败,imagemagick,imagemagick-convert,Imagemagick,Imagemagick Convert,我正在研究ImageMagick中的一个例子,叫做“凝胶”效应 我不想用中间图像分多个步骤执行ImageMagick脚本,而是希望在没有中间文件的情况下一步执行 我的代码如下所示(95%与示例相同): 这些步骤是示例中步骤的副本 问题是最后一个克隆步骤: ( +clone -background navy -shadow 80x4+4+4 ) +swap -background none -flatten 使原本非常好的图像变暗。即不添加dropshadow。在这一步之前,one命令工作得

我正在研究ImageMagick中的一个例子,叫做“凝胶”效应

我不想用中间图像分多个步骤执行ImageMagick脚本,而是希望在没有中间文件的情况下一步执行

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

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

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

( +clone -background navy -shadow 80x4+4+4 ) +swap -background none -flatten  
使原本非常好的图像变暗。即不添加dropshadow。在这一步之前,one命令工作得非常好

而且。如果在最后一步之前保存图像,如下所示:

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
convert.exe tempbutton.png
( +clone -background navy -shadow 80x4+4+4 ) +swap -background none -flatten
downloadbutton.png
然后在tempbutton上执行最后一次克隆,如下所示:

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
convert.exe tempbutton.png
( +clone -background navy -shadow 80x4+4+4 ) +swap -background none -flatten
downloadbutton.png
然后它就起作用了


我如何才能避免将图像保存为最后一步,并执行这一重要命令?

您指向示例页面的链接不会让我看到您可能使用的模板(声明“与示例95%相同”)

然而,为了更好的可读性,为了删除打字错误,为了适应我自己的环境(需要
“(…)”
部分用反斜杠转义,如下所示:
“\(…)”
,我在最后一个
-plant
操作符之前插入了一个额外的
-compose src:

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"
原因是:

  • -compose
    是一种图像设置

  • 其默认值为
    src over

  • 写入最终结果图像之前使用的
    -plant
    操作符只是
    -layers-plant
    操作的快捷方式

  • -layers flatten
    操作的工作原理如下:

    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
    
    convert.exe tempbutton.png
    ( +clone -background navy -shadow 80x4+4+4 ) +swap -background none -flatten
    downloadbutton.png
    
    使用当前的
    -background
    颜色和
    -compose
    在画布上依次创建与第一个图像虚拟画布大小相同的画布。位于该画布之外的图像将被剪裁。最终图像的虚拟画布偏移量为零

  • -compose…
    这样的图像设置会一直保留,直到完整的命令结束,或者直到稍后在命令行上的另一个
    -compose…
    设置显式更改它们

  • 在您执行最终的
    -plant
    (也称
    -layers展平
    )时,先前提供的
    -compose Multiply
    设置仍处于活动状态。这将提供您看到的输出

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

  • 以前的
    -compose Multiply
    设置不再为人所知
  • 没有为
    -flant
    操作提供显式的
    -compose
    设置
  • 因此,隐式默认值
    -compose src over
    用于
    -plant
  • 因此,要将该设置集成到ImageMagick的单个命令中,您必须在写入输出之前运行
    -compose src over-flatte
    来重置先前的
    -compose multiply

    下面是我建议的修改“之前”(命令的输出,左)和“之后”(我的命令的输出,右)的比较:


    您应该在这里学习我之前关于“ImageMagick命令行的体系结构”主题的回答:

    它解释了以下ImageMagick命令行参数类别的差异。如果要构造发生多个操作的复杂IM命令,了解这些差异至关重要:

  • 图像设置
  • 图像操作符
  • 图像序列操作符
  • 图像堆栈操作符

  • 这是一个很棒的答案。非常感谢你Kurt@Andy:请随意浏览我的其他答案。关于我最喜欢的主题ImageMagick、PDF、PostScript或Ghostscript——也许你会在那里找到其他一些“珍宝”…:-)