종횡비를 기준으로 이미지 정렬

종횡비를 기준으로 이미지 정렬

새로운 프레임에 맞게 예술적인 이미지를 선택하려고 합니다. 특정 종횡비에 대한 근접성을 기준으로 이러한 이미지를 정렬한 다음 feh와 같은 것을 통해 근접성의 내림차순으로 볼 수 있기를 원합니다.

훌륭한 한 줄짜리 Unix 표현식이 있나요? 그렇지 않으면 수십 줄의 Python으로 문제를 해결할 수 있습니다.

답변1

NN의 ImageMagick 주석을 단서로 사용하면 -format출력의 일부로 임의의 계산을 수행하도록 할 수 있다는 것이 밝혀졌습니다. 따라서 가능한 한 가지 방법은 다음과 같습니다.

identify -format "%[fx:round(100000*abs((4/3)-(w/h)))]:%M\n" *.jpg | \
    sort -n -k1 -t:

당신이 원하는 것을해야합니다. 4/3은 상수이며 원하는 종횡비입니다. 물론 이전 출력의 출력임을 알 수 있습니다 identify("이 이미지에 가장 가까운" 일치).

이를 설명하기 위해 원하는 종횡비와 실제 종횡비 사이의 명백한 차이를 살펴보겠습니다. 그런 다음 큰 수를 곱하고 반올림합니다. 곱셈과 반올림은 정렬이 유리수가 아닌 정수만 처리하기 때문에 발생합니다.

편집하다

sort정수뿐만 아니라 유리수도 실제로 계산할 수 있다는 것이 밝혀졌습니다 . 이는 Single Unix 사양(v4)에도 지정되어 있습니다. 따라서 다음 해결 방법을 사용하여 벗어날 수 있습니다.

identify -format "%[fx:abs((4/3)-(w/h))]:%M\n" *.jpg | \
    sort -n -k1 -t:

답변2

음, 가장 쉬운 방법은 다음을 사용하는 것입니다.이미지 마술사. Debian 기반 시스템의 경우 Linux 배포 저장소에 있어야 하며 다음을 실행합니다.

sudo apt-get install imagemagick

ImageMagick 제품군의 프로그램 중 하나는 identify입력 이미지 파일 목록의 특성을 인쇄하는 것입니다. 이를 결합하면 sort크기별로 정렬된 이미지 목록이 제공됩니다(png를 어떤 확장자로든 변경할 수 있습니다:

identify *png | sort -gk 3

정말로 필요하다면종횡비단순히 크기 대신 다음과 같이 시도해 보세요.

  1. 간단한 선택,이미지 이름에 공백이 없다고 가정:

    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이미지 크기 비율에 따라 결과를 정렬합니다.

  2. 상황을 더 복잡하게 만들기 위해 파일 이름의 공백을 처리할 수 있습니다.

    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

답변3

각 종횡비에 대한 참조와의 차이를 계산할 수 있습니다. DeRobert의 답변처럼 보이지만 더 간단합니다.

ref=4/3
identify -format "%[fx:abs(w/h - $ref)] %M\n" *.jpg | sort -n -k1

답변4

나의 일반적인 추론은 "근접성"이라는 단어를 들을 때마다 제곱 오차 거리 측정법을 사용하는 것입니다. 물론 절대값을 사용할 수 있으며 속도가 더 빨라집니다. 스크립트는 다음 매개변수를 매개변수로 사용합니다.이상적인종횡비, 현재 디렉터리의 모든 *.jpg 파일을 처리하고 이상적인 비율에서 벗어난 오름차순으로 출력을 정렬합니다.

headImageMagick에 의해 삽입된 후행 줄 끝 문자를 제거합니다.

스크립트에는 출력 필드 구분 기호를 예상치 못한 문자로 설정하고 차이 제곱을 계산하고 차이|파일 이름 쌍을 인쇄하는 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"|"

관련 정보