ชุดแปลงภาพ SVG เป็น PNG หรือ ICO ขนาดที่ต้องการ


26

ฉันมีไอคอน SVG มากมายที่ฉันต้องการใช้สำหรับแอปพลิเคชันของฉันที่จะพัฒนาใน VB.Net 2010 และเนื่องจากไม่มีการรองรับไอคอน SVG ฉันจึงต้องแปลงไอคอนเหล่านั้นให้เป็น PNG หรือ ICO ตามต้องการ ความละเอียดเอาต์พุต rsvgconvertฉันได้พบเช่นเครื่องมือบรรทัดคำสั่งสำหรับอูบุนตูที่เรียกว่า เรามีเครื่องมือเช่นนี้สำหรับ Windows หรือไม่?

คำตอบ:


12

ImageMagickมีเครื่องมือบรรทัดคำสั่งที่พร้อมใช้งานสำหรับ Linux และ Windows (และอื่น ๆ ) เครื่องมือแปลงเรียกว่า "แปลง" นี่คือบางส่วนเอกสารประกอบการใช้งาน

และนี่คือสิ่งที่คุณจะได้รับการติดตั้งของ Windows


นอกจากนี้คุณยังสามารถรับมันผ่านระบบย่อย Windows สำหรับ Linux (WSL) ด้วยapt install imagemagick
antonyh

(สิ่งนี้ใช้กับ linux, อาจใช้กับ windows) หากคุณเปิด -verbose บน IM จากนั้นจะปรากฏว่า IM นั้นใช้ inkscape เพื่อสร้างไฟล์ eps ระดับกลาง ดังนั้นฉันอยากจะแนะนำคำตอบของ @ zetah
-bradley

นี่คือโปรแกรมแปลงรูปภาพที่ใช้ ImageMagick ขนาดเล็กสำหรับ Windows: fosshub.com/SVG2PNG.htmlเก่า (ตั้งแต่ปี 2014) แต่ยังใช้งานได้และคุณไม่ต้องอ่านเอกสารใด ๆ
8day

20

ImageMagick ไม่ควรเชื่อมโยงกับงานที่เกี่ยวข้องกับภาพในทันที โดยเฉพาะอย่างยิ่งในกรณีที่ ImageMagick เป็นโซลูชันที่ไม่ดีสำหรับการแปลง SVG

ลองใช้Inkscapeในบรรทัดคำสั่ง:

inkscape in.svg --export-png=out.png


8
ทำไมคุณถึงบอกว่า inkscape ดีกว่า ImageMagick ฉันไม่เห็นด้วย (หรือเห็นด้วย) เพียงแค่อยากรู้รายละเอียดเพิ่มเติม
Sam

เหตุผลที่เป็น imageMagick เหมาะที่จะจัดการ png, jpg และอื่น ๆ ได้ดีกว่าในขณะที่ inkscape เหมาะสำหรับการจัดการภาพเวกเตอร์ (svg)
93

1
มันไม่ตอบคำถามเกี่ยวกับการแปลงแบทช์ใช่ไหม?
หรือผู้ทำแผนที่

ในขณะที่คำตอบนั้นใช้งานได้บน Windows InkScape ยืนยันที่จะแสดงหน้าจอสแปลชที่มีการโฟกัสที่ล่าช้าซึ่งทำให้ไม่สามารถรันโหมดแบทช์ในพื้นหลังได้
Timwi

@ Timwi นั่นไม่ได้เกิดขึ้นที่นี่ เพียงจำไว้ว่าให้ใช้-zตัวเลือก
Svish

5

บรรทัดคำสั่งไม่ทำงานนอกกรอบรวมทั้งฉันต้องการแปลงไฟล์ 100 ไฟล์ นี่คือวิธีที่ฉันทำให้มันทำงานกับ windows 7:

  1. ติดตั้งinkscape - ไม่ใช่พกพา!

  2. คัดลอกไฟล์ svg ทั้งหมดของคุณไปไว้ในโฟลเดอร์เดียวเช่น "C: \ svgs \" ที่นั่น:

  3. คุณสร้างconvert.batไฟล์ด้วยบรรทัดนี้ภายใน:

    FOR %%A IN (*.svg) DO "C:\Program Files (x86)\Inkscape\inkscape.exe" --export-png=%%A.png
    

    (ชี้ไปที่โฟลเดอร์ที่ถูกต้องของการติดตั้งของคุณ):

  4. เปิด CMD ในฐานะผู้ดูแลระบบ! ในการทำเช่นนั้นกดปุ่ม WIN พิมพ์ cmd คลิกขวาที่ "cmd.exe" แล้วเลือก "Run as administrator"

  5. นำทางไปยัง "C: \ svgs \" และพิมพ์convert.bat - ไฟล์ svg ทั้งหมดจะถูกแปลงเป็น PNG

  6. ใช้ Windows Explorer เพื่อค้นหาไฟล์ PNG ที่แปลงแล้ว บนพีซีของฉันอยู่ในโฟลเดอร์:C:\Users\myname\AppData\Local\VirtualStore\Program Files (x86)\Inkscape\svgs

หวังว่าจะช่วย


ในฐานะที่เป็นความละเอียดสำหรับบรรทัดคำสั่งเท่านั้นที่จะได้ตั้งคงที่เท่าที่ฉันจะได้เห็นผมจบลงด้วยการใช้เครื่องมือ InkscapeBatch ที่นั่นฉันสามารถตั้งค่า DPI เพื่อเพิ่มภาพทั้งหมดค่อนข้าง

คุณต้องระบุการตั้งค่าที่ถูกต้องไม่เช่นนั้นจะไม่ทำงาน นี่คือสิ่งที่ฉันทำ:

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

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

หลังจากที่คุณกดปุ่ม "เสร็จสิ้น" คุณจะต้องกดปุ่ม "เริ่มการแปลงชุด ... " ในแถบเครื่องมือ:

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


1
ชุดคำสั่งของคุณอาจขาดอีก%%A(เป็นชื่อไฟล์อินพุต) นอกจากนี้คุณคิดว่าเหตุใดจึงควรทำงานในโหมดผู้ดูแลระบบเท่านั้น
หรือผู้ทำแผนที่

ดังนั้นวิธีนี้จะดีกว่าการใช้ ImageMagick
reinierpost

น่าเศร้าที่ลิงค์นี้ดูเหมือนว่าจะตายด้วย (สิงหาคม 2017)
Ideogram

@Ideogram ฉันมีผู้ให้บริการดาวน์โหลดอีกรายแล้ว softsea.com/download/InkscapeBatch.html
Kai Noack

สำหรับ specifiying dpi ที่คุณต้องการที่จะเพิ่มตัวเลือกนี้--export-dpi=100ที่ 100 คือค่าของ dpi TH
Xsmael

3

InkscapeBatchทำงานบน Windows ต้องInkscape


ใช้งานไม่ได้ ฉันลองใช้หลังจากติดตั้ง Inkscape v0.91 และแจ้งว่าไม่พบ Inkscape
Joris Groosman

1
ดูเหมือนจะไม่มีอีกต่อไป
หรือผู้ทำแผนที่

ลิงค์สำรอง -> softsea.com/download/InkscapeBatch.html
computingfreak

3

สำหรับการแปลง SVG เป็น PNG ฉันพบ cairosvg ( https://cairosvg.org/ ) ทำงานได้ดีกว่า ImageMagick ขั้นตอนสำหรับการติดตั้งและเรียกใช้ไฟล์ทั้งหมดในไดเรกทอรีของคุณ

pip3 install cairosvg

เปิด python shell ในไดเร็กทอรีซึ่งมีไฟล์. svg ของคุณและรัน:

import os

for file in os.listdir('.'):
    name = file.split('.svg')[0]
    cairosvg.svg2png(url=name+'.svg',write_to=name+'.png') 

สิ่งนี้จะช่วยให้แน่ใจว่าคุณจะไม่เขียนทับไฟล์. svg ดั้งเดิมของคุณ แต่จะใช้ชื่อเดิม จากนั้นคุณสามารถย้ายไฟล์. png ทั้งหมดไปยังไดเรกทอรีอื่นด้วย:

$ mv *.png [new directory]

คำตอบนี้เป็นคำตอบเดียวที่ใช้ได้กับไฟล์ SVG ที่ค่อนข้างใหญ่ของฉันขอบคุณ !!!
Ben Sandeen

1

หลังจากต่อสู้กับสิ่งนี้มาเกือบ 2 ชั่วโมงฉันก็ตัดสินด้วย Inkscape เนื่องจากฉันต้องการแบตช์แปลงไฟล์หลาย ๆ ไฟล์ในความละเอียดที่แตกต่างกันมากมายฉันได้สร้างสคริปต์ Powershell ด้วย 106 SVGs คอมพิวเตอร์ของฉันค้างเป็นเวลาประมาณ 5 วินาทีดังนั้นควรใช้ความระมัดระวัง

# ENTER THE FULL PATH TO THE INKSCAPE EXECUTABLE
$inkscapeExe = "C:\Program Files\Inkscape\inkscape.exe"
# ENTER THE PATH TO THE FOLDER CONTAINING THE SVGs
$svgFolder = "C:\Images\SVG"
# ENTER THE DESIRED WIDTH
$width = 120
# ENTER THE DESIRED HEIGHT
$height = 120

$svgFiles = Get-ChildItem $svgFolder -Filter *.svg
foreach ($svgFile in $svgFiles)
{
    $inputParam  = $svgFile.FullName 
    $outputParam = "--export-png=" + $svgFile.FullName + "-" + $width + "x" + $height + ".png" 
    $widthParam  = "-w" + $width
    $heightParam = "-h" + $height

    & $inkscapeExe $inputParam $outputParam $widthParam $heightParam
}

ฉันแข็งตัวนานกว่าสองสามวินาที ตัว&ดำเนินการเริ่มต้นกระบวนการใหม่และดำเนินการต่อในทันทีดังนั้นสคริปต์นี้จะสร้างกระบวนการ inkscape.exe ใหม่จำนวนมากเมื่อคุณมีไฟล์ svg ปรากฎว่าสิ่งนี้ทำให้คอมพิวเตอร์ของคุณค่อนข้างช้าในขณะที่
โรรี่

ถ้าคุณใส่| Out-Nullท้ายบรรทัดที่เริ่มต้นด้วย&มันจะบังคับให้เรียกใช้คำสั่ง inkscape.exe ทีละครั้งซึ่งทำงานได้ดีกว่ามากสำหรับฉัน
โรรี่

1

คุณสามารถใช้สิ่งต่อไปนี้ใน Bash / Ubuntu สำหรับ Windows ในโฟลเดอร์ที่คุณมี SVG ที่ อย่างไรก็ตามดูเหมือนว่า ImageMagick จะทำการปรับขนาดครั้งแรกแล้วส่งผลให้เกิดสิ่งประดิษฐ์แปลก ๆ ...

find -name "*.svg" -exec convert {} -background none -density 300 -resize 256x256 -define icon:auto-resize -alpha remove -colors 256 {}.ico \;

ดูที่โซลูชันอิงตาม Inscape ของที่นี่ซึ่งดูเหมือนว่าจะทำงานได้ดี (จากเธรดอื่นลิงก์หายไป): mkdir temp; declare -a res=(16 24 32 48 64 128 256); for f in *.svg; do for r in "${res[@]}"; do inkscape -z -e temp/${f}${r}.png -w $r -h $r $f; done; resm=( "${res[@]/#/temp/$f}" ); resm=( "${resm[@]/%/.png}" ); convert "${resm[@]}" ${f%%.*}.ico; done; rm -rf temp;


1
+1 ฉันใช้กับ inkscape ในเวอร์ชันที่ง่ายมากfind -name "*.svg" -exec inkscape {} -e {}.png \;แม้ว่าฉันจะชอบรุ่นนี้: ls | grep ".svg" | xargs -I file inkscape file -e file.pngเนื่องจากไฟล์นั้นถูกประมวลผลตามตัวอักษร - นี่ไม่ใช่กรณีเมื่อใช้find
loves.by.Jesus


0

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

ในการทำเช่นนี้คุณจะต้องใช้ Inkscape, MS Excel หรือตัวแก้ไขสเปรดชีตที่เทียบเท่าและตัวสร้างรายการ มีตัวสร้างรายการฟรีแวร์เล็ก ๆ น้อย ๆ ที่นี่: https://www.portablefreeware.com/?id=1171

  • ฮาร์ดลิงก์, คัดลอกหรือย้ายไฟล์ svg ทั้งหมดไปไว้ในโฟลเดอร์เดียว
  • สร้างรายการไฟล์ของโฟลเดอร์นั้นและส่งออกไปยัง csv
  • เปิด csv ใน Excel และลบคอลัมน์ทั้งหมดยกเว้นคอลัมน์ชื่อไฟล์ ลบส่วนหัวของคอลัมน์เช่น [เส้นทาง] และข้อความสรุปที่ด้านล่าง
  • หากชื่อไฟล์ไม่ได้อยู่ในคอลัมน์ที่สองให้ตัดและวางที่นั่น
  • ในเซลล์แรกของคอลัมน์แรกประเภท inkscape ตามด้วยช่องว่างและเส้นทางโฟลเดอร์ที่ไฟล์ svg ของคุณรวมถึงแบ็กสแลชต่อท้าย (เช่น "inkscape C: \ SVG \") จากนั้นคัดลอกเซลล์นี้เลือกเซลล์ทั้งหมดด้านล่างที่อยู่ข้างหน้าชื่อไฟล์และวางเพื่อให้เซลล์ทั้งหมดมีข้อความเหมือนกัน
  • ในประเภทคอลัมน์ที่สาม --export-png = ในเซลล์แรกตามด้วยโฟลเดอร์ปลายทางที่คุณต้องการบันทึกไว้ฉันเพิ่งใช้โฟลเดอร์เดียวกัน เพื่อให้ไวยากรณ์มีความถูกต้องตรวจสอบให้แน่ใจว่าได้เพิ่มช่องว่างที่จุดเริ่มต้น แต่ให้คงส่วนที่เหลือของข้อความไว้ด้วยกัน (เช่น "--export-png = C: \ PNG \") คัดลอกและวางสิ่งนี้สำหรับทุกแถวเช่นเดียวกับคอลัมน์แรก
  • คัดลอกคอลัมน์ที่สองทั้งหมดแล้ววางลงในคอลัมน์ที่สี่ เมื่อเลือกคอลัมน์ที่สี่แล้วกด Ctrl + H (ค้นหาและแทนที่) ในประเภทค้นหาฟิลด์ ".svg" ในประเภทแทนที่ฟิลด์ ".png" จากนั้นเลือกแทนที่ทั้งหมด

หากคุณทำอย่างถูกต้องคุณควรมีหนึ่งแถวสำหรับแต่ละชื่อไฟล์ที่มีลักษณะดังนี้: | inkscape C: \ SVG \ | Filename1.svg | --export-PNG = C: \ PNG \ | Filename1.png |

  • ในเซลล์แรกของคอลัมน์คอลัมน์ที่ห้า "= เรียงต่อกัน (a2, b2, c2, d2)" สิ่งนี้ถือว่าคอลัมน์ส่วนหัวยังไม่ถูกลบ หมายเลขเซลล์ในวงเล็บควรเห็นด้วยกับหมายเลขแถวปัจจุบัน หากชื่อไฟล์ของคุณเป็น B2 สูตรข้างต้นจะถูกต้อง มิฉะนั้นถูกต้องชื่อเซลล์ในวงเล็บเพื่อให้ตรงกับแถวของชื่อไฟล์แรก (เช่น a1, b1, c1 ... )
  • คัดลอกและวางเซลล์นี้เพื่อเติมด้านล่างทั้งหมดเช่นเดียวกับคอลัมน์ 1 และ 3
  • ตอนนี้คัดลอกคอลัมน์ที่ห้าทั้งหมดและใช้วางแบบพิเศษ> ค่าเพื่อวางข้อความที่ผลิตโดยสูตรลงในคอลัมน์ที่หก คอลัมน์ที่หกนี้คือเงินของคุณ คัดลอกคอลัมน์ที่หกทั้งหมดเปิด Notepad แล้ววางคอลัมน์สุดท้ายลงในคอลัมน์ หากคุณทำอย่างถูกต้องคุณจะมีหนึ่งบรรทัดคำสั่งเพื่อแปลงไฟล์ svg แต่ละไฟล์ของคุณเป็น pngs
  • บันทึกไฟล์ Notepad ไปยังไดเรกทอรี Inkscape เป็นไฟล์แบตช์ เมื่อหน้าต่างบันทึกเป็นเปิดขึ้นให้เปลี่ยนบันทึกเป็นประเภทเป็น "ไฟล์ทั้งหมด" และบันทึกเป็นไฟล์. bat (เช่น "C: \ Program Files \ Inkscape \ SVGBatch.bat"
  • สิ่งที่เหลืออยู่ที่ต้องทำคือเข้าไปในโฟลเดอร์นั้นและดับเบิลคลิกที่ไฟล์แบตช์ที่คุณเพิ่งบันทึก ควรเปิดพรอมต์คำสั่งและแปลงไฟล์ทั้งหมด

หวังว่าจะทำให้ชีวิตของใครบางคนง่ายขึ้น เจมส์


0

คำตอบของไคอยู่ใกล้ แต่ไม่ได้ผลสำหรับฉัน อย่างไรก็ตามด้วยการปรับแต่งเล็กน้อยสองครั้งนี่ทำงานได้อย่างไร้ที่ติ:

  1. คัดลอก SVG ของคุณไปยังตำแหน่งที่สะดวก
  2. สร้างไฟล์ข้อความในโฟลเดอร์เดียวกันและเปลี่ยนชื่อ convert.bat
  3. เปิดconvert.batในเครื่องมือแก้ไขข้อความ / รหัสที่คุณโปรดปรานและป้อนข้อมูลต่อไปนี้:

FOR %%A IN (*.svg) DO "C:\Program Files\Inkscape\inkscape.exe" %%A --export-png=%%A.png

(โปรดทราบว่าinkscape.exeตำแหน่งควรตรงกับตำแหน่งโปรแกรมที่เรียกใช้งานได้บนพีซีของคุณและตำแหน่งที่สองก่อนหน้า--export-pngคือ%%A- นั่นคือไฟล์ SVG ที่กำลังถูกแปลง)

  1. ดับเบิลคลิกconvert.batเพื่อเรียกใช้และควรสะท้อนผลลัพธ์ของการแปลง

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


0

ไม่สามารถรับ imagemagick หรือ inkscape สำหรับฉันด้วยเหตุผลบางอย่าง ฉันมี 12 ไฟล์ที่จะแปลงเพียงแค่ใช้ไซต์นี้ด้วยตนเอง: http://svgtopng.com/ทำงานได้ดีมาก


0

นี่คือโซลูชันที่ใช้ ImageMagick เพื่อแปลงไฟล์ svg ทั้งหมดในไดเรกทอรีที่กำหนดเป็นไฟล์ ico:

mogrify -format ico -density 1200 -background transparent -trim -resize 256x256 -gravity center -extent 256x256 -define icon:auto-resize *.svg

คำอธิบาย:

  • mogrify: กดconvertไลค์ แต่ให้คุณประมวลผลหลายไฟล์เป็นชุด
  • -format ico: รูปแบบไฟล์เป้าหมายของเรา สร้าง.icoไฟล์แทนการเขียนทับไฟล์ต้นฉบับ (ตามค่าเริ่มต้นจะทำ mogrify)
  • -density 1200: เนื่องจากเราไม่สามารถระบุขนาดพิกเซลเป้าหมายที่ ImageMagick ควรทำการ rasterize SVG ให้เป็น (จะเริ่มที่ rasterize ด้วยความหนาแน่นเริ่มต้นจากนั้นปรับสเกล) เราจึงทำการ SVG ใหม่ด้วยความละเอียดสูงอย่างไม่น่าเชื่อ (1200dpi) จะถูกลดขนาดเป็น 256x256 แทนที่จะลดอัตราการสุ่ม
  • -background transparent: พื้นหลังจะแสดงผลแบบโปร่งใส
  • -trim: ลบเส้นขอบที่มีอยู่รอบ ๆ ภาพ
  • -resize 256x256: ปรับขนาดภาพเพื่อให้แน่ใจว่าด้านที่ยาวที่สุดมี 256px โดยรักษาอัตราส่วนไว้
  • -gravity center -extent 256x256: ขยายผืนผ้าใบเพื่อให้แน่ใจว่าด้านสั้นมี 256px เช่นกัน รูปภาพที่มีอยู่ถูกจัดกึ่งกลาง สิ่งนี้จำเป็นเพราะเราต้องการรูปสี่เหลี่ยมจัตุรัสเป็นพื้นฐานสำหรับไฟล์ ICO
  • -define icon:auto-resize: รวมไม่เพียง แต่ภาพขนาด 256x256 แต่ยังรวมถึงความละเอียดที่ลดขนาดที่แนะนำทั้งหมด (เช่น 32x32) ในไฟล์ ICO

0

คำตอบส่วนใหญ่ที่ให้มาที่นี่จะไม่สนใจขนาดที่ต้องการของคำถาม ฉันไม่สามารถรับผลลัพธ์ที่น่าพึงพอใจconvertเมื่อใช้"การลดอัตราการสุ่ม" SVG inkscapeทำงานได้ดีขึ้นและยังรักษาพื้นหลังโปร่งใส

ขึ้นอยู่กับกรณีการใช้งานของคุณใช้หนึ่งในตัวเลือกต่อไปนี้:

  1. ส่งออกที่ DPI ที่ระบุ: inscape in.svg -d 300 -e out.png
  2. ส่งออกตามความกว้างที่ระบุ (คงอัตราส่วนไว้): inscape in.svg -w 800 -e output.png
  3. ส่งออกที่ความสูงที่ระบุ (คงอัตราส่วนไว้): inscape in.svg -h 600 -e output.png

โปรดทราบว่าการระบุทั้งความกว้างและความสูงนั้นไม่ได้รักษาอัตราส่วนไว้

ในการแปลงไฟล์หลายไฟล์พร้อมกันให้ปรับดังต่อไปนี้เป็นกรณีการใช้งานของคุณ (ในbashหรือเข้ากันได้):

for f in *.svg; do
  inkscape $f -d 300 -e ${f%.*}.png
done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.