다음 형식으로 이미지 정렬 규칙을 만드는 방법:
image_name_1 [IMAGE#1]
image_name_2 [IMAGE#2]
image_name_3 [IMAGE#3]
...
Imagemagick을 사용하면 다음과 같이 말할 수 있습니다.
montage -label '%f' -mode concatenate -tile 1x foo*.png out.png
그러나 이것은 추가됩니다파일 이름이미지 + 아래에는 이름 너비가 고려되지 않습니다.
어디파일의 왼쪽에 있는 한 어떤 파일 이름이 인쇄되는지는 중요하지 않습니다(예: 기존 데카르트 y축)옳은영상.
32비트 Linux에서 작동하는 한 어떤 도구인지는 중요하지 않습니다.
답변1
저는 ImageMagick 전문가가 아니므로 더 좋은 방법이 있을 수 있지만 두 단계로 수행할 수 있습니다. 먼저 각 이미지의 왼쪽에 있는 텍스트를 중간 파일에 추가한 다음 몽타주를 수행합니다.
for file in foo*.png
do convert "$file" -splice 100x0 -gravity west -annotate +10+0 '%f' /tmp/"$(basename "$file")"
done
montage -mode concatenate -tile 1x /tmp/*.png out.png
100
가장 넓은 파일 이름 태그에 맞도록 스플라이스 값을 충분히 넓게 조정해야 합니다 .
단일 명령을 사용하는 것에 대한 흥미로운 대안은 다음과 같습니다.
convert \
$(for file in foo*.png
do echo '(' label:"$(basename "$file")" -gravity center "$file" +append ')'
done) -gravity west -append out.png
+append
레이블과 이미지를 가로로 결합한 다음 -append
결과를 세로로 결합하는 곳입니다 . 정확히 필요한 것은 아니지만 추가 실험을 위한 출발점이 될 수 있습니다.
답변2
누군가 이것을 더 자세히 해독하고 싶다면 혼란스럽기는 하지만 흥미로울 수 있는 몇 가지 팁이나 도움이 있습니다.
프로세스에서는 적절한 레이블을 생성하기 위해 파일 이름의 최대 높이와 너비를 요청합니다. 누락된 기능 중 하나는 텍스트의 수직 중앙 정렬입니다(솔직히 보기에는 더 좋습니다.)
텍스트의 너비 + 높이를 정수로 얻으려면 다음 중 한 가지 방법을 사용하세요.
convert -debug annotate xc: -font Arial -pointsize 24 \
-annotate 0 'Test' null: 2>&1 | \
awk -vRS='[;.]' -F': ' '/width|height/{print $2}'
그러나 파일 수가 보통인 경우 루프의 각 파일 이름에 대해 이 작업을 수행하면 시간/리소스가 크게 늘어날 수 있습니다.
따라서 아래 스크립트에서는 모든 파일 이름이 포함된 두 개의 임시 파일을 생성합니다. 하나는 최대 높이를 얻고 다른 하나는 최대 너비를 얻습니다.
파일 이름에 개행 문자가 있으면 프로세스가 중단됩니다.
#!/bin/bash
# Default Options
font=Arial
font_size=12
pad=20
usage()
{
cat <<EOF_USAGE
Usage: $0 [OPTION] <images>
-f | --font <font>
-z | --font_size <N>
-h | --help [f|font]
EOF_USAGE
exit 1
}
# Check for user-options
while [[ "$1" ]]
do
case "$1" in
--font|-f)font=$2; shift;;
--help|-h)
if [[ "$2" = "f" || "$2" = "font" ]]
then
convert -list font
printf "\nCMD: convert -list font\n"
fi
usage
exit 1
;;
--font_size|-z)font_size=$2; shift;;
--pad|-p)pad=$2; shift;;
--)shift; break;;
*)break;;
esac
shift
done
# Shallow Next option check (is it a file at all?)
! [[ -f "$1" ]] && printf "Not a file: %s\n" "$1" && exit 2
printf "Processing %d files ...\n" "$#"
txt_w=0
txt_h=0
tmp_dir=$(mktemp -d)
printf "tmp dir : %s\n" "$tmp_dir"
images=("$@")
printf "Calculating max width / height ..."
# Find max width from file names using font + font-size
txt_w=$(convert \
-debug annotate xc: \
-font "$font" \
-pointsize "$font_size" \
-annotate 0 "\"$(printf "%s\n" "${images[@]}")\"" null: 2>&1 | \
sed -n 's/.*Metrics:.* width: \([^.;]*\)[;.].*/\1/p' | sort -n | tail -n1)
# Find max height from file names using font + font-size
txt_h=$(convert \
-debug annotate xc: \
-font "$font" \
-pointsize "$font_size" \
-annotate 0 "\"$(printf "%s" "${images[@]}")\"" null: 2>&1 | \
sed -n 's/.*Metrics:.* height: \([^.;]*\)[;.].*/\1/p')
printf "\r\033[KWidth : %d\n" "$txt_w"
printf "Height : %d\n" "$txt_h"
# Add padding pixels
(( txt_w+=pad*2 ))
# Create the labeled images
for img in "${images[@]}"
do
printf "\r\033[KCreating label for \`%s'" "$img"
convert "$img" \
-splice ${txt_w}x$txt_h \
-gravity west \
-font "$font" \
-pointsize $font_size \
-annotate +$pad+0 '%f' \
"$tmp_dir"/"$(basename "$img")"
done
printf "\r\033[KMontage ...\n"
# Combine / Collate / Montage
montage -mode concatenate -tile 1x $(printf "$tmp_dir/%s " "${images[@]}") out.png
printf "Done!\n"
# Clean up
rm -r "$tmp_dir"