ImageGagick ile SVG'yi PNG'ye nasıl dönüştürebilirim?


388

Tanımlı boyutu 16x16 olan bir SVG dosyası var. Bir PNG'ye dönüştürmek için ImageMagick'in dönüştürme programını kullandığımda, çok küçük bir 16x16 piksel PNG alıyorum:

convert test.svg test.png

Ben PNG çıkış piksel boyutunu belirtmek gerekir. -sizeparametresi yok sayılıyor gibi görünüyor, -scaleparametre PNG'yi PNG'ye dönüştürüldükten sonra ölçeklendirir . Şimdiye kadar en iyi sonuç -densityparametresini kullanarak aldım :

convert -density 1200 test.svg test.png

Ama memnun değilim, çünkü yoğunluk değerini hesaplamak için matematik yapmadan çıktı boyutunu piksel cinsinden belirtmek istiyorum. Yani böyle bir şey yapmak istiyorum:

convert -setTheOutputSizeOfThePng 1024x1024 test.svg test.png

Peki burada kullanmam gereken sihirli parametre nedir?


6
örneğin -size 1024x1024iyi çalışıyor, imagemagick sürümünüz nedir?
Dejan Marjanovic


2
ImageMagick-6.9.0-S16. -resize 1024x1024 dönüştürmek foo.svg foo.png iyi çalışıyor.
Jichao

11
@Jichao -resize, dönüştürülen görüntüyü düşük kaliteli sonuçlarla uzatır.
Elist

5
convert -size 1024x1024 test.svg test.pngImageMagick 7.0.7-0 Q16 (Windows için Chocolatey deposunda geçerli sürüm) ile iyi çalışır. -sizeGiriş dosya adından önce göründüğünden emin olun , aksi takdirde bulanık bir sonuç vermek için 16x16 boyutunda bir resim ölçeklendirilir.
Futal

Yanıtlar:


502

Bu örnekte ImageMagick'ten iyi sonuçlar elde edemedim, ancak Inkscape Linux ve Windows'da güzel bir iş çıkarıyor:

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

Düzenleme (Mayıs 2020): Inkscape 1.0 kullanıcıları, lütfen komut satırı argümanlarının değiştiğine dikkat edin:

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

Bu komutu kullanarak 16x16 SVG'yi 200x200 PNG'ye ölçeklemenin sonucu şudur:

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Sadece referans olarak, Inkscape versiyonum (Ubuntu 12.04'te):

Inkscape 0.48.3.1 r9886 (Mar 29 2012)

ve Windows 7'de:

Inkscape 0.48.4 r9939 (Dec 17 2012)

15
İmagemagick ile ilgili olarak +1. SVG motorunda bir sorun var gibi görünüyor. Çoğu durumda bununla doğru sonuçlar elde edemedim. Inkscape, OTOH, mükemmel çalışıyor.
Mart'ta Glutanimate

13
Bence Inkscape, Linux'un kendisinden sonra OSS'nin en etkileyici örneği. Bahşiş için teşekkürler!
kim3er

8
OSX'te de güzel çalışıyor.
Jonas Granvik

12
OSX'te, X11 için Inkscape yüklü olduğunda, benim için çalıştı:/Applications/Inkscape.app/Contents/Resources/bin/inkscape -z -e test.png -w 1024 -h 1024 test.svg
chmullig

11
@ Rörd ImageMagick ile arka planı saydam tutmak için -background nonekomut satırı seçeneğini kullanın.
John

142

Svgexport'u deneyin :

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

svgexport, svg dosyalarını jpg ve png'ye aktarmak için yaptığım basit bir çapraz platform komut satırı aracıdır, daha fazla seçenek için buraya bakın . Svgexport install npm'yi kurmak için şunu çalıştırın:

npm install svgexport -g

Düzenleme: Kütüphaneyle ilgili bir sorun bulursanız, lütfen GitHub'a gönderin , teşekkürler!


4
svgexport benim için harika çalıştı. Çıktı, tarayıcı oluşturmayı ImageMagick'ten çok daha yakından eşleştirir.
t9mike

5
svgexport kalitesi gerçekten çok yüksek. Şimdi benim en sevdiğim araç oldu, teşekkürler shakiba! :)
Alessio Periloso

1
bu benim için de işe yaradı. Bir GUI aracında elle yapmaya kıyasla gerçek zaman tasarrufu.
SVG'yi

4
Harika çalışıyor, ancak büyük bir görüntü üretiyor. Optipng kullanarak, metin logomu 3 megabayttan ~ 20kB'ye kadar sıkıştırabildim.
miek

2
evgexport, büyüklüğüne bağlı olarak BÜYÜK png dosyaları oluşturur. Dışa aktarma için PhantomJS'yi kullanan ancak daha küçük görüntüler oluşturan svg2png'yi önerin.
Aaron_H

112

Bu mükemmel değil ama işi yapıyor.

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

Temel olarak, yeniden boyutlandırmanın yeterli kalitede yapıldığı DPI'yı yeterince arttırır (sadece eğitimli / güvenli bir tahmin kullanın). Buna uygun bir çözüm bulmaya çalışıyordum ama bir süre sonra bunun mevcut ihtiyacım için yeterince iyi olduğuna karar verdim.

Not: 200x200 kullanın! verilen kararı zorlamak


4
Opaklık ve gölgeler benim durumumda kayboldu.
jiyinyiyong

2
Karmaşık svg'm yok bu yüzden bu benim için çalıştı. -resize 200%işe yaramadı ve piksel cinsinden boyut belirtmek zorunda kaldım.
jozxyqk

18
@jiyinyiyong ImageMagick ile arka planı saydam tutmak için -background nonekomut satırı seçeneğini kullanın. Görüntü oranını korumak -resize 200için, genişlik veya -resize x200yükseklik gibi yalnızca bir boyut belirtebilirsiniz . Kapsamlı ImageMagick geometri seçenekleri için bkz. İmagemagick.org/script/command-line-processing.php# geometry .
John

benim için de çalışmıyor. Sonuç tamamen bulanık.
mbonnin

(bu linux için geçerlidir, pencereler için geçerli olabilir) IM'de -verbose'u açarsanız, IM'nin bir ara eps dosyası oluşturmak için inkscape kullandığı görülür. bu nedenle doğrudan @ 808sound
-bradley

55

MacOS X üzerindeyseniz ve Imagemagick's convert ile ilgili sorun yaşıyorsanız, RSVG lib ile yeniden yüklemeyi deneyebilirsiniz. HomeBrew kullanma:

brew remove imagemagick
brew install imagemagick --with-librsvg

Doğru şekilde yetkilendirildiğini doğrulayın:

$ 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

Görüntülenmelidir rsvg.


Benim için çalışmadı. Özellikle koştum convert ic_comment_48px.svg -size 30x30 ic_comment_30px.pngve çıktı görüntüsü 48 x 48. Imagemagick'in açıkladığınız gibi rsvg'ye yetki verdiğinden emin olun.
Shane Creighton-Young

1
Benim için mükemmel çalıştı - varsayılan convertsvg'yi png'ye dönüştürdü, ancak sonuçlar umutsuzdu; Yeniden yükledikten sonra mükemmeller. Ayrıca, dönüşüm önemli ölçüde daha hızlıdır.
ssc

1
Bu beni Mac OSX'te çalıştı. Yeni dönüşümü daha hızlı bulamıyorum, ancak çok daha doğru. Tüm Mac OSX kullanıcılarının bunu denemelerini şiddetle tavsiye ederim.
HelloWorld

1
Bu kabul edilen cevap olmalı, oh iyi. Teşekkür ederim, bir cazibe gibi çalıştı ve bu adımları başka türlü
atmayı

8
invalid option: --with-librsvg
Mojave

39

SVG birimleri olmadığında Inkscape çalışmıyor gibi görünüyor px(örn. Cm). Boş bir görüntüm var. Belki, dpi'yi çevirerek düzeltilebilir, ama çok zahmetliydi.

Svgexport bir node.js programıdır ve bu nedenle genellikle yararlı değildir.

Imagemagick's convert tamamıyla çalışıyor:

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

Eğer kullanırsanız -resize, görüntü bulanık ve dosya çok daha büyüktür.

EN İYİ

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

En hızlı, en az bağımlılığa sahip ve çıktı dönüştürmeden yaklaşık% 30 daha küçük. Almak için librsvg2-bin'i yükleyin. Bir el sayfası yok gibi görünüyor, ancak şunu yazabilirsiniz:

~$ rsvg --help

yardım almak için. Basit iyidir.


2
Bu kolayca en iyi cevaptır (Yirmi farklı cevabın neden aynı imagemagick cevabını verdiğini bilmiyorum); renkleri ve gölgeleri korur ve hiçbir şey değiştirmez. Bununla birlikte, imagemagick yeniden boyutlandırma davranışıyla eşleştirmek için (özellikle -aWxH , bu boyuttaki bir kutuya sığacak şekilde ölçek görüntüsü anlamına gelir, en boy oranını koruyarak), parametre rsvg ile kullanılmalıdır.
Mahmoud Al-Qudsi

1
Bu benim görüntüleri, her türlü garip eserler karıştırdı. inkscape daha iyi bir iş çıkardı.
zarif zar

1
Dikkat edin, brew install rsvgOSX'te bir milyon şey yükler - GDK, OpenSSL, Python, vb.
Timmmm

4
FYI, geçerli kurulum komutu brew install librsvgve dönüşüm komutu rsvg-convert.
waldyrious

Ben rsvg-convertkarmaşık svgs png dönüştürürken en iyi ve en tutarlı sonuçlar vermek için librsvg (veya Arch durumunda) bulundu. optipngÇıktı dosyası boyutunu küçültmek için ile takip edin .
maktel

18

Jose Alban'ın cevabındaki adımları uyguladıktan sonra , aşağıdaki komutu kullanarak ImageMagick'in iyi çalışmasını sağlayabildim:

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

1536 sayısı bir basketbol sahası yoğunluk tahmininden gelir, daha fazla bilgi için bu cevaba bakınız .


15

Görüntüyü yeniden ölçeklendirmek için seçenek -densitykullanılmalıdır. Bildiğim kadarıyla standart yoğunluk 72'dir ve 1: 1 boyutunu eşler. Çıktı png'sinin orijinal svg'den iki kat daha büyük olmasını istiyorsanız, yoğunluğu 72 * 2 = 144 olarak ayarlayın:

convert -density 144 source.svg target.png

Dönüştürme seçeneklerinin girdi dosyasından önce olması gerektiğini unutmayın . Yani convert source.svg -density 144 target.pnggörüntüyü yeniden ölçeklendirmeyiz.
Skippy le Grand Gourou

Aslında standart yoğunluk 90 gibi görünüyor. Yaniconvert -density 180 source.svg target.png
adius

7

neden inkscape komut satırına bir deneyin, bu benim sdg bu dir tüm svg dönüştürmek için benim bat dosya:

%% x IN (* .svg) İÇİN C: \ Ink \ App \ Inkscape \ inkscape.exe %% x -z --export-dpi = 500 - ihracat-alan-çizimi --export-png = "% % ~ nx.png"


4

Bu gönderiye geldim - ancak herhangi bir parametre kullanmadan (farklı boyutlarda birkaç dosya nedeniyle) dönüşümü toplu ve hızlı bir şekilde yapmak istedim.

rsvg drawing.svg drawing.png

Benim için gereksinimler muhtemelen orijinal yazardan biraz daha kolaydı. (MS PowerPoint'te SVG'leri kullanmak istedim, ancak izin vermiyor)


1
Başvuru için, macOS'ta bunun yüklü olduğu brew install librsvgve dönüşüm komutu rsvg-convert.
18'de

Ubutni de bu rsvg-convert, paket librsvg2-bin ve çıktı ihtiyacı -o drawing.png
teknopaul

4

ImageMagick'te, ImageMagick ile Inkscape veya RSVG kullanılıyorsa, kendi dahili MSVG / XML'sinden daha iyi bir SVG oluşturma elde edilir. RSVG, ImageMagick ile kurulması gereken bir temsilcidir. Inkscape sisteme yüklüyse, ImageMagick otomatik olarak kullanır. Aşağıdaki ImageMagick'te Inkscape kullanıyorum.

İstediğinizi yapacak hiçbir "sihirli" parametre yoktur.

Ancak, çıktıyı oluşturmak için gereken tam yoğunluk çok basit bir şekilde hesaplanabilir.

96 varsayılan yoğunluğunda işlendiğinde küçük bir 50x50 düğme:

convert button.svg button1.png


resim açıklamasını buraya girin

Çıktının 500 olmasını istediğimizi varsayalım. Girdi, varsayılan 96 yoğunluğunda 50'dir (Inkscape'in eski sürümleri 92 kullanıyor olabilir). Böylece, gerekli yoğunluğu, boyutların ve yoğunlukların oranlarıyla orantılı olarak hesaplayabilirsiniz.

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


convert -density 983 button.svg button2.png


resim açıklamasını buraya girin

ImageMagick 7'de hesaplamayı satır içinde aşağıdaki gibi yapabilirsiniz:

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 denklemi çok yardımcı oldu!
cyrf

2

Beni -densityısırdıran bir şey girdi dosya adından SONRA ayarlandı . Bu işe yaramadı. Dönüştürme işlemindeki ilk seçeneğe (her şeyden önce) geçmek (benim için, YMMV, vb.)


2

Basit SVG'den PNG'ye dönüştürme için cairosvg ( https://cairosvg.org/ ) ImageMagick'ten daha iyi performans gösterdiğini gördüm . Dizininizdeki tüm SVG dosyalarına yükleme ve çalıştırma adımları.

pip3 install cairosvg

.Svg dosyalarınızı içeren dizinde bir python kabuğu açın ve şunu çalıştırın:

import os

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

Bu, orijinal .svg dosyalarınızın üzerine yazmamanızı da sağlar, ancak aynı adı korur. Daha sonra, tüm .png dosyalarınızı başka bir dizine taşıyabilirsiniz:

$ mv *.png [new directory]

Windows 10'da benim için çöktü: cairocffi'yi cairo dosyası olarak içe aktarma "c: \ program files (x86) \ python35-32 \ lib \ site-Packages \ cairocffi_ init_ .py", satır 39, <module> cairo = dlopen (ffi) , 'cairo', 'cairo-2', 'cairo-gobject-2', 'cairo.so.2') Dosya "c: \ program dosyaları (x86) \ python35-32 \ lib \ site-Packages \ cairocffi_ init_ .py ", satır 36, dlopen'de yükselt OSError (" dlopen () bir kitaplık yükleyemedi:% s "% '/' .join (adlar)) OSError: dlopen () bir kitaplık yükleyemedi: cairo / cairo- 2 / cairo-gobject-2 / cairo.so.2
Pete Lomax

Güzel, cairosvgUbuntu-19.04'te bu işi benim için yaptı.
fhgd

2

Librsvg olmadan, siyah bir png / jpeg resmi alabilirsiniz. Biz yüklemek zorunda librsvgiçin convertimagemagic'den ile svg dosyası.

Ubuntu

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

Mac os işletim sistemi

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

Bu kitaplıkta yüklü değil ve siyah görüntüler de almıyorum.
Aaron Franke

1

Etiketin widthve heightözniteliklerini <svg>amaçladığım çıktı boyutuna uyacak şekilde değiştirip ImageMagick kullanarak dönüştürerek bu sorunu çözdüm . Tıkır tıkır çalışıyor.

İşte Python kodum, JPG dosyasının içeriğini döndürecek bir işlev:

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
neden bir bilgisayar tarafından oluşturulan görüntüyü jpeg olarak döndürürsünüz :(?
Willi Mentzel

1

@ 808sound'un en iyi yanıtı benim için işe yaramadı. Yeniden boyutlandırmak istedim Kenney.nl UI Paketi

ve var Kenney UI Paketi berbat

Yani bunun yerine daha sonra, Inkscape açtı gitti File, Export as PNG fileve bir GUI kutusu bana gerekli tam boyutları girebilirsiniz izin verdiğini ortaya çıkmış.

Sürüm tarihi Ubuntu 16.04 Linux: Inkscape 0.91 (September 2016)

(Bu resim Kenney.nl'in bu arada varlık paketlerinden alınmıştır)


1

Demleme kullanan macOS'ta, librsvg kullanımı doğrudan iyi çalışır

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

Birçok seçenek, rsvg-convert --help


0

Linux'ta Inkscape 1.0 ile svg'den png'ye dönüştürmek için kullanmanız gerekir

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

değil

inkscape -w 1024 -h 1024 input.svg --export-filename output.png
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.