답변:
NN의 ImageMagick 주석을 리드로 사용하면 -format
출력의 일부로 임의 계산을 수행 할 수 있습니다 . 따라서 한 가지 가능한 방법은 다음과 같습니다.
identify -format "%[fx:round(100000*abs((4/3)-(w/h)))]:%M\n" *.jpg | \
sort -n -k1 -t:
당신이 원하는 것을해야합니다. 4/3의 원하는 종횡비는 일정합니다. 물론 이전 identify
이미지 ( "이 이미지에 가장 가까운"와 일치 함)의 출력으로 찾을 수 있습니다.
설명하기 위해 원하는 종횡비와 실제 종횡비 간의 명확한 차이를 취하고 있습니다. 그런 다음 많은 수를 곱하고 반올림합니다. 곱하기와 반올림은 sort가 합리적인 것이 아닌 정수만 처리하기 때문입니다.
그것은 밝혀 sort
유리수 아닌 정수를 할 나타나지 않습니다. 단일 Unix 사양 (v4)에도 지정되어 있습니다. 따라서 해당 해결 방법을 제거 할 수 있습니다.
identify -format "%[fx:abs((4/3)-(w/h))]:%M\n" *.jpg | \
sort -n -k1 -t:
33333:cover.jpg
Cover.jpg와는 500x500입니다.
가장 쉬운 방법은 ImageMagick 을 사용하는 것 입니다. 데비안 기반 시스템의 경우 Linux 배포판의 저장소에 있어야합니다.
sudo apt-get install imagemagick
ImageMagick 제품군의 프로그램 중 하나는 identify
입력 이미지 파일 목록의 특성을 인쇄하는 것입니다. 그것을 결합하면 sort
크기별로 정렬 된 이미지 목록을 얻을 수 있습니다 (확장자가있는 확장자마다 png를 변경할 수 있습니다 :
identify *png | sort -gk 3
크기뿐만 아니라 종횡비가 실제로 필요한 경우 다음과 같이 시도하십시오.
간단한 옵션 은 이미지 이름에 공백이 없다고 가정합니다 .
identify *png *jpg *gif | \
gawk '{split($3,sizes,"x"); print $1,sizes[1]/sizes[2]}' | \
sed 's/\[.\]//' | sort -gk 3
gawk 명령은 세 번째 필드 (LxH 형식의 이미지 크기)를 배열 "sizes"로 분할 한 다음 첫 번째 필드 (이미지 이름)와 이미지의 길이를 높이로 나눈 결과를 인쇄합니다. 이 sed
명령은 출력을 아름답게 만들고 sort
이미지 크기 비율에 따라 결과를 정렬합니다.
더 복잡한 것은 파일 이름의 공백을 처리 할 수 있습니다.
find . \( -iname "*png" -o -iname "*jpg" -o -iname "*gif" \) -exec identify {} \; |\
perl -ne '/(.+?)\s+[A-Z]{3}\s+(\d+)x(\d+)/; print "$1 ", $2/$3, "\n"' | \
sort -gk 2
여기서는 find
관심있는 파일을 식별하고 identify
명령을 실행 한 다음 작은 PERL 스크립트를 통해 출력을 파이핑하는 데 사용합니다. 정규식 [A-Z]{3}
은 이미지 형식이어야하는 세 개의 대문자 ( )를 찾습니다 . 그 사실을 알게되면 이미지 이름과 치수를 쉽게 식별 할 수 있습니다.
입력 파일 이름에 공백이 있으면 필드 번호가 혼동되므로 gawk를 사용하지 않습니다. 마지막으로, 스크립트는 이미지 이름과 길이 / 높이 나누기 결과를 sort
수치로 출력합니다.
사용 가능한 종횡비를 탐색하는 것으로 충분하지 않은 경우 원하는 종횡비를 가진 이미지가 하나 이상있는 경우 grep을 사용하여 비율이 가장 가까운 이미지를 추출하십시오.
identify *png *jpg *gif | \
gawk '{split($3,sizes,"x"); print $1,sizes[1]/sizes[2]}' |\
sed 's/\[.\]//' | sort -gk 3 | grep -C 10 GOOD_IMAGE.jpg
가로 세로 비율은 숫자에 불과하므로 이름 앞에 가로 세로 비율이 붙으면 이름에 따라 이미지를 찾아 볼 수 있습니다. 가로 세로 비율이 미리 지정된 기호 링크를 만들면 가로 세로 비율로 정렬 된 이미지를 찾아 볼 수 있습니다.
다음 뷰어는 예상대로 작동합니다. ( feh 는 실제 이미지조차도 내 시스템에서 앞으로 / 뒤로 이동하지 않습니다)
picd='/media/dat_ext4/pictures/jpg/misc'
srtd="$picd/ar-sort" # directory to hold "sorted" symbolic links
mkdir -p "$srtd"
find "$picd" -maxdepth 1 -type f -name "*" -print0 |
while IFS= read -d $'\0' -r file ; do
[[ $(file -ib "$file") != image* ]] && continue # skip non-image files
ar="$(identify -format "%[fx:w/h]" "$file")"
slink="$(printf '%s/%06.4f %s' "$srtd" "$ar" "$(basename "$file")")"
# make symbolic link in 'ar-sort' directory
ln -s "$file" "$slink"
echo "$slink"
done
ar-sort
디렉토리 로 이동하여 관심있는 시작 지점 (종횡비)에서 찾아보십시오.
심볼릭 링크 이름은 다음과 같습니다.
0.6732 Gold Bars.jpg
0.7242 Light Bulb.jpg
0.8022 Escher - Waterfall.jpg
1.3696 Old Typewriter.jpg
1.6000 King Tut.jpg
나의 일반적인 추론은 "근접도"라는 단어가 들릴 때마다 제곱 오차 거리 측정법을 사용하는 것입니다. 절대 값을 반드시 사용할 수 있으며 더 빠릅니다. 이 스크립트는 이상적인 종횡비를 인수 로 사용하고 현재 디렉토리의 모든 * .jpg 파일을 처리하여 이상적인 비율에서 증가하는 발산 순서로 정렬하여 출력합니다.
head
ImageMagick이 삽입 한 후행 줄 끝 문자를 제거합니다.
스크립트는 출력 필드 구분자를 가능성이없는 문자로 설정하고, 제곱 차이를 계산하고, 쌍 차이 파일명을 다시 인쇄하는 gawk 명령을 포함한다. 정렬이 수행되고 불필요한 정보 (제곱 종횡비 차이)가에 의해 제거됩니다 cut
.
#!/bin/sh
if [ x"$1" = "x" ] ; then
echo "Usage: $0 TargetAspectRatio" >&2
exit 2
fi
ASPECT_CMD="BEGIN{OFS=\"|\";}\
{\
print (\$1-$1)^2, \$2;\
}"
identify -format "%[fx:w/h]:%M\n" *.jpg | head -n-1 | gawk -F":" "$ASPECT_CMD" | sort -k1 -t"|" | cut -f2 -d"|"
identify -format "%[fx:w/h]:%M\n" *.jpg
. 임의의 값에 근접하여 쉽게 정렬하는 방법을 모르겠습니다.sort
이러한 정렬을 지원하지 않는 것 같습니다.