【问题标题】:Using Imagemagick, save its variables per use使用 Imagemagick,每次使用时保存其变量
【发布时间】:2020-08-09 09:01:18
【问题描述】:

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

我根据每次保存在某些变量上的图像高度进行各种计算。但是,我不知道如何 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 变量保存了哪些值?

  • 我发现了如何在 linux 终端中检查变量值:echo ${height}

更新:解决方案: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

【问题讨论】:

  • 你可以使用 v7 ImageMagick 吗?你能展示一下图像在这个处理之前和之后的样子吗?你为什么要分两遍(两个循环)?当然,您可以只循环一次图像吗?
  • Version: ImageMagick 6.9.7-4 Q16 x86_64 20170114 http://www.imagemagick.org Copyright: © 1999-2017 ImageMagick Studio LLC License: http://www.imagemagick.org/script/license.php Features: Cipher DPC Modules OpenMP Delegates (built-in): bzlib djvu fftw fontconfig freetype jbig jng jpeg lcms lqr ltdl lzma openexr pangocairo png tiff wmf x xml zlib
  • 添加的是图像底部的额外边框,创建/修改日期以及我的水印作为图像。 link
  • 请分享您的水印图片以供测试。
  • 酷 - 很高兴它对你有用!祝你的项目好运。

标签: imagemagick imagemagick-convert


【解决方案1】:

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

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;

【讨论】:

    【解决方案2】:

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

    #!/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 上,它是不同的。如果需要,您可以重新集成它。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      相关资源
      最近更新 更多