ImageGagick के साथ एक SVG को एक PNG में कैसे बदलें?


388

मेरे पास एक एसवीजी फाइल है जिसका परिभाषित आकार 16x16 है। जब मैं ImageMagick के कन्वर्ट प्रोग्राम का उपयोग इसे PNG में बदलने के लिए करता हूं, तो मुझे एक 16x16 पिक्सेल PNG मिलता है जो कि बहुत छोटा होता है:

convert test.svg test.png

मुझे आउटपुट पीएनजी के पिक्सेल आकार को निर्दिष्ट करने की आवश्यकता है। -sizeपैरामीटर को नजरअंदाज किया जाता है, -scaleपैरामीटर को PNG में बदलने के बाद PNG को मापता है । -densityपैरामीटर का उपयोग करके मुझे अब तक का सबसे अच्छा परिणाम :

convert -density 1200 test.svg test.png

लेकिन मैं संतुष्ट नहीं हूं, क्योंकि मैं घनत्व मूल्य की गणना करने के लिए गणित किए बिना पिक्सल में आउटपुट आकार निर्दिष्ट करना चाहता हूं। इसलिए मैं कुछ ऐसा करना चाहता हूं:

convert -setTheOutputSizeOfThePng 1024x1024 test.svg test.png

तो क्या मैजिक पैरामीटर है जिसका मुझे यहां उपयोग करना है?


6
उदा -size 1024x1024ठीक काम कर रहा है, आपका छवि संस्करण क्या है?
देजान मरजानोविक


2
ImageMagick-6.9.0-प्रश्न 16। Convert -resize 1024x1024 foo.svg foo.png ठीक काम करता है।
जिचाओ

11
@ जिचाओ -resizeसिर्फ खराब गुणवत्ता के परिणामों के साथ, परिवर्तित छवि को फैलाता है।
Elist

5
convert -size 1024x1024 test.svg test.pngImageMagick 7.0.7-0 Q16 के साथ ठीक काम करता है (विंडोज के लिए चॉकलेट रेपो में वर्तमान संस्करण)। बस यह सुनिश्चित करें कि -sizeइनपुट फ़ाइल नाम से पहले दिखाई देता है, अन्यथा एक 16x16 चित्र एक धुंधला परिणाम देने के लिए उत्साहित होगा।
Futal

जवाबों:


502

मैं इस उदाहरण में ImageMagick से अच्छे परिणाम प्राप्त नहीं कर सका, लेकिन Inkscape लिनक्स और विंडोज पर इसका अच्छा काम करता है:

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 पर स्केल करने का परिणाम है:

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

बस संदर्भ के लिए, मेरा इंकस्केप संस्करण (Ubuntu 12.04 पर) है:

Inkscape 0.48.3.1 r9886 (Mar 29 2012)

और विंडोज 7 पर, यह है:

Inkscape 0.48.4 r9939 (Dec 17 2012)

15
+1 जहां तक ​​इमेजमाजिक का संबंध है। एसवीजी इंजन के साथ समस्या प्रतीत होती है। ज्यादातर मामलों में मैं इसके साथ सटीक परिणाम प्राप्त करने में सक्षम नहीं था। इंकस्केप, ओटीओएच, पूरी तरह से ठीक काम करता है।
Glutanimate

13
मुझे लगता है कि Inkscape लिनक्स के बाद OSS का एकमात्र सबसे प्रभावशाली उदाहरण है। पारितोषिक के लिए धन्यवाद!
kim3er

8
OSX पर भी अच्छी तरह से काम करता है।
जोनास ग्रैनविक

12
OSX पर, X11 के लिए /Applications/Inkscape.app/Contents/Resources/bin/inkscape -z -e test.png -w 1024 -h 1024 test.svg
इंक्सस्केप

11
@ रोदर इमेजमैगिक के साथ पृष्ठभूमि को पारदर्शी रखने के लिए, -background noneकमांड लाइन विकल्प का उपयोग करें ।
जॉन

142

आज़माएँ svgexport :

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

svgexport एक साधारण क्रॉस-प्लेटफ़ॉर्म कमांड लाइन टूल है, जिसे मैंने svg फ़ाइलों को jpg और png में एक्सपोर्ट करने के लिए बनाया है, अधिक विकल्पों के लिए यहाँ देखें । स्थापित करने के लिए svgexport एनपीएम स्थापित करें , फिर चलाएं:

npm install svgexport -g

संपादित करें: यदि आपको लाइब्रेरी के साथ कोई समस्या मिलती है, तो कृपया इसे GitHub पर सबमिट करें , धन्यवाद!


4
मेरे लिए svgexport ने बहुत काम किया। ImageMagick की तुलना में आउटपुट मैच ब्राउज़र को अधिक बारीकी से प्रस्तुत करता है।
t9mike 1

5
svgexport गुणवत्ता वास्तव में उच्च है। अब यह मेरा पसंदीदा उपकरण बन गया है, धन्यवाद शकीबा! :)
एलेसियो पेरिलोसो

1
इसने मेरे लिए भी अच्छा काम किया। GUI टूल में मैन्युअल रूप से करने की तुलना में वास्तविक समय सेवर। काफी मुश्किल रेंज में मैक पर GUI ऐप ढूंढना काफी मुश्किल है जो वैसे भी SVG को अच्छी तरह से हैंडल करता है
Erik Engheim

4
महान काम करता है, लेकिन एक बड़ी छवि बनाता है। ऑप्टिपंग का उपयोग करके, मैं अपने टेक्स्ट लोगो को 3 मेगाबाइट से ~ 20kB तक कम करने में सक्षम था।
miek

2
evgexport आकार के आधार पर बड़ी png फाइलें बनाता है। सिफारिश svg2png जो भी निर्यात के लिए PhantomJS का उपयोग करता है, लेकिन बहुत छोटे चित्र बनाता है।
आरोन_एच।

112

यह सही नहीं है, लेकिन यह काम करता है।

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

मूल रूप से यह डीपीआई को पर्याप्त रूप से बढ़ाता है (बस एक शिक्षित / सुरक्षित अनुमान का उपयोग करें) जो पर्याप्त गुणवत्ता के साथ आकार बदलता है। मैं इसके लिए एक उचित समाधान खोजने की कोशिश कर रहा था, लेकिन थोड़ी देर बाद तय किया कि यह मेरी वर्तमान ज़रूरत के लिए पर्याप्त है।

नोट: 200x200 का उपयोग करें! दिए गए संकल्प को बल देने के लिए


4
अपारदर्शिता और छाया मेरे मामले में खो गई।
जियान्य्योंग

2
मेरे पास जटिल svg नहीं है इसलिए यह मेरे लिए काम करता है। -resize 200%काम नहीं किया और मुझे पिक्सेल में आकार निर्दिष्ट करना पड़ा।
jozxyqk

18
@jiyinyiyong ImageMagick के साथ पृष्ठभूमि को पारदर्शी रखने के लिए, -background noneकमांड लाइन विकल्प का उपयोग करें । छवि अनुपात रखने के लिए, आप -resize 200चौड़ाई या -resize x200ऊँचाई के लिए केवल एक आयाम निर्दिष्ट कर सकते हैं । देखें: ImageMagick ज्यामिति विकल्पों के लिए imagemagick.org/script/command-line-processing.php#geometry
जॉन

मेरे लिए भी काम नहीं करता है। नतीजा सब धुंधला है।
मॉबनीन

(यह linux पर लागू होता है, विंडोज़ पर लागू हो सकता है) यदि आप IM पर -verbose करते हैं तो ऐसा प्रतीत होता है कि IM स्वयं एक मध्यवर्ती ईपीएस फ़ाइल बनाने के लिए inkscape का उपयोग करता है। इसलिए मैं @ 808sound
-

55

यदि आप MacOS X पर हैं और Imagemagick के कन्वर्ट होने में समस्या आ रही है, तो आप इसे RSVG के साथ पुनः स्थापित करने का प्रयास कर सकते हैं। 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 है। सुनिश्चित करें कि इमेजमैगिक rsvg को डेलिगेट कर रहा है जैसा आपने समझाया है।
शेन क्रेइटन-यंग

1
मेरे लिए पूरी तरह से काम किया - डिफ़ॉल्ट convertने svg को png में बदल दिया, लेकिन परिणाम निराशाजनक थे; पुनः स्थापित करने के बाद, वे सही हैं। इसके अलावा, रूपांतरण काफी तेज है।
एसएससी

1
इसने मुझे मैक ओएसएक्स पर काम किया। मुझे नया रूपांतरण तेज़ी से नहीं मिल रहा है, लेकिन बहुत अधिक सटीक है। मैं अत्यधिक सभी मैक OSX उपयोगकर्ताओं को यह एक कोशिश देने की सलाह देता हूं।
हैलोवर्ल्ड

1
यह स्वीकृत उत्तर होना चाहिए, ओह अच्छी तरह से। धन्यवाद, एक आकर्षण की तरह काम किया, और मुझे कभी भी इन कदमों को लेने के लिए नहीं जाना जाता था
sdailey

8
Mojave पर मुझे मिलता हैinvalid option: --with-librsvg
zaitsman

39

जब Ingcape काम करने के लिए प्रतीत नहीं होता है जब svg इकाइयाँ नहीं होती हैं px (जैसे cm)। मुझे एक कोरी छवि मिली। हो सकता है, यह डीपीआई को घुमाकर तय किया जा सकता था, लेकिन यह बहुत परेशानी थी।

Svgexport एक नोड.जेएस प्रोग्राम है और इसलिए आमतौर पर उपयोगी नहीं है।

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
यह आसानी से सबसे अच्छा जवाब है (मुझे नहीं पता कि बीस अलग-अलग उत्तर एक ही इमेजमैजिक रिस्पॉन्स क्यों देते हैं); यह रंग और छाया को संरक्षित करता है और कुछ भी नहीं करता है। हालाँकि, इमेजमैगिक आकार के व्यवहार से मेल खाने के लिए (विशेष रूप से, WxH का मतलब है स्केल इमेज को उस आकार के बॉक्स में फिट करना, पहलू अनुपात को संरक्षित -aकरना ), पैरामीटर का उपयोग rsvg के साथ किया जाना चाहिए।
महमूद अल-कुद्सी

1
इसने मेरी छवियों, सभी प्रकार की अजीब कलाकृतियों को उकेरा। एक बेहतर काम किया।
सुंदर पासा

1
चेतावनी दी जाए, brew install rsvgOSX पर एक लाख चीजें स्थापित की गई हैं - GDK, OpenSSL, पायथन, आदि
Timmmm

4
FYI करें, वर्तमान इंस्टॉल कमांड है brew install librsvgऔर रूपांतरण कमांड है rsvg-convert
वाल्ड्रियस

मैंने rsvg-convertजटिल svgs को png में परिवर्तित करते समय सबसे अच्छा और सबसे सुसंगत परिणाम देने के लिए librsvg (या Arch के मामले में) पाया । optipngआउटपुट फ़ाइल आकार को कम करने के साथ पालन करें ।
maktel

18

जोस अल्बान के जवाब में दिए गए चरणों का पालन करने के बाद , मैं निम्नलिखित कमांड का उपयोग करके ImageMagick को ठीक काम करने में सक्षम था:

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

1536 नंबर घनत्व के बॉलपार्क अनुमान से आता है, अधिक जानकारी के लिए इस उत्तर को देखें।


15

छवि को पुनर्विक्रय करने के लिए, विकल्प -densityका उपयोग किया जाना चाहिए। जहाँ तक मुझे पता है कि मानक घनत्व 72 है और आकार 1: 1 है। यदि आप चाहते हैं कि आउटपुट png मूल svg से दुगना हो, तो घनत्व 72 * 2 = 144 पर सेट करें:

convert -density 144 source.svg target.png

ध्यान दें कि विकल्पों को परिवर्तित करना इनपुट फ़ाइल से पहले होना चाहिए । Ie convert source.svg -density 144 target.pngछवि को पुनर्विक्रय नहीं करेगा।
स्किप्पी ले ग्रांड गौरौ जूल

वास्तव में मानक घनत्व 90 प्रतीत होता है। इसलिए यह होगाconvert -density 180 source.svg target.png
adius

7

आप कमांड लाइन की कोशिश करने की कोशिश क्यों नहीं करते, यह इस dir में png में सभी svg को बदलने के लिए मेरी बैट फाइल है:

%% 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

मेरे लिए मूल लेखक की अपेक्षा आवश्यकताएं थोड़ी आसान थीं। (MS PowerPoint में SVGs का उपयोग करना चाहते हैं, लेकिन यह अनुमति नहीं देता है)


1
संदर्भ के लिए, macOS पर यह brew install librsvgरूपांतरण कमांड के साथ स्थापित किया गया है rsvg-convert
10

Ubutni में यह rsvg-Convert है, पैकेज librsvg2-bin है और आउटपुट की जरूरत है -o
ड्राइंग.पिंग

4

ImageMagick में, किसी को बेहतर SVG रेंडरिंग मिलती है अगर कोई अपने खुद के आंतरिक MSVG / XML रेंडर की तुलना में ImageMagick के साथ Inkscape या RSVG का उपयोग करता है। RSVG एक प्रतिनिधि है जिसे ImageMagick के साथ स्थापित करने की आवश्यकता है। यदि Inkscape सिस्टम में स्थापित है, तो ImageMagick इसका उपयोग स्वतः करेगा। मैं नीचे ImageMagick में इंकस्केप का उपयोग करता हूं।

कोई "जादू" पैरामीटर नहीं है जो वह करेगा जो आप चाहते हैं।

लेकिन, आउटपुट को रेंडर करने के लिए आवश्यक सटीक घनत्व की गणना बहुत आसानी से की जा सकती है।

96 के डिफ़ॉल्ट घनत्व पर प्रदान किए जाने पर यहां एक छोटा 50x50 बटन है:

convert button.svg button1.png


यहां छवि विवरण दर्ज करें

मान लें कि हम आउटपुट 500 चाहते हैं। इनपुट 96 की डिफ़ॉल्ट घनत्व पर 50 है (इंकस्केप के पुराने संस्करण 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लगी थी, इनपुट फ़ाइल नाम के बाद। यह काम नहीं किया। इसे परिवर्तित करने के पहले विकल्प में ले जाने (कुछ और करने से पहले) ने इसे काम किया (मेरे लिए, वाईएमएमवी, आदि)।


2

PNG रूपांतरण में सरल SVG के लिए मैंने cairosvg ( https://cairosvg.org/ ) पाया जो ImageMick की तुलना में बेहतर प्रदर्शन करता है। आपकी निर्देशिका में सभी एसवीजी फाइलों को स्थापित करने और चलाने के लिए चरण।

pip3 install cairosvg

निर्देशिका में एक अजगर खोल खोलें जिसमें आपकी .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]

मेरे लिए विंडोज़ 10 पर क्रैश हो गया: कैरोकोफी को काइरो फ़ाइल के रूप में आयात करें "c: \ program files (x86) \ python35-32 \ lib \ site-package \ cairocffi_ init_ .py", लाइन 39, में <मॉड्यूल> cairo = dlopen (ffi)। , 'cairo', 'cairo-2', 'cairo-gobject-2', 'cairo.so.2') फ़ाइल "c: \ program files (x86) \ python35-32" lib \ site-package \ cairocffi_ init_ .py ", लाइन 36, dlopen में OSError बढ़ाएँ (" dlopen () एक पुस्तकालय लोड करने में विफल:% s "% '/' .join (नाम)) OSError: dlopen () एक पुस्तकालय लोड करने में विफल रहा है: cairo / cairo-। 2 / कैरो-गॉबजेक्ट -2 / कैरो.सो .2
पीट लोमैक्स

अच्छा, cairosvgउबंटू -19.04 पर मेरे लिए काम किया।
fhgd

2

Librsvg के बिना, आपको एक काली png / jpeg छवि मिल सकती है। हमें इमेजमागिक के साथ svg फाइल में इंस्टॉल librsvgकरना convertहोगा।

उबंटू

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

मैक ओ एस

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

मेरे पास यह लाइब्रेरी स्थापित नहीं है और मुझे काली छवियां भी नहीं मिली हैं।
आरोन फ्रेंके

1

मैंने अपने इच्छित आउटपुट आकार से मिलान करने और फिर ImageMagick का उपयोग करके इसे परिवर्तित करने के लिए टैग की विशेषताओं को बदलकर widthऔर इस समस्या को हल किया है । एक जादू की तरह काम करता है।height<svg>

यहाँ मेरा पायथन कोड है, जो 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 के रूप में कंप्यूटर जनित छवि क्यों लौटाएंगे :(?
विली मेंजेल

1

@ 808sound द्वारा शीर्ष उत्तर ने मेरे लिए काम नहीं किया। मैं आकार बदलना चाहता था केनी.एनएल यूआई पैक

और मिला केनी यूआई पैक गड़बड़

इसलिए इसके बजाय मैंने Inkscape खोला, फिर चला गया File, Export as PNG fileऔर एक GUI बॉक्स पॉप अप हुआ जिसने मुझे सटीक आयाम सेट करने की अनुमति दी जिसकी मुझे ज़रूरत थी।

पर संस्करण Ubuntu 16.04 Linux: Inkscape 0.91 (September 2016)

(यह छवि जिस तरह से केनी.एनएल के एसेट पैक्स की है)


1

काढ़ा का उपयोग कर macOS पर, सीधे librsvg का उपयोग करना अच्छी तरह से काम करता है

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

के माध्यम से कई विकल्प उपलब्ध हैं rsvg-convert --help


0

Inkscape 1.0 के साथ Linux पर svg से png में कनवर्ट करने के लिए उपयोग करने की आवश्यकता है

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

नहीं

inkscape -w 1024 -h 1024 input.svg --export-filename output.png
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.