มีวิธีการแบทช์การส่งออก SVG เป็น PNG หรือไม่


18

ฉันมี SVGS เหล่านี้และฉันต้องการส่งออกไปยังภาพ PNG ฉันสามารถส่งออกด้วย Inkscape แต่นั่นหมายถึงเปิดแต่ละไฟล์และส่งออกไฟล์ไปยัง PNG ที่ไม่มีประสิทธิภาพ (ฉันมีหลายร้อยคน)

ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


16

ได้รับแรงบันดาลใจจากคำตอบที่ได้รับการยอมรับมาก่อนหน้านี้ฉันจึงได้สิ่งที่ดีที่สุด

สำหรับ Inkscape เวอร์ชั่น 0.92.4 และรุ่นก่อนหน้า:

for file in *.svg; do inkscape $file -e ${file%svg}png; done

วิธีนี้คุณไม่จำเป็นต้องเรียกสคริปต์ หากคุณต้องการคุณสามารถสร้างนามแฝงสำหรับการแปลง svgs ทั้งหมดในไดเรกทอรีปัจจุบันเป็น pngs:

alias svgtopng='for file in *.svg; do inkscape $file -e ${file%svg}png; done'

สำหรับ Inkscape เวอร์ชั่น 1.0 Beta และใหม่กว่า:

for file in *.svg; do inkscape $file -o ${file%svg}png; done

วิธีนี้คุณไม่จำเป็นต้องเรียกสคริปต์ หากคุณต้องการคุณสามารถสร้างนามแฝงสำหรับการแปลง svgs ทั้งหมดในไดเรกทอรีปัจจุบันเป็น pngs:

alias svgtopng='for file in *.svg; do inkscape $file -o ${file%svg}png; done'

1
${file%svg}pngเป็นเคล็ดลับที่ยอดเยี่ยม! ฉันไม่เคยเห็นแบบนั้นมาก่อน
เชสเตอร์

ฉันคิดว่าวิธีนี้ใช้ไม่ได้กับช่องว่างในชื่อไฟล์
Genom

26

ดูเหมือนว่าคุณสามารถใช้ Inkscape จากบรรทัดคำสั่ง:

`#{INKSCAPE_PATH} -z -f #{source_svg} -w #{width} -j -e #{dest_png}`

รายละเอียดเพิ่มเติม

ฉันคิดว่าคุณสามารถเขียนสคริปต์ทุบตีง่ายๆเพื่อประมวลผลไฟล์ SVG ทั้งหมด:

#!/bin/sh

for file in *.svg
do
     /usr/bin/inkscape -z -f "${file}" -w 640 -e "${file}.png"
done

ตัวอย่างข้างต้นแปลงไฟล์. svg ทั้งหมดในไดเรกทอรีปัจจุบันโดยเพิ่มนามสกุล. png ให้กับไฟล์เอาต์พุต


ฉันกำลังพยายามส่งออกหลายร้อย svgs ฉันจะตั้งค่าการส่งออก (ปลายทาง) เพื่อให้พวกเขาเก็บชื่อของพวกเขาได้อย่างไร เพราะดูเหมือนว่าจะทำงานได้ดีสำหรับปริมาณเล็กน้อย
Uri Herrera

@UriHerrera: ฉันปรับปรุงคำตอบ
Sergey

ไฟล์ทั้งหมดจะถูกบันทึกไว้ในรูปแบบ {file} .svg.png แทนที่จะเป็น {file} .png? จะแก้ไขได้อย่างไร? และยังอยู่ใน SVG เดิมมันจะปรากฏไอคอนทางลัดเล็ก ๆ น้อย ๆ ที่มุมล่างขวาซึ่งหายไปเมื่อมีการแปลงเป็น PNG (ฉันพยายามที่จะแปลงไอคอนแพ็ค)
Tōshō

@Tosho ขณะนี้ฉันใช้ Windows แต่ควรเป็นแบบนี้: pastebin.com/TEDfvxPC
user31389

2
@Tosho ${file%svg}pngคุณยังสามารถทำ คุณสามารถอ่านได้ที่นี่เพื่อความเป็นไปได้มากขึ้น
jja

5

สคริปต์ Nautilus แบบกราฟิก


ภาพรวม

บรรทัดคำสั่งนั้นยอดเยี่ยมสำหรับการแปลงแบทช์ แต่บางครั้งคุณก็ไม่ต้องการให้ GUI ของคุณสบาย นั่นเป็นเหตุผลที่ฉันเขียนโค้ด Nautilus บน GUI เพื่อแปลงไฟล์ SVG เป็นภาพ PNG ตัวจัดการไฟล์อื่น ๆ ที่มีการกระทำที่กำหนดเอง (เช่น Thunar) ควรได้รับการสนับสนุนเช่นกัน

ภาพหน้าจอ

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

ต้นฉบับ

#!/bin/bash

# NAME:         SVG2PNG
# VERSION:      0.1
# AUTHOR:       (c) 2014 Glutanimate (https://github.com/Glutanimate)
#
# DESCRIPTION:  Simple application to convert SVG files to PNG files based on DPI or resolution. 
#               Designed to work as a context menu script in file managers like Nautilus and Thunar.
#
# FEATURES:     - Converts SVG image file to PNG raster of a specific DPI or width
#               - SVG preview
#               - choose between converting the full SVG page or only the cropped image
#
# DEPENDENCIES: inkscape imagemagick yad
#               YAD (1) is an advanced for of Zenity with many improvements. It's not included in the
#               official Ubuntu repos yet (2) but can be installed from a webupd8 PPA (3)
#
# LICENSE:      MIT license (http://opensource.org/licenses/MIT)
#
# NOTICE:       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
#               INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
#               PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
#               LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
#               TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 
#               OR OTHER DEALINGS IN THE SOFTWARE.
#
#
# USAGE:        SVG2PNG image1.svg image2.svg [..]
#               I recommend installing this script as a context menu action for your file manager.
#               Instructions for Nautilus may be found on AskUbuntu (4).
#
# NOTES:        The script uses convert for previews because it's faster. For optimal results
#               the actual conversion is done with inkscape's command line interface.
#
# LINKS:        (1) https://code.google.com/p/yad/
#               (2) https://bugs.launchpad.net/ubuntu/+bug/796633
#               (3) https://launchpad.net/~webupd8team/+archive/y-ppa-manager
#               (4) /ubuntu/236414/how-can-i-install-a-nautilus-script

############## DIALOGS ###################

TITLE="SVG to PNG"
ICON="svg"

############## USGCHECKS #################

# checks if user selected an item

if [ $# -eq 0 ]
  then
      yad --title="$TITLE" \
          --image=dialog-error \
          --window-icon=dialog-error \
          --class="$WMCLASS" \
          --text="Error: no file selected" \
          --button="Ok":0
      echo "Error: no file selected"
      exit
fi

############### GLOBVAR ##################

SVGFILES="$@"
TEMPDIR=$(mktemp -d)
PREVIEWIMG="$TEMPDIR/svgpreview.png"

############### CLEANUP ##################

trap "rm -r $TEMPDIR" EXIT 

############## FUNCTIONS #################

converttosvg_dpi(){

echo "Converting based on DPI."

while [ $# -gt 0 ]; do

    echo "$# file(s) left to convert."
    SVGFILE="$1"
    FILESTEM="${SVGFILE%%.*}"
    PNGFILE="$FILESTEM".png
    inkscape "$SVGFILE" -z --export-dpi="$DPI" \
    --"$AREASETTING" --export-png="$PNGFILE"
    shift

done
echo "Done."

}

converttosvg_res(){

echo "Converting based on Width."

while [ $# -gt 0 ]; do

    echo "$# file(s) left to convert."
    SVGFILE="$1"
    FILESTEM="${SVGFILE%%.*}"
    PNGFILE="$FILESTEM".png
    inkscape "$SVGFILE" -z --export-width="$WIDTH" \
    --"$AREASETTING" --export-png="$PNGFILE"
    shift

done
echo "Done."

}

createpreview() {
convert -resize 128x "$1" "$PREVIEWIMG"
}

getsettings() {

SETTINGS=$(yad --window-icon "$ICON" --image "$PREVIEWIMG" --width 300 --height 200 --always-print-result \
--form --separator="|" --title="$TITLE" --text "Please choose the DPI or resolution to convert to." \
--field="DPI:NUM" 10[!80..600[!10]] --field="Width in px:NUM" 16[!16..4096[!16]] \
--field="Area:":CB "Drawing"\!"Page" \
--button="Convert based on DPI:2" --button="Convert based on Resolution:3" --button="gtk-cancel:1")

RET=$? # Exit code?

if [ "$RET" = 252 ] || [ "$RET" = 1 ]  # WM-Close or "Abort"
  then
      echo "Exiting..."
      exit
fi

DPI=$(printf %.0f $(cut -d "|" -f 1 <<<"$SETTINGS")) #round values
WIDTH=$(printf %.0f $(cut -d "|" -f 2 <<<"$SETTINGS"))
AREA=$(cut -d "|" -f 3 <<<"$SETTINGS")

case "$AREA" in

Drawing)
  AREASETTING="export-area-drawing"
  ;;

Page)
  AREASETTING="export-area-page"
  ;;

esac

echo "DPI set to $DPI"
echo "Width set to $WIDTH"
echo "Area set to $AREA"

}


################ MAIN ####################

createpreview "$1"
getsettings

case "$RET" in

2)
  echo 2
  converttosvg_dpi "$@"
  ;;

3)
  echo 3
  converttosvg_res "$@"
  ;;

esac

exit 0

ฉันจะพยายามอัปเดตคำตอบนี้ แต่โปรดตรวจสอบที่เก็บ Githubของฉันสำหรับเวอร์ชันล่าสุดของสคริปต์

การติดตั้ง

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

sudo add-apt-repository ppa:webupd8team/y-ppa-manager
sudo apt-get update
sudo apt-get install yad inkscape imagemagick

สำหรับข้อมูลเพิ่มเติมโปรดอ่านส่วนหัวของสคริปต์ด้านบน

การใช้

หลังจากติดตั้งสคริปต์แล้วคุณจะสามารถเรียกใช้งานได้จากเมนูบริบทของตัวจัดการไฟล์ เพียงเลือกไฟล์ SVG หนึ่งไฟล์ขึ้นไปและคลิกที่รายการที่เหมาะสมในเมนูบริบทของคุณ กล่องโต้ตอบ GUI ควรมีตัวเลือกหลายตัวที่เกี่ยวข้องกับการแปลง

คุณสามารถแปลง SVG ตาม DPI หรือความกว้าง อัตราส่วนภาพจะได้รับการอนุรักษ์ในทั้งสองกรณี ตรวจสอบให้แน่ใจว่าได้ระบุ DPI หรือความกว้างของตัวเลือกของคุณก่อนคลิกที่ปุ่มแปลง

นอกจากนี้คุณยังสามารถเลือกระหว่างการส่งออกไฟล์ SVG แบบเต็มหรือเฉพาะรูปวาดที่ครอบตัด หากผ้าใบ SVG ของคุณมีพื้นที่ว่างจำนวนมากแนะนำให้เลือก "การวาดภาพ" เป็นตัวเลือกการส่งออก


2

นี่เป็นทางเลือกที่แตกต่างออกไปเล็กน้อยในภาษาสคริปต์ที่อ่านได้ง่ายขึ้น - python มันแบทช์สามารถส่งออก svgs ทั้งหมดของคุณ เหมาะอย่างยิ่งถ้าคุณทำ Android dev และต้องทำหลาย pngs จาก svg เดียว

คำเตือน: ฉันเขียน lib หวังว่าจะช่วยใครซักคน

คลิกที่นี่

สำหรับการใช้งานง่าย ๆ ให้ดาวน์โหลดไลบรารี่ในโฟลเดอร์ใส่ svgs ในโฟลเดอร์เดียวกันจากนั้นรัน

python exporter.py

ในบรรทัดคำสั่ง / เทอร์มินัลหลังจากที่คุณcdไปยังโฟลเดอร์ สำหรับตัวเลือกที่สูงขึ้นไม่ตรวจสอบREADME


ขอบคุณ David ฉันได้แก้ไขคำตอบของฉันเพื่อให้รายละเอียดเพิ่มเติม!
Kevin Lee

1

หากไม่ใช่ไฟล์ทั้งหมดแต่ต้องแปลงไฟล์ SVG บางไฟล์เป็น PNG หนึ่งไฟล์อาจใช้sedเพื่อสร้างชื่อไฟล์โดยอัตโนมัติ:

inkscape --without-gui --export-width=1280 --export-png=`echo $1 |sed -e 's/svg$/png/'` $1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.