使用 Imagemagick,每次使用保存其变量

Using Imagemagick, save its variables per use

历史:我尝试在目录 linux 中的一系列图像上应用水印,将水印放在图像下方额外创建的 space / 边框上。水印和额外的 space 会根据所应用的图像的高度大小调整/创建。

我根据每次处理的图像高度进行各种计算,将它们保存在一些变量上。但是,我不知道如何 a) 使用保存的每个图像的高度计算,制作一个应用于目录中所有图像的脚本,或者 b) 将这些计算应用于每个图像,作为“单一终端命令”,例如“对于 DSC*.* 中的图片;进行高度计算......并保存在该变量中以用于下一个批处理终端命令”

imagemagick的变量。我是如何保存它们以供下次使用的(每张图片)?

height=`convert DSC__12.jpg -format "%w" info:`
yoff_p50=`convert xc: -format "%[fx:$height/50]" info:`
yoff_p100=`convert xc: -format "%[fx:$height/100]" info:`
yoff_p200=`convert xc: -format "%[fx:$height/200]" info:`

我尝试了以下 linux 终端命令:是否有更优雅(更短?)的方式?

for pic in DSC*.*;  
do  height=`convert "$pic" -format "%w" info:`; 
yoff_p50=`convert xc: -format "%[fx:$height/50]" info:`; 
yoff_p100=`convert xc: -format "%[fx:$height/100]" info:`; 
yoff_p200=`convert xc: -format "%[fx:$height/200]" info:`; 
convert -background black -gravity NorthWest -extent 0%x0%+0+${yoff_p50} -pointsize ${yoff_p100} -fill white -undercolor '#00000080' -gravity SouthWest  -annotate  +${yoff_p100}+${yoff_p200} "$(stat -c '%y' "$pic")" "$pic" "${pic//.*}-d.jpg"; 
done;


for pic in DSC*-d.*; 
do  height=`convert "$pic" -format "%w" info:`; 
yoff_p50=`convert xc: -format "%[fx:$height/50]" info:`; 
yoff_p100=`convert xc: -format "%[fx:$height/100]" info:`; 
yoff_p200=`convert xc: -format "%[fx:$height/200]" info:`; 
 convert /home/elias/Data/PHOTOS/watermark_0.png    -resize ${yoff_p50}x${yoff_p50}^     /home/elias/Data/PHOTOS/res_watermark_0.png;
composite -dissolve 100% -gravity SouthEast /home/elias/Data/PHOTOS/res_watermark_0.png "$pic" "${pic//.*}-marked.jpg"; 
done; 

ps。我如何检查每个 imagemagick 变量保存了哪些值?

更新:解决方案:Mark Setchell 的解决方案有效。

最后,我 运行: ..它在 linux 终端上完成了很好的工作。

    for pic in DSC*.* ; do
       #Save either the date of File Creation or Modification on filename
       exiftool "-FileName<CreateDate" -d  "${pic//.*}_%Y%m%d_%H%M%S.jpg" "$pic"   &&   exiftool "-FileName<FileModifyDate" -d  "${pic//.*}_%Y%m%d_%H%M%S.jpg" "$pic" ; 
done;
    
for pic in DSC*.* ; do
   # Determine offsets and sizes
   read w y1 y2 y3 < <(identify -format "%w %[fx:w/50] %[fx:w/100] %[fx:w/200]" "$pic");
   ts=$(stat -c '%y' "$pic");

   convert -size ${w}x${y1} xc:black -gravity SouthWest \
      -pointsize ${y2} -fill white -undercolor '#00000080' -annotate +${y2}+${y3} "$ts"  \
      \( /home/elias/Data/PHOTOS/res_watermark_0.png -resize "${y1}x${y1}^" \) -gravity East -composite \
      "$pic" +swap -append "${pic//.*}-marked.jpg";
done

它可能可以进一步改进,但我会选择更像这样的东西:

#!/bin/bash

for f in DSC* ; do
   # Determine offsets and sizes
   read w y1 y2 y3 < <(identify -format "%w %[fx:w/50] %[fx:w/100] %[fx:w/200]" "$f")

   # Get timestamp - different on macOS. You want: ts=$(stat -c '%y' "$f")
   ts=$(stat -f "%Sm%n" "$f")

   convert -size ${w}x${y1} xc:black -gravity SouthWest \
      -pointsize ${y2} -fill white -undercolor '#00000080' -annotate +${y2}+${y3} "$ts"  \
      \( watermark.png -resize "${y1}x${y1}^" \) -gravity East -composite \
      "$f" +swap -append watermarked-"$f".jpg
done

注意事项:

  • read w y1... 开头的行一次性获取所有计算值 - 这样会更快。

  • ts=$(...) 开头的行获取时间戳。我把它抽象出来是因为我在 macOS 上,它是不同的。如果你愿意,你可以re-integrate它。

最后一行是动作所在。我先创建一个大小合适的黑色注释条,然后在左边用白色写上时间戳。然后,在下一行中,我加载水印并调整其大小并将其放置到黑色注释栏的右角。然后,在下一行中,我加载了主图像,并交换了顺序,使注释栏在底部,图像在附加之前在顶部。

请记住在调试 ImageMagick 脚本时,您可以在任何位置添加 -write "debug.png" 以查看调整大小后、合成前或任何地方的外观。

在一个 ImageMagick 命令中保存变量的另一种方法是使用 declare。

declare `convert xc: -format "yoff_p50=%[fx:$height/50]\nyoff_p100=%[fx:$height/50]\nyoff_p200=%[fx:$height/200]\n" info:`

示例:

declare `convert rose: -format "ww=%[fx:w]\nhh=%[fx:h]\n" info:` echo "ww=$ww; hh=$hh;"

ww=70; hh=46;