รวมภาพหลายภาพโดยใช้ ImageMagick


166

ฉันต้องการรวมหลายภาพเป็นภาพเดียวโดยใช้ ImageMagick เพื่ออธิบายให้ดีขึ้นเล็กน้อยฉันต้องการให้ผลลัพธ์คล้ายกับสิ่งนี้:

นั่นคือฉันมีภาพหน้าจอจำนวนมากและฉันต้องการเปลี่ยนให้เป็นภาพหนึ่งภาพด้วยภาพต้นฉบับที่อยู่ด้านบนของกันและกัน

โดย Googling ฉันเจอคำสั่ง 'คอมโพสิต' แต่ฉันไม่รู้ว่าและในกรณีนั้นจะใช้มันอย่างไรเพื่อให้ได้ผลลัพธ์ที่ฉันต้องการ



คำตอบ:


256

สำหรับไฟล์อินพุตจำนวนเท่าใดก็ได้ที่ชื่อ:in-<something>.jpg

convert -append in-*.jpg out.jpg

เพื่อให้มีการต่อท้ายไฟล์ที่เฉพาะเจาะจงหรือข้ามหมายเลขแทนที่จะได้รับ "glob" เต็มคุณสามารถพูดถึงไฟล์อินพุตอย่างชัดเจนและใส่appendคำสั่งหลังจากนั้น

แปลง in-1.jpg in-5.jpg in- N .jpg + ผนวก out-in1-plus-in5-and-in N .jpg

คุณสามารถใช้-append(แทน+append) สำหรับการวางแนวตั้ง

หรือ:

montage -mode concatenate -tile 1x in-*.jpg out.jpg

จะสร้างไฟล์out.jpgที่มีการต่อข้อมูลแนวตั้งของภาพต้นฉบับด้วย

convert

สำหรับการต่อข้อมูลอย่างง่ายในแถวหรือคอลัมน์เดียวappendตัวเลือกของconvertเครื่องมือก็เพียงพอแล้ว โปรดทราบว่าการ-appendต่อภาพทั้งหมดเข้าด้วยกันในแนวตั้งการสร้างหนึ่งคอลัมน์ที่มีnแถวและ+appendต่อในแนวนอนการสร้างหนึ่งแถวที่มีคอลัมน์n

(ดูที่ImageMagick: ตัวเลือกบรรทัดคำสั่ง )

montage

ในการควบคุมเลย์เอาท์ที่ละเอียดกว่านี้เราจะต้องใช้montageเครื่องมือ montage -mode concatenateจะกาวภาพอินพุตเข้าด้วยกันเช่นเดียวกับappendตัวเลือกและ-tile 1xควบคุมเค้าโครงที่จะใช้

tileตามรูปแบบคอลัมน์ × แถวแต่ด้านใดด้านหนึ่งอาจหายไปและmontageจะหาวิธีที่จะปฏิบัติตามข้อ จำกัด

เรากำลังใช้1x(ตรงหนึ่งคอลัมน์ที่มีจำนวนแถวใด ๆ ) -appendที่นี่จะได้รับผลเช่นเดียวกับ หากไม่มี-tile 1xก็จะเข้าร่วมภาพเช่นเริ่ม+appendต้นไปที่-tile x1(จำนวนคอลัมน์ใด ๆ ในหนึ่งแถว)

(ดูตัวอย่าง ImageMagick: การตัดต่อ, อาร์เรย์ของรูปภาพ )


1
ขอบคุณ ผนวกทำงานได้ดี แต่ฉันคิดว่าการตัดต่อใช้งานไม่ได้: ถ้าฟอนต์ ghostscript ไม่ได้ติดตั้งไว้มันจะประกันตัวออกมาแม้คุณจะไม่ได้ใส่คำอธิบายประกอบภาพ ควรโหลดแบบอักษรตามต้องการไม่ใช่ล่วงหน้า
Bram

@Bram: ฉันไม่รู้และเห็นด้วยอย่างยิ่ง คุณรู้หรือไม่ว่า GraphicsMagick ทำงานเหมือนเดิมหรือไม่
peth

2
@MikeRobinson convert -append `counter=0; for x in in-*; do if [[ $(($counter % 2)) == 0 ]]; then echo $x; fi; counter=$((counter + 1)); done` out.jpgควรทำงาน
gozzilli

2
โปรดทราบว่าconvert -tile 2x2คำสั่งอื่น ๆ จะอ่านไฟล์ตามลำดับตัวอักษร ซึ่งหมายความว่า0-10จะมีการอ่านชื่อ0,10,1,2,..,9กลุ่ม พาฉันไปเกือบ 2 ชั่วโมงเพื่อให้เข้าใจถึงสิ่งพื้นฐานนี้
phil294

1
@Blauhirn: นั่นคือการแปลงการเรียงลำดับชื่อไฟล์หรือว่าเป็นไฟล์ glob ของคุณกลับมาในลำดับที่? เช่นls *จะคืนค่าเหล่านั้นตามลำดับ
naught101
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.