วิธีการวาดภาพ svg ให้พอดีกับผืนผ้าใบบนบรรทัดคำสั่ง


13

การครอบตัด.svgไฟล์ในบรรทัดคำสั่งนั้นง่ายมาก: $ inkscape --verb=FitCanvasToDrawing --verb=FileSave --verb=FileClose *.svg

ฉันต้องทำสิ่งที่ตรงกันข้าม ฉันต้องการให้พอดีกับรูปวาดลงใน64 x 64ผืนผ้าใบจุด (ตั้งค่าแล้วใน.svgไฟล์ทั้งหมด) น่าเสียดายที่ Inkscape ไม่มีFitDrawingToCanvasคำสั่ง ยิ่งไปกว่านั้นความเหมาะสมควรจะรักษาอัตราส่วนของภาพวาด

ถ้ามันเป็นเรื่องสำคัญ: ฉันใช้ Ubuntu raring


1
จะปรับขนาดหลังจากปรับผืนผ้าใบเพื่อวาดงานหรือไม่ ดูgraphicdesign.stackexchange.com/questions/6574/…
Takkat

สองคำถาม: (1) ขนาดผ้าใบถูกกำหนดไว้แล้วในแต่ละอินสแตนซ์ แต่ภาพวาดนั้นใหญ่กว่าผืนผ้าใบ หรือคุณกำลังแทรกภาพวาด svg ลงในเอกสาร svg อื่นหรือไม่?; (2) "รักษาอัตราส่วน": นี่เป็นความสับสนในแง่ของผ้าใบสี่เหลี่ยม 64pt ที่กล่าวถึงในคำถามของคุณ แต่คุณมีกระบวนการตัดสินใจอัตโนมัติที่นำเสนอสำหรับวิธีการจัดการกับวัสดุที่ไม่ใช่สี่เหลี่ยมหรือไม่? เช่นความสูงควรเป็น 64pt ในทุกกรณี ...
horatio

@ Takkat: ขอบคุณสำหรับคำใบ้ เวิร์กโฟลว์ทำงานได้ แต่อัตราส่วนถูกทำลาย จะหาทางออกให้กับมัน ...
Stefan Endrullis

@horatio: (1) การวาดในขนาดเล็กกว่าผืนผ้าใบและใช่ทั้งสองอยู่ในไฟล์เดียวกัน (2) ฉันต้องการที่จะปรับขนาดการวาดภาพไปยังจุดที่สูงสุด (drawingWidth, drawingHeight) = 64pt
Stefan Endrullis

@ Takkat: rsvg-convert มีอาร์กิวเมนต์ --keep-กว้างขึ้นอัตราส่วน :)
Stefan Endrullis

คำตอบ:


2

ฉันพบวิธีการทำสิ่งนี้ในคำถามนี้: Inkscape - Center Drawing to Page ผ่าน Command Line / Terminal

ด้วย "foo.svg" เป็นภาพที่จะแก้ไข:

inkscape --verb=EditSelectAll --verb=AlignHorizontalCenter --verb=AlignVerticalCenter --verb=FileSave --verb=FileQuit foo.svg

หากต้องการแก้ไขภาพ svg ทั้งหมดในไดเรกทอรีปัจจุบัน:

inkscape --verb=EditSelectAll --verb=AlignHorizontalCenter --verb=AlignVerticalCenter --verb=FileSave --verb=FileClose *.svg

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

for img in $(ls *.svg) ; do inkscape --verb=EditSelectAll --verb=AlignHorizontalCenter --verb=AlignVerticalCenter --verb=FileSave --verb=FileQuit $img ; done

สำหรับคำสั่งข้างต้นหากไฟล์ใด ๆ เป็น symlink, Inkscape จะแก้ไขไฟล์เป้าหมายที่ symlink ชี้ไป หากคุณไม่ต้องการให้ Inkscape ทำเช่นนี้คุณสามารถกรอง symlink ใด ๆ ด้วยคำสั่งนี้:

for img in $(ls *.svg) ; do if [[ $(readlink $img) == "" ]] ; then inkscape --verb=EditSelectAll --verb=AlignHorizontalCenter --verb=AlignVerticalCenter --verb=FileSave --verb=FileQuit $img ; fi ; done


ในขณะที่ฉันอยู่ที่นี่ฉันก็อาจโพสต์สคริปต์ทุบตีที่ฉันทำเพื่อสิ่งนี้:

#!/bin/bash
# inkscape-center <file-or-directory>...

_analyse() {
    if [ -d "${1}" ] ; then
        _centerAll "${1}" ;
    else
        _center "${1}" ;
    fi
}

_centerAll() {
    cd "${1}" ;
    for img in $(ls "*.svg") ; do
        _filterSyms "${img}" ;
    done
}

_filterSyms() {
    if [[ $(readlink "${1}") == "" ]] ; then
        _center "${1}"
    fi
}

_center() {
    inkscape --verb=EditSelectAll --verb=AlignHorizontalCenter --verb=AlignVerticalCenter --verb=FileSave --verb=FileQuit "${1}"
}

for arg ; do
    _analyse "${arg}" ;
done

ฉันเรียกมันinkscape-centerและเรียกใช้เช่นนี้:

inkscape-center <file-or-directory>

มันต้องใช้อาร์กิวเมนต์มากเท่าที่คุณต้องการดังนั้นคุณสามารถทำสิ่งนี้:

inkscape-center 1st.svg 2nd.svg 3rd.svg 4th.svg

โปรดระวัง - หากคุณระบุไดเรกทอรีแทนที่จะเป็นไฟล์มันจะแก้ไขทุกไฟล์ svg ในไดเรกทอรีนั้น


1

คุณสามารถใช้viewBoxเพื่อบรรลุสิ่งที่คุณต้องการ ฉันไม่รู้ว่ามีวิธีการทำเช่นนี้จากใน Inkscape หรือไม่ แต่เนื่องจาก SVG เป็นรูปแบบมาตรฐานและอาจมีเครื่องมืออื่นที่จะทำงานที่คุณต้องการ การค้นหาอย่างรวดเร็วสำหรับ "เครื่องมือบรรทัดคำสั่ง svg" เปิดเผยผลลัพธ์ที่น่าสนใจรวมถึงสิ่งนี้สำหรับการสร้างไอคอน CSS

ตัวเลือกที่สองคือการเขียนเครื่องมือของคุณเองในภาษาที่คุณเลือกเพื่อทำสิ่งนี้ ส่วนสำคัญพื้นฐานคือการตั้งค่า viewBox เป็นความสูงของเอกสารของคุณจากนั้นตั้งค่าความกว้างและความสูงของเอกสารที่ต้องการ ขั้นสุดท้ายให้ตั้งค่าคุณสมบัติ

นี่คือลักษณะของการดัดแปลงที่อธิบายข้างต้นในเอกสารที่ แต่เดิมเป็น 744x1052

<svg
   width="64"
   height="64"
   viewBox="0 0 744 1052"
    preserveAspectRatio="xMinYMin slice"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.