이름이 포함된 이미지 목록 확인

이름이 포함된 이미지 목록 확인

다음 형식으로 이미지 정렬 규칙을 만드는 방법:

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"

관련 정보