loại bỏ không gian gạch bổ sung từ hình ảnh tổng hợp dựng phim (ImageMagick)?


18

Tôi có một loạt các bức ảnh. Chúng đều có cùng chiều cao và tôi đang cố gắng ghép chúng lại thành một hình ảnh tổng hợp bằng chương trình dựng phim của ImageMagick thông qua Bash. Vấn đề là theo mặc định, kích thước ô (một hình ảnh chiếm một ô) bằng với hình ảnh có kích thước lớn nhất. Hình ảnh hẹp, do đó, được bao quanh bởi rất nhiều khoảng trắng. Tôi muốn loại bỏ khoảng trắng này. Tôi làm nó như thế nào?


Bạn có muốn nhiều hình ảnh nhỏ trên một dòng để lấp đầy không gian, hoặc bạn chỉ muốn không gian trong suốt thay vì khoảng trắng?
Michael Mrozek

Câu trả lời:


15

Hãy thử một cái gì đó như thế này:

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

Điều này sẽ làm cho đường viền giữa các hình ảnh càng nhỏ càng tốt và bất cứ điều gì sẽ có trong suốt.

Để xem bản demo về sự khác biệt bằng cách sử dụng hình ảnh dựng sẵn, hãy thử những điều này và so sánh:

$ 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 &

Xem Cách sử dụng Montage .

Nếu bạn đăng một ví dụ về những gì bạn nhận được và chỉnh sửa thủ công cùng một ví dụ về kết quả bạn muốn, chúng tôi có thể có thể tiến gần hơn một chút đến đó.

Dưới đây là những ví dụ mà tôi thích hơn những ví dụ tôi đã đăng ở trên:

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

nhập mô tả hình ảnh ở đây

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

nhập mô tả hình ảnh ở đây


Bạn cũng có thể sử dụng -mode concatenate
Zloy Smiertniy

14

Tôi đồng ý với câu trả lời được chấp nhận -geometry +0+0để xóa thêm không gian gạch và tôi sẽ thêm -mode Concatenate(trong một số điều kiện nhất định).

Ngoài ra, một khi bạn có các kích thước khác nhau montage, sẽ có một chút khó khăn để phân biệt giữa "nền gạch" (không gian gạch) và "khung" - tôi thường bị mất dấu vết, vì vậy đây là một trường hợp thử nghiệm nhỏ với (có thể nhấp) hình ảnh:

#$ 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

Vâng, hy vọng điều này có thể được tìm thấy hữu ích,
Chúc mừng!


EDIT: Tôi kết hợp một GUI Python / Tkinter / PIL nhỏ cho ImageMagick, tkGui_ImageMagick.py - và cuối cùng tôi có thể tìm thấy dòng lệnh thích hợp cho thứ gì đó mà tôi muốn: tạo một đoạn phim gồm bốn hình ảnh, trong đó chiều cao và chiều rộng của hình xếp được khớp với bất kỳ chiều rộng lớn nhất của cột đó (hoặc chiều cao của hàng).

Trong ví dụ này, img1 (200x100) và img2 (300x200) đi vào cột đầu tiên, chiều rộng lớn hơn là 300 - nên đặt chiều rộng của gạch là img1. Ngoài ra, img1 cần phải có chiều cao tương quan với chiều cao lớn hơn của img3 (300 px), với nó tạo thành một hàng. Điều này có thể được chỉ định thông qua extenttoán tử (xem thêm ImageMagick • Xem chủ đề - Thay đổi kích thước và thay vì kéo dài ). Và dòng lệnh đó yêu cầu các lệnh gọi quy trình con để tách montages cho mỗi cột - và từ đó, converts riêng cho mỗi hình ảnh:

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

Lưu ý ở đây, nếu chúng ta đã sử dụng -extentstrực tiếp trong dòng dựng phim, như thế này:

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

... chúng ta sẽ nhận thấy rằng các đặc điểm kỹ thuật đầu tiên cho chiều cao (200) sẽ bị bỏ qua, và 400 là lớn hơn sẽ được áp dụng cho cả hai gạch anyways !

Vì vậy chúng ta phải kiểm soát đệm của mỗi hình ảnh cá nhân (bằng cách gọi convertvới extentscho mỗi ) - và sau đó tránh extentstrong montagedòng; và như vậy, chúng ta phải apriori biết chiều rộng (lớn nhất) của mỗi cột (và chiều cao của mỗi hàng). Cũng lưu ý:

  • Vì img1 nhỏ hơn chiều rộng / chiều cao ngụ ý của các lân cận, nên chúng ta phải đặt rõ ràng cả chiều rộng và chiều cao trong phạm vi của nó
  • Kích thước khác chỉ có thể có kích thước phù hợp được chỉ định - và img4, lớn nhất, không nhất thiết phải được đệm (và chạy qua convert)
  • Trong montage, thường -gravityphải đến sau (được chỉ định đầy đủ: w & h) -extent; trong convert, -gravityhoạt động trước -extent (thường)

3

Không phải với montage, nhưng cảm thấy chính xác hơn với những điều sau đây:

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

x500 là chiều cao cuối cùng mong muốn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.