使用 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 变量保存了哪些值?
- 我发现了如何检查 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
它可能可以进一步改进,但我会选择更像这样的东西:
#!/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;
历史:我尝试在目录 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 变量保存了哪些值?
- 我发现了如何检查 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
它可能可以进一步改进,但我会选择更像这样的东西:
#!/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;