ImageMagick / Bash:使用文件名格式变量时忽略管道(?)

问题描述 投票:0回答:1

我正在尝试使用 ImageMagick 创建缩略图表(缩略图网格),并在每个图像下方添加文件名。文件名是很长的 UUID 样式字符串,使用 -title 选项它们会相互溢出,造成难以阅读的混乱。所以我想我应该截断名称以仅显示前 n 个字符。我的 Bash 脚本如下(在 Windows 11 上通过 Git Bash 运行。)我不确定这是我的 Bash 代码中的错误,还是我对 ImageMagick 的使用错误。

magick montage -verbose -label "$(echo '%t' | cut -c -8)" -font Arial -pointsize 16 \
    -background '#000000' -fill 'gray' \
    -define jpeg:size=200x200 \
    -geometry 200x200+2+2 -tile 8x0 \
    -auto-orient \
    $(ls -rt *.jpg) \
    out.jpg 

据我所知,我遇到的问题是第一行脚本的

$(echo '%t'
... 部分;它似乎没有被输送到后面的 cut 命令中。如果我使用文字字符串,例如。
echo 'Hello world!'
,每个缩略图都标有我所期望的“Hello wo”。但如果我改为使用 %t (这是 ImageMagick 的格式变量,用于公开图像的基本文件名),我会得到完整的未截断的文件名,就好像未应用剪切命令一样。

当我使用裸格式变量(我尝试过 %f,完整文件名和 %t,基本文件名),而不将其回显到 cut 中时,我得到了预期的未截断的文件名。如前所述,如果我回显通过管道传递到 cut 的文字字符串(Hello world!),我会得到预期的截断输出。只有当我将两者结合起来将 %f 或 %t 回显到剪切中时,截断才会失败,并且我会得到完整的文件名。我还尝试将 echo 通过管道传输到 sed 而不是 cut,但第二个命令再次被忽略,我得到了完整的文件名。

编辑:我忘记了一个额外的小细节:如果我用 %t 做了一些奇怪的事情,比如

$(echo 'xxx%t')
,我会得到前面带有 xxx 的文件名——所以看起来 echo 正在按预期工作。但是当我尝试将它通过管道传输到 cut 时,它不会被截断。

感谢您的帮助。

bash imagemagick
1个回答
0
投票

我没有合适的机器来测试这个,但我认为如果使用两阶段方法会更简单。首先,生成每个图像及其标签,然后将所有这些图像传输到第二个

montage
命令中,将它们全部放置在一起。简单来说,它看起来像这样:

for f in *.jpg; do
   # Generate a single, labelled image on stdout in MIFF format
   magick "$f" ... MIFF:-
done | magick montage MIFF:- ... result.jpg

我使用

MIFF
作为中间格式,因为它可以保存和传播任何位深度、任何透明度和所有元数据。

所以,你的实际命令将看起来更像这样:

for f in  $(ls -rt *.jpg) ; do
   label="${f:0:8}"
   magick "$f" -label "$label" -font Arial -pointsize 16 \ 
          -auto-orient -resize 200x200 -background black \
          -fill grey MIFF:-
done | magick montage -background '#000000' MIFF:- -geometry +2+2 -tile 8x result.jpg
© www.soinside.com 2019 - 2024. All rights reserved.