วิธีแทรก white space ด้วย imagemagick ได้อย่างไร


15

พารามิเตอร์ใดที่ "แปลง" (?) จำเป็นต้องรับเอาท์พุทนี้จากอินพุตนี้

INPUT:

ป้อนคำอธิบายรูปภาพที่นี่

เอาท์พุท:

ป้อนคำอธิบายรูปภาพที่นี่

คำตอบ:


8

เนื่องจากฉันไม่ต้องการให้ภาพล้างออกทางด้านขวาฉันจึงต้องใช้วิธีการอื่น ( compositeเครื่องมือของ ImageMagick ):

convert -size 500x500 xc:white canvas.png
convert canvas.png in.png -geometry +200+200 -composite out.png

-sizeควรเป็นขนาดภาพสุดท้ายที่คุณต้องการcanvas.pngเป็นผืนผ้าใบสีขาวที่ว่างเปล่าin.pngจะเป็นภาพที่คุณต้องการรองและ-geometryการจัดตำแหน่งออฟเซ็ต


15

เวอร์ชัน ImageMagick ของฉันคือ '6.7.8-0 2012-07-04 Q16' ตามที่ docu คำตอบของคำสั่ง @kev น่าจะใช้ได้:

 convert in.png -gravity east -extent 520x352 out.png

อย่างไรก็ตามเช่นเดียวกับคำถาม ImageMagick ส่วนใหญ่คุณสามารถบรรลุเป้าหมายเดียวกันด้วยวิธีการที่แตกต่างกัน คุณสามารถใช้montageสิ่งนี้:

 montage null: in.png -tile 2x1 -geometry +17+0 out1.png

นี้ใช้พิเศษ 'null:' in.pngภาพเพื่อเชื่อมกับ


เป็นความจริงที่ว่าเมื่อconvertคุณต้องการคำนวณค่าที่คุณต้องส่งให้-extentกับภาพอินพุตแต่ละภาพที่มีขนาดแตกต่างกัน

ใช้งานครั้งแรกidentify -formatเพื่อรับขนาดของภาพ:

 identify -format '%Wx%H' in.png

สิ่งนี้ควรส่งคืนสิ่งที่ชอบ:

 449x352

ตกลงตอนนี้คุณจะต้องเพิ่ม 71 พิกเซลที่คุณต้องการเพื่อรับ520x352ค่าสุดท้าย แต่คุณไม่จำเป็นต้องทำการคำนวณในสมองของคุณ:

ImageMagick เพื่อช่วยเหลือ!, และความสามารถในการคำนวณเวทย์มนตร์ ... :-)

คุณสามารถบอกให้identify -formatคำสั่งทำการคำนวณนั้นสำหรับคุณ:

 identify -format '%[fx:W+71]x%H'

สิ่งนี้ควรให้ผลลัพธ์แก่คุณดังนี้:

 520x352

ดังนั้นสมมติว่าคุณต้องการเพียงแค่ pad / เพิ่ม 'แถบสีขาว' ความกว้าง 71 พิกเซลที่ด้านซ้ายของภาพใด ๆ คุณสามารถใช้ commandline เดียวต่อไปนี้:

 convert \
    in.png \
   -gravity east \
   -background white \
   -extent $(identify -format '%[fx:W+71]x%H' in.png) \
    out2.png

Voila! หนึ่งบรรทัดคำสั่ง (ซึ่งสรุปคำสั่ง 2 คำเพื่อตรงไปตรงมา) และคุณสามารถปล่อยให้สิ่งนี้หลวมใน PNG ของคุณ, JPEGs, GIFs, ... ในไดเรกทอรีเพื่อเพิ่มแถบสีขาว 71pixels ของคุณโดยอัตโนมัติอย่างน่าอัศจรรย์:

 for i in *.png *.jpeg *jpg *.gif; do
    convert \
       ${i} \
      -gravity east \
      -background white \
      -extent $(identify -format '%[fx:W+71]x%H' ${i}) \
       $(convert ${i} -format "71-pixels-padded-left---%t.%e" info:)
 done

สำหรับแต่ละอิมเมจของมันจะยังคงเป็นไฟล์ประเภทเดียวกัน แน่นอนคุณสามารถบังคับใช้เอาต์พุตทั้งหมดให้เป็น PNG (หรืออะไรก็ได้ที่คุณต้องการ) เพียงแทนที่%t.%eส่วนของคำสั่งด้วย%t.png...


8

เอกสารประกอบ: http://www.imagemagick.org/Usage/crop/#extent

convert in.png -gravity east -extent 500x352 out.png

ขอบคุณ !! แต่ถ้ารูปของฉันไม่ใช่ 500x352 - เพราะขนาดแตกต่างกันไป?
gasko peter

1
ฉันแค่แสดงวิธีการ
kev

@kev: คำสั่งของคุณไม่ได้ทำอย่างที่ต้องการ @gasko peter -extend 520x352คุณควรจะได้นำมาใช้ +1 สำหรับ 'ทิศทางที่ถูกต้อง' แม้ว่า :-P
Kurt Pfeifle

sed 's # -extend # -extent # g'
Kurt Pfeifle

ฉันต้องเพิ่ม-background transparentเพื่อรักษาพื้นหลังโปร่งใส
tremby

0

.bash_profileฉันมีคำสั่งนี้กำหนดไว้ในของฉัน มันจะคำนวณขนาดภาพสุดท้ายโดยอัตโนมัติจากการขยายที่คุณต้องการในความกว้างและความสูง (ทำงานร่วมกับศูนย์):

# arithmetic with awk
calc() { awk "BEGIN { print $* }"; }

# pad an image
img_pad() {
    local width height pw ph 
    [ $# -lt 3 ] && { echo "Usage: img_pad <Input> <WxH> <Output>"; return; }

    # parse current size and padding
    IFS=x read width height <<< "$(identify "$1" | awk '{print $3}')"
    IFS=x read pw ph <<< "$2"

    # new widht and height
    width=$(calc "$width + 2*$pw")
    height=$(calc "$height + 2*$ph")

    echo "Converting '$1' to '$3' with size ${width}x${height} (+w=${pw}, +h=${ph})."
    convert "$1" -gravity center -extent "${width}x${height}" "$3"
}

ตัวอย่างการใช้งาน:

# pad 50px left and right, no vertical padding
img_pad in.png 50x0 out.png 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.