몽타주 (ImageMagick) 합성 이미지에서 추가 타일 공간을 제거 하시겠습니까?


18

사진이 많이 있습니다. 그들은 모두 같은 높이이며 Bash를 통해 ImageMagick의 몽타주 프로그램을 사용하여 합성 이미지로 통합하려고합니다. 문제는 기본적으로 타일 크기 (한 이미지가 한 타일을 차지함)가 가장 큰 크기의 이미지와 동일하다는 것입니다. 따라서 좁은 이미지는 많은 공백으로 둘러싸여 있습니다. 이 공백을 제거하고 싶습니다. 어떻게하니?


한 줄에 여러 개의 작은 이미지가 공간을 채우도록 하시겠습니까, 아니면 공백 대신 투명한 공간을 원하십니까?
Michael Mrozek

답변:


15

다음과 같이 해보십시오 :

montage file1.jpg file2.jpg -geometry +0+0 -background none output.jpg

이미지 사이의 경계선을 최대한 작게 만들고 투명하게 만듭니다.

내장 이미지를 사용한 차이점에 대한 데모를 보려면 다음을 시도하고 비교하십시오.

$ montage rose: -resize 100x60 rose: -geometry +0+0 -background none montage.jpg
$ display montage.jpg &
$ montage rose: -resize 100x60 rose: montage.jpg
$ display montage.jpg &

몽타주 사용법을 참조하십시오 .

얻고 자하는 것에 대한 예제를 게시하고 결과적으로 원하는 것에 대한 예제를 수동으로 함께 편집하면 조금 더 가까워 질 수 있습니다.

다음은 원래 위에 게시 한 것보다 더 나은 예입니다.

montage \( rose: -resize 100x46\! \) rose: -background gray montage.jpg

여기에 이미지 설명을 입력하십시오

montage \( rose: -resize 100x46\! \) rose: -geometry +0+0 -background none montage.jpg

여기에 이미지 설명을 입력하십시오


-mode concatenate를 사용할 수도 있습니다
Zloy Smiertniy

14

-geometry +0+0추가 타일 공간을 제거 한다는 승인 된 답변에 동의 하고 추가 -mode Concatenate조건 (특정 조건에서)을 추가 합니다.

또한와 크기가 다르면 montage"타일 배경"(타일 공간) 대 "프레임"과 "테두리"를 구분하기가 약간 어려워집니다. 자주 트랙을 잃어 버립니다. (클릭 가능) 이미지 :

#$ montage --version # done on:
#Version: ImageMagick 6.6.2-6 2012-08-17 Q16 http://www.imagemagick.org
# pipe to `display` (for preview):
# montage img1.png img3.png img2.png img4.png bmp:- | display

# generate images first
convert -size 200x100 xc:red img1.png
convert -size 300x200 xc:blue img2.png
convert -size 400x300 xc:green img3.png
convert -size 500x400 xc:orange img4.png

# #01: direct montage (-tile 2x2 automatic for four images)
# note: mont01.png is 256x252 pixels!
montage img1.png img3.png img2.png img4.png \
  mont01.png

mont01

# "The 'tile' size is then set to the largest dimentions
# of all the resized images, and the size actually specified."
# "by removing the 'size' component, non of the images will
# be resized, and the 'tile' size will be set to the largest
# dimensions of all the images given"

# #02: specify -geometry offset (tile spacing)
# note: mont02.png is 1008x808 pixels now!
montage img1.png img3.png img2.png img4.png \
  -geometry +2+2 \
  mont02.png

mont02

# #03: add border to command #02:
# border sticks around images themselves
montage img1.png img3.png img2.png img4.png \
  -geometry +2+2 -border 5 \
  mont03.png

mont03

# #04: add frame to command #02:
# frame is around the tile (and is "3D") - and
# background (which isn't image) is colored default gray:
montage img1.png img3.png img2.png img4.png \
  -geometry +2+2 -frame 5 \
  mont04.png

mont04

# #05: add background color spec to command #04:
# that is background behind the tiles - not of the tiles
montage img1.png img3.png img2.png img4.png \
  -geometry +2+2 -frame 5 -background "brown" \
  mont05.png

mont05

# #06: add mattecolor to command #05:
# "-mattecolor The color used as the frame color."
# but just changes color of the "3D" frame borders
montage img1.png img3.png img2.png img4.png \
  -geometry +2+2 -frame 5 -mattecolor "white" -background "brown" \
  mont06.png

mont06

# #07: add bordercolor  to command #05:
# "-bordercolor   The fill color inside the frame for images, or any border padding."
# this does change the color of time background
montage img1.png img3.png img2.png img4.png \
  -geometry +2+2 -frame 5 -bordercolor "purple" -background "brown" \
  mont07.png

mont07

# #08: both frame and border :
# no difference from command #07 -
# once the tiles are resized, the entire remaining
# background is used as a "border", and specifying
# "-border 5" size for it has no effect
montage img1.png img3.png img2.png img4.png \
  -geometry +2+2 -frame 5 -border 5 -bordercolor "purple" \
  mont08.png

mont08

# #09: add mode Concatenate (with -tile) to #08
# No difference from #08
montage img1.png img3.png img2.png img4.png \
  -mode Concatenate -tile 2x2 -geometry +2+2 -frame 5 -border 5 -bordercolor "purple" \
  mont09.png

mont09

# #10 remove -frame, from #09
# now there is no tile background, and
# images are not centered in tiles (they
# have gravity NorthWest instead)
montage img1.png img3.png img2.png img4.png \
  -mode Concatenate -tile 2x2 -geometry +2+2 -border 5 -bordercolor "purple" \
  mont10.png

mont10

# #11 Mode Concatenate with only -tile
# images are without padding (as much as possible)
montage img1.png img3.png img2.png img4.png \
  -mode Concatenate -tile 2x2 -border 5 -bordercolor "purple" \
  mont11.png

mont11

# #12 Try geometry +0+0 instead of concatenate
# almost the same as #11, except more correct overall borders
montage img1.png img3.png img2.png img4.png \
  -tile 2x2 -geometry +0+0 -border 5 -bordercolor "purple" \
  mont12.png

mont12

글쎄, 이것이 유용하게 사용될 수 있기를 바랍니다
.


편집 : ImageMagick, tkGui_ImageMagick.py에 대한 작은 Python / Tkinter / PIL GUI를 모았습니다. 마지막으로 내가 원하는 것에 대한 적절한 명령 줄을 찾을 수 있습니다. 타일의 높이 및 너비가 4 개의 이미지로 몽타주 해당 열의 가장 큰 너비 또는 행 높이와 일치합니다.

이 예에서 img1 (200x100) 및 img2 (300x200)는 첫 번째 열에 들어가고 더 큰 너비는 300이므로 img1의 타일 너비를 설정해야합니다. 또한 img1의 높이는 img3 (300px)의 더 큰 높이와 상호 연관되어 행을 형성해야합니다. extent연산자 를 통해 지정할 수 있습니다 ( ImageMagick 참조 • 주제보기-스트레치 대신 크기 조정 및 채움 ). 그리고 그 명령 줄에는 montage각 열 마다을 분리하기 위해 서브 프로세스 호출이 필요합니다 convert.

montage \
  <(montage \
    <(convert \
      img1.png -gravity center -extent 300x300  \
      bmp:-) \
    <(convert \
      img2.png -gravity North -extent x400  \
      bmp:-) \
  -tile 1x -geometry +0+0  \
  bmp:-) \
  <(montage \
    <(convert \
      img3.png -gravity center -extent 500x  \
      bmp:-) \
    img4.png \
  -tile 1x -geometry +0+0  \
  bmp:-) \
-geometry +0+0 -border 2 \
mont13.png

# or as one liner:

montage <(montage <(convert img1.png -gravity center -extent 300x300  bmp:-) <(convert img2.png -gravity North -extent x400  bmp:-) -tile 1x -geometry +0+0  bmp:-) <(montage <(convert img3.png -gravity center -extent 500x  bmp:-) img4.png -tile 1x -geometry +0+0  bmp:-) -geometry +0+0 -border 2 mont13.png

mont13

-extents몽타주 라인에서 직접 사용한 경우 다음 과 같이주의하십시오.

montage \
    img1.png -extent 300x200 -gravity center \
    img2.png -extent 0x400 -gravity North \
    -tile 1x -geometry +0+0  \
  bmp:-

... 우리는 높이 (200)에 대한 첫 번째 사양이 무시되고 400보다 큰 400이 어쨌든 두 타일에 적용됩니다 !

따라서 우리는 (호출함으로써 각 화상의 패딩을 제어해야 convertextents대한 ) - 다음 피 extents에서 montage라인; 따라서 각 열의 (가장 큰) 너비와 각 행의 높이를 미리 알고 있어야합니다. 참고 사항 :

  • img1이 이웃의 암시 적 너비 / 높이보다 작으므로 너비와 높이를 모두 명시 적으로 설정해야합니다.
  • 최대 규모로, 패딩 될 필요가 없습니다 (그리고 달렸다을 통해, 그리고 img4 - 다른 차원은 관련 치수 지정을 할 수 있습니다 convert) 전혀
  • 에서은 montage, 일반적으로 -gravity와야 (완전 지정 : 승 & H) -extent; 에서 convert, -gravity작동 전에 -extent (보통)

3

와 함께 montage하지는 않지만 다음과 같이 더 정확합니다.

convert 1.jpg 2.jpg 3.jpg -geometry x500 +append -gravity South a.png

x500 원하는 최종 높이

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.