가장 작은 캔버스에 모든 내용이 맞도록 이미지 크기를 조정하는 방법은 무엇입니까?

가장 작은 캔버스에 모든 내용이 맞도록 이미지 크기를 조정하는 방법은 무엇입니까?

나는 노력한다차이점을 빠르게 확인하세요별도의 반복 사이에웹사이트 ImageMagick을 사용합니다 compare.하지만 이미지 비교를 거부합니다다른 크기, 모서리에 고정된 무한 캔버스를 단순히 시뮬레이션하는 옵션은 없는 것 같습니다. -subimage-search이는 다음과 같은 이유로 내가 원하는 것이 아닙니다.

  • 어느 이미지가 더 큰지 모르겠습니다. (A가 가장 크고 B가 가장 넓은 이미지 A와 B를 지원하지 않는 것 같습니다.)
  • 같은 모서리에 이미지를 고정하고 싶습니다. 가장 일치하는 항목을 검색하려면 다음이 필요할 수 있습니다.많은더 길어지고 더 나은 결과를 제공하지 않습니다(이 목적을 위해).

현재 솔루션은 작동하지만 비효율적이고 투박하게 느껴집니다.

max_width_1="$(identify -ping -format "%w" 1.png)"
max_width_2="$(identify -ping -format "%w" 2.png)"
max_width="$((max_width_1>max_width_2?max_width_1:max_width_2))"
max_height_1="$(identify -ping -format "%h" 1.png)"
max_height_2="$(identify -ping -format "%h" 2.png)"
max_height="$((max_height_1>max_height_2?max_height_1:max_height_2))"
convert -extent "${max_width}x${max_height}" -background transparent 1.png 1.png
convert -extent "${max_width}x${max_height}" -background transparent 2.png 2.png

답변1

변수 약어는 코드의 시각적 명확성을 위해서만 사용되며 변경할 필요가 없습니다.실제더 긴(유지관리자 친화적인) 변수 이름.

identify기능 코드는 4개 대신 하나의 인스턴스를 사용하고, read변수를 로드하는 데 사용하고( xargs코드 줄을 절약하기 위해 비효율성을 사용함) 몇 가지 bash주의 사항을 사용하여 줄일 수 있습니다.

read mw1 mh1 mw2 mh2 <<< $(identify -ping -format "%w %h " [12].png)
mw="$((mw1>mw2?mw1:mw2))"
mh="$((mh1>mh2?mh1:mh2))"
echo {1,1,2,2}.png | xargs -n 2 convert -extent "${mw}x${mh}" -background transparent 

아니면 변수 대신 배열을 사용하는 것이 더 깔끔할 수도 있습니다.

read w[1] h[1] w[2] h[2] <<< $(identify -ping -format "%w %h " [12].png)
w[0]="$((w[1]>w[2]?w[1]:w[2]))"
h[0]="$((h[1]>h[2]?h[1]:h[2]))"
echo {1,1,2,2}.png | 
    xargs -n 2 convert -extent "${w[0]}x${h[0]}" -background transparent 

관련 정보