วิธีการแปลง SVG เป็น PNG ด้วย ImageMagick


388

ฉันมีไฟล์ SVG ที่มีขนาดที่กำหนดเป็น 16x16 เมื่อฉันใช้โปรแกรมแปลงของ ImageMagick เพื่อแปลงเป็น PNG ฉันจะได้ PNG ขนาด 16x16 พิกเซลซึ่งเล็กเกินไป:

convert test.svg test.png

ฉันต้องระบุขนาดพิกเซลของเอาต์พุต PNG -sizeดูเหมือนว่าจะถูกละเว้น-scaleพารามิเตอร์จะปรับขนาด PNG หลังจากแปลงเป็น PNG แล้ว ผลลัพธ์ที่ดีที่สุดจนถึงตอนนี้ฉันได้รับโดยใช้-densityพารามิเตอร์:

convert -density 1200 test.svg test.png

แต่ฉันไม่พอใจเพราะฉันต้องการระบุขนาดผลลัพธ์เป็นพิกเซลโดยไม่ใช้คณิตศาสตร์เพื่อคำนวณค่าความหนาแน่น ดังนั้นฉันต้องการทำสิ่งนี้:

convert -setTheOutputSizeOfThePng 1024x1024 test.svg test.png

ดังนั้นพารามิเตอร์เวทมนต์ที่ฉันต้องใช้ที่นี่คืออะไร?


6
เช่น-size 1024x1024ทำงานได้ดีเวอร์ชัน imagemagick ของคุณคืออะไร
Dejan Marjanovic


2
ImageMagick-6.9.0-Q16 แปลง - ปรับขนาด 1024x1024 foo.svg foo.png ทำงานได้ดี
Jichao

11
@Jaoao -resizeขยายภาพที่แปลงแล้วด้วยผลลัพธ์คุณภาพต่ำ
Elist

5
convert -size 1024x1024 test.svg test.pngทำงานได้ดีกับ ImageMagick 7.0.7-0 Q16 (เวอร์ชั่นปัจจุบันใน Chocolatey repo สำหรับ Windows) เพียงตรวจสอบให้แน่ใจว่า-sizeปรากฏก่อนชื่อไฟล์อินพุตรูปภาพขนาด 16x16 จะถูกลดขนาดเพื่อให้ได้ผลลัพธ์ที่ไม่ชัด
Futal

คำตอบ:


502

ฉันไม่สามารถรับผลลัพธ์ที่ดีจาก ImageMagick ในกรณีนี้ แต่ Inkscape ทำงานได้ดีบน Linux และ Windows:

inkscape -z -w 1024 -h 1024 input.svg -e output.png

แก้ไข (พฤษภาคม 2020): ผู้ใช้ Inkscape 1.0 โปรดทราบว่าอาร์กิวเมนต์บรรทัดคำสั่งเปลี่ยนไป:

inkscape -w 1024 -h 1024 input.svg --export-filename output.png

นี่คือผลลัพธ์ของการปรับขนาด 16x16 SVG เป็น 200x200 PNG โดยใช้คำสั่งนี้:

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

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

เพียงสำหรับการอ้างอิงรุ่น Inkscape ของฉัน (บน Ubuntu 12.04) คือ:

Inkscape 0.48.3.1 r9886 (Mar 29 2012)

และใน Windows 7 เป็น:

Inkscape 0.48.4 r9939 (Dec 17 2012)

15
+1 เท่าที่เกี่ยวกับ imagemagick ดูเหมือนว่าจะมีปัญหากับเครื่องยนต์ SVG ในกรณีส่วนใหญ่ฉันไม่สามารถรับผลลัพธ์ที่ถูกต้องได้ Inkscape, OTOH ทำงานได้อย่างสมบูรณ์แบบ
Glutanimate

13
ฉันคิดว่า Inkscape เป็นตัวอย่างที่น่าประทับใจที่สุดของ OSS หลังจาก Linux เอง ขอบคุณสำหรับทิป!
kim3er

8
ทำงานได้ดีบน OSX เช่นกัน
Jonas Granvik

12
บน OSX เมื่อติดตั้ง Inkscape สำหรับ X11 มันใช้งานได้สำหรับฉันโดยใช้:/Applications/Inkscape.app/Contents/Resources/bin/inkscape -z -e test.png -w 1024 -h 1024 test.svg
chmullig

11
@ Rördเพื่อให้พื้นหลังโปร่งใสด้วย ImageMagick ให้ใช้-background noneตัวเลือกบรรทัดคำสั่ง
John

142

ลองsvgexport :

svgexport input.svg output.png 64x
svgexport input.svg output.png 1024:1024

svgexport เป็นเครื่องมือบรรทัดคำสั่งข้ามแพลตฟอร์มง่ายๆที่ฉันทำเพื่อส่งออกไฟล์ svg ไปยัง jpg และ png ดูตัวเลือกเพิ่มเติมที่นี่ หากต้องการติดตั้ง svgexport ติดตั้ง npmจากนั้นเรียกใช้:

npm install svgexport -g

แก้ไข: หากคุณพบปัญหากับห้องสมุดโปรดส่งมาที่ GitHub ขอบคุณ!


4
svgexport ทำงานได้ดีสำหรับฉัน ผลลัพธ์ตรงกับเบราว์เซอร์ที่ให้ภาพมากกว่า ImageMagick
t9mike

5
คุณภาพ svgexport นั้นสูงมาก ตอนนี้มันกลายเป็นเครื่องมือโปรดของฉันแล้วขอบคุณ shakiba! :)
Alessio Periloso

1
มันใช้ได้ดีสำหรับฉันเช่นกัน ประหยัดเวลาจริงเมื่อเทียบกับการทำด้วยตนเองในเครื่องมือ GUI ค่อนข้างยากที่จะหาแอป GUI บน mac ในช่วงที่ราคาถูกกว่าอยู่แล้วว่าจับ SVG ดี
เอริค Engheim

4
ใช้งานได้ดี แต่สร้างภาพขนาดใหญ่ เมื่อใช้ optipng ฉันสามารถบีบอัดโลโก้ข้อความของฉันจาก 3 เมกะไบต์เป็น ~ 20kB
miek

2
evgexport สร้างไฟล์ PNG ขนาดใหญ่ขึ้นอยู่กับขนาด แนะนำ svg2png ซึ่งใช้ PhantomJS เพื่อการส่งออก แต่สร้างภาพที่เล็กกว่ามาก
Aaron_H

112

มันไม่สมบูรณ์แบบ แต่ทำงานได้ดี

convert -density 1200 -resize 200x200 source.svg target.png

โดยทั่วไปจะเพิ่ม DPI ที่สูงพอ (เพียงแค่ใช้การคาดเดาที่ปลอดภัย / การศึกษา) ว่าการปรับขนาดทำได้ด้วยคุณภาพที่เพียงพอ ฉันพยายามหาวิธีแก้ปัญหาที่เหมาะสม แต่หลังจากผ่านไประยะหนึ่งก็ตัดสินใจได้ว่ามันดีพอสำหรับความต้องการในปัจจุบันของฉัน

หมายเหตุ:ใช้ 200x200! เพื่อบังคับให้ใช้ความละเอียดที่กำหนด


4
ความทึบและเงาหายไปในกรณีของฉัน
jiyinyiyong

2
ฉันไม่มี svg ที่ซับซ้อนดังนั้นสิ่งนี้จึงได้ผลสำหรับฉัน -resize 200%ไม่ทำงานและฉันต้องระบุขนาดเป็นพิกเซล
jozxyqk

18
@jiyinyiyong เพื่อให้พื้นหลังโปร่งใสด้วย ImageMagick ให้ใช้-background noneตัวเลือกบรรทัดคำสั่ง เพื่อรักษาอัตราส่วนภาพคุณสามารถระบุมิติเดียวเช่น-resize 200ความกว้างหรือ-resize x200ความสูง โปรดดู: imagemagick.org/script/command-line-processing.php#geometryสำหรับตัวเลือกเรขาคณิต ImageMagick ที่ครบถ้วนสมบูรณ์
John

ไม่ได้ผลสำหรับฉันเช่นกัน ผลลัพธ์ที่ได้คือพร่ามัวทั้งหมด
mbonnin

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

55

หากคุณใช้ MacOS X และมีปัญหากับโปรแกรมแปลงของ Imagemagick คุณอาจลองติดตั้งใหม่ด้วย RSVG lib ใช้ HomeBrew:

brew remove imagemagick
brew install imagemagick --with-librsvg

ตรวจสอบว่าได้มอบหมายให้ถูกต้อง:

$ convert -version
Version: ImageMagick 6.8.9-8 Q16 x86_64 2014-12-17 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2014 ImageMagick Studio LLC
Features: DPC Modules
Delegates: bzlib cairo fontconfig freetype jng jpeg lcms ltdl lzma png rsvg tiff xml zlib

rsvgมันควรจะแสดง


ไม่ได้ผลสำหรับฉัน โดยเฉพาะฉันวิ่งconvert ic_comment_48px.svg -size 30x30 ic_comment_30px.pngและภาพออกเป็น 48 x 48 ตรวจสอบให้แน่ใจว่า imagemagick มอบหมายให้ rsvg ตามที่คุณอธิบาย
Shane Creighton-Young

1
ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน - ค่าเริ่มต้นconvertแปลง svg เป็น png แต่ผลลัพธ์ไม่สิ้นหวัง หลังจากติดตั้งใหม่พวกเขาสมบูรณ์แบบ นอกจากนี้การแปลงจะเร็วกว่ามาก
ssc

1
สิ่งนี้ใช้งานได้กับ Mac OSX ฉันไม่พบการแปลงใหม่ที่เร็วกว่านี้ แต่มีความแม่นยำมากขึ้น ฉันขอแนะนำให้ผู้ใช้ Mac OSX ทุกคนลองใช้ดู
HelloWorld

1
นี่ควรเป็นคำตอบที่ยอมรับได้ดี ขอบคุณทำงานเหมือนมีเสน่ห์และฉันไม่เคยรู้ที่จะทำตามขั้นตอนเหล่านี้เป็นอย่างอื่น
sdailey

8
เมื่อวันที่ฉันได้รับinvalid option: --with-librsvg
zaitsman

39

Inkscape ดูเหมือนจะไม่ทำงานเมื่อ svg units ไม่ได้px(เช่น cm) ฉันได้ภาพที่ว่างเปล่า อาจจะสามารถแก้ไขได้ด้วยการทวีคูณ dpi แต่มันลำบากเกินไป

Svgexport เป็นโปรแกรม node.js ดังนั้นจึงไม่มีประโยชน์โดยทั่วไป

โปรแกรมแปลงของ Imagemagick ใช้ได้กับ:

 ~$ convert -background none -size 1024x1024 infile.svg outfile.png

หากคุณใช้-resizeรูปภาพจะเลือนและไฟล์มีขนาดใหญ่กว่ามาก

ที่ดีที่สุด

~$ rsvg  -w 1024 -h 1024 infile.svg  outfile.png

มันเร็วที่สุดมีการพึ่งพาน้อยที่สุดและเอาต์พุตจะเล็กกว่าแปลงประมาณ 30% ติดตั้ง librsvg2-bin เพื่อรับ ดูเหมือนจะไม่มีหน้าคน แต่คุณสามารถพิมพ์:

~$ rsvg --help

เพื่อรับความช่วยเหลือ เรียบง่ายเป็นสิ่งที่ดี


2
นี่เป็นคำตอบที่ดีที่สุดได้อย่างง่ายดาย (ฉันไม่ทราบว่าทำไมคำตอบที่ต่างกันยี่สิบข้อจึงให้การตอบสนองด้วยจินตนาการเดียวกัน) มันเก็บรักษาสีและเงาและไม่ทำลายสิ่งใด อย่างไรก็ตามเพื่อให้ตรงกับพฤติกรรมการปรับขนาด imagemagick (โดยเฉพาะ WxH หมายถึงภาพขนาดให้พอดีกับกล่องที่มีขนาดนั้นการรักษาอัตราส่วนภาพ) -aควรใช้พารามิเตอร์กับ rsvg
Mahmoud Al-Qudsi

1
สิ่งนี้ทำให้ภาพของฉันยุ่งเหยิงสิ่งประดิษฐ์แปลก ๆ ทุกประเภท inkscape ทำงานได้ดีขึ้น
ลูกเต๋าที่สง่างาม

1
ได้รับการเตือนbrew install rsvgเมื่อ OSX ติดตั้งสิ่งต่าง ๆ นับล้าน - GDK, OpenSSL, Python และอื่น ๆ
Timmmm

4
FYI ในปัจจุบันติดตั้งคำสั่งและคำสั่งการแปลงbrew install librsvg rsvg-convert
waldyrious

ฉันพบ librsvg (หรือrsvg-convertในกรณี Arch) เพื่อให้ผลลัพธ์ที่ดีที่สุดและสอดคล้องกันมากที่สุดเมื่อแปลง svgs ที่ซับซ้อนเป็น png ติดตามด้วยoptipngเพื่อลดขนาดไฟล์ที่ส่งออก
maktel

18

หลังจากทำตามขั้นตอนในคำตอบของ Jose Albanฉันก็สามารถทำให้ ImageMagick ทำงานได้ดีโดยใช้คำสั่งต่อไปนี้:

convert -density 1536 -background none -resize 100x100 input.svg output-100.png

หมายเลข 1536 มาจากการประเมินความหนาแน่นของ ballpark ดูคำตอบนี้สำหรับข้อมูลเพิ่มเติม


15

เพื่อที่จะ rescale ภาพ-densityควรใช้ตัวเลือก เท่าที่ฉันรู้ว่าความหนาแน่นมาตรฐานคือ 72 และแมปขนาด 1: 1 หากคุณต้องการให้เอาต์พุต png มีขนาดใหญ่เป็นสองเท่าของ svg ดั้งเดิมให้ตั้งค่าความหนาแน่นเป็น 72 * 2 = 144:

convert -density 144 source.svg target.png

โปรดทราบว่าตัวเลือกการแปลงต้องอยู่ก่อนไฟล์อินพุต เช่นconvert source.svg -density 144 target.pngจะไม่ขายภาพให้
Skippy le Grand Gourou

ที่จริงความหนาแน่นมาตรฐานดูเหมือนจะเป็น 90 ดังนั้นมันจะเป็นconvert -density 180 source.svg target.png
adius

7

ทำไมคุณไม่ลองบรรทัดคำสั่ง inkscape นี่คือไฟล์ bat ของฉันเพื่อแปลง svg ทั้งหมดใน dir นี้เป็น png:

สำหรับ %% x IN (* .svg) DO C: \ Ink \ App \ Inkscape \ inkscape.exe %% x -z --export-dpi = 500 --export-area-drawing --export-png = "% % ~ nx.png"


4

ฉันมาที่โพสต์นี้ - แต่ฉันแค่อยากจะทำการแปลงเป็นชุดและรวดเร็วโดยไม่ต้องใช้พารามิเตอร์ใด ๆ (เนื่องจากมีหลายไฟล์ที่มีขนาดแตกต่างกัน)

rsvg drawing.svg drawing.png

สำหรับฉันความต้องการอาจจะง่ายกว่าสำหรับผู้เขียนต้นฉบับเล็กน้อย (ต้องการใช้ SVG ใน MS PowerPoint แต่ไม่อนุญาต)


1
สำหรับการอ้างอิงใน MacOS นี้มีการติดตั้งและคำสั่งการแปลงbrew install librsvg rsvg-convert
วาลดีริอุส

ใน Ubutni มันเป็น rsvg- แปลงด้วย, แพ็คเกจคือ librsvg2-bin และเอาต์พุตต้องการ -o drawing.png
teknopaul

4

ใน ImageMagick ผู้ใช้จะได้รับการเรนเดอร์ SVG ที่ดีกว่าหากใช้ Inkscape หรือ RSVG กับ ImageMagick กว่าการเรนเดอร์ MSVG / XML ภายในของมันเอง RSVG เป็นผู้รับมอบสิทธิ์ที่จะต้องติดตั้ง ImageMagick หากติดตั้ง Inkscape บนระบบ ImageMagick จะใช้งานมันโดยอัตโนมัติ ฉันใช้ Inkscape ใน ImageMagick ด้านล่าง

ไม่มีพารามิเตอร์ "วิเศษ" ที่จะทำสิ่งที่คุณต้องการ

แต่สามารถคำนวณความหนาแน่นที่ต้องการเพื่อแสดงผลได้อย่างง่ายดาย

นี่คือปุ่มขนาดเล็ก 50x50 เมื่อแสดงผลที่ความหนาแน่นเริ่มต้นที่ 96:

convert button.svg button1.png


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

สมมติว่าเราต้องการให้เอาต์พุตเป็น 500 อินพุตเป็น 50 ที่ความหนาแน่นเริ่มต้นที่ 96 (Inkscape เวอร์ชันเก่าอาจใช้ 92) ดังนั้นคุณสามารถคำนวณความหนาแน่นที่ต้องการตามสัดส่วนของขนาดและความหนาแน่น

512/50 = X/96
X = 96*512/50 = 983


convert -density 983 button.svg button2.png


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

ใน ImageMagick 7 คุณสามารถทำการคำนวณในบรรทัดดังนี้:

magick -density "%[fx:96*512/50]" button.svg button3.png

or

in_size=50
in_density=96
out_size=512

magick -density "%[fx:$in_density*$out_size/$in_size]" button.svg button3.png

สมการใน magick DSL นั้นมีประโยชน์มาก!
cyrf

2

สิ่งหนึ่งที่ฉันเพียงเล็กน้อยคือการตั้งค่า-densityหลังจากชื่อไฟล์อินพุต นั่นไม่ได้ผล การย้ายไปที่ตัวเลือกแรกในการแปลง (ก่อนอื่น) ทำให้มันทำงานได้ (สำหรับฉัน, YMMV, ฯลฯ )


2

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

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]

ล้มเหลวสำหรับฉันบน Windows 10: นำเข้า cairocffi เป็นไฟล์ไคโร "c: \ program files (x86) \ python35-32 \ lib \ site-packages \ cairocffi_ init_ .py ", บรรทัด 39, ใน <module> cairo = dlopen (ffi , 'cairo', 'cairo-2', 'cairo-gobject-2', 'cairo.so.2') ไฟล์ "c: \ program files (x86) \ python35-32 \ lib \ site-packages \ cairocffi_ init_ .py ", บรรทัด 36, ใน dlopen ยก OSError (" dlopen () ล้มเหลวในการโหลดไลบรารี:% s "% '/' .join (ชื่อ)) OSError: dlopen () ล้มเหลวในการโหลดห้องสมุด: cairo / cairo- 2 / cairo-gobject-2 / cairo.so.2
Pete Lomax

นิสัยดีcairosvgบน Ubuntu-19.04 ทำงานให้ฉันได้
fhgd

2

หากไม่มี librsvg คุณอาจได้รับภาพ png / jpeg สีดำ เรามีการติดตั้งlibrsvgไปยังconvertไฟล์ SVG กับ ImageMagick

อูบุนตู

 sudo apt-get install imagemagick librsvg
 convert -density 1200 test.svg test.png

MacOS

 brew install imagemagick librsvg
 convert -density 1200 test.svg test.png

ฉันไม่ได้ติดตั้งไลบรารีนี้และฉันก็ไม่ได้รับภาพสีดำเหมือนกัน
Aaron Franke

1

ฉันได้แก้ไขปัญหานี้ผ่านการเปลี่ยนwidthและheightคุณลักษณะของ<svg>แท็กให้ตรงกับขนาดผลงานที่ฉันต้องการแล้วแปลงเป็น ImageMagick ทำงานเหมือนจับใจ

นี่คือรหัส Python ของฉันฟังก์ชั่นที่จะคืนเนื้อหาของไฟล์ JPG:

import gzip, re, os
from ynlib.files import ReadFromFile, WriteToFile
from ynlib.system import Execute
from xml.dom.minidom import parse, parseString


def SVGToJPGInMemory(svgPath, newWidth, backgroundColor):

    tempPath = os.path.join(self.rootFolder, 'data')
    fileNameRoot = 'temp_' + str(image.getID())

    if svgPath.lower().endswith('svgz'):
        svg = gzip.open(svgPath, 'rb').read()
    else:
        svg = ReadFromFile(svgPath)

    xmldoc = parseString(svg)

    width = float(xmldoc.getElementsByTagName("svg")[0].attributes['width'].value.split('px')[0])
    height = float(xmldoc.getElementsByTagName("svg")[0].attributes['height'].value.split('px')[0])

    newHeight = int(newWidth / width * height) 

    xmldoc.getElementsByTagName("svg")[0].attributes['width'].value = '%spx' % newWidth
    xmldoc.getElementsByTagName("svg")[0].attributes['height'].value = '%spx' % newHeight

    WriteToFile(os.path.join(tempPath, fileNameRoot + '.svg'), xmldoc.toxml())
    Execute('convert -background "%s" %s %s' % (backgroundColor, os.path.join(tempPath, fileNameRoot + '.svg'), os.path.join(tempPath, fileNameRoot + '.jpg')))

    jpg = open(os.path.join(tempPath, fileNameRoot + '.jpg'), 'rb').read()

    os.remove(os.path.join(tempPath, fileNameRoot + '.jpg'))
    os.remove(os.path.join(tempPath, fileNameRoot + '.svg'))

    return jpg

2
ทำไมคุณถึงส่งคืนคอมพิวเตอร์ที่สร้างอิมเมจเป็น jpeg :(?
Willi Mentzel

1

คำตอบยอดนิยมโดย @ 808sound ไม่ได้ผลสำหรับฉัน ฉันต้องการที่จะปรับขนาด Kenney.nl UI Pack

และได้รับ Kenney UI Pack messed up

ดังนั้นแทนที่จะผมเปิดขึ้น Inkscape แล้วไปFile,Export as PNG fileและกล่องแบบ GUI โผล่ขึ้นมาที่อนุญาตให้ฉันเพื่อกำหนดขนาดที่แน่นอนที่ฉันต้องการ

รุ่นที่Ubuntu 16.04 Linux: Inkscape 0.91 (September 2016)

(ภาพนี้มาจากชุดสินทรัพย์ของ Kenney.nl )


1

บน macOS โดยใช้การต้มใช้ librsvg ทำงานได้ดี

brew install librsvg
rsvg-convert test.svg -o test.png

มีตัวเลือกมากมายให้เลือกผ่าน rsvg-convert --help


0

บน Linux ที่มี Inkscape 1.0 เพื่อทำการแปลงจาก svg เป็น png จำเป็นต้องใช้

inkscape -w 1024 -h 1024 input.svg --export-file output.png

ไม่

inkscape -w 1024 -h 1024 input.svg --export-filename output.png
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.