Am un fișier SVG, care are o dimensiune definită de 16x16. Când m-am folosi ImageMagick's a converti program pentru a converti într-un format PNG, apoi am obține un 16x16 pixeli PNG, care este mult prea mic:
convert test.svg test.png
Am nevoie pentru a specifica dimensiunea pixel de ieșire PNG. -dimensiunea parametru pare a fi ignorat,
scaraparametrul scale PNG **după** a fost convertit la PNG. Cel mai bun rezultat de pana acum, am ajuns, cu ajutorul
densitate` parametru:
convert -density 1200 test.svg test.png
Dar eu'm nu este mulțumit, pentru că vreau să specificați dimensiunea de ieșire, în pixeli, fără a face matematica pentru a calcula valoarea densității. Așa că vreau să fac ceva de genul asta:
convert -setTheOutputSizeOfThePng 1024x1024 test.svg test.png
Deci, ce este magia parametru trebuie să folosesc aici?
Nu am't a fost capabil de a obține rezultate bune de la ImageMagick în acest caz, dar Inkscape face o treabă bună de pe Linux și Windows:
inkscape -z -e test.png -w 1024 -h 1024 test.svg
Aici's rezultatul de scalare o 16x16 SVG să o 200x200 PNG folosind această comandă:
Doar pentru referință, mi Inkscape versiune (pe Ubuntu 12.04) este:
Inkscape 0.48.3.1 r9886 (Mar 29 2012)
și pe Windows 7, este:
Inkscape 0.48.4 r9939 (Dec 17 2012)
Încerca svgexport:
svgexport input.svg output.png 64x
svgexport input.svg output.png 1024:1024
svgexport este un simplu cross-platform instrument de linie de comandă care le-am făcut pentru exportul svg fișiere jpg și png, a se vedea aici pentru mai multe opțiuni. Pentru a instala svgexport npm instala, apoi executați:
npm install svgexport -g
Edit: Dacă ați găsit o problemă cu biblioteca, te rog - l prezinte pe GitHub, multumesc!
Acest lucru nu este perfect, dar isi face treaba.
convert -density 1200 -resize 200x200 source.svg target.png
Practic, aceasta crește DPI destul de mare (folosiți doar o educat/în condiții de siguranță cred) că redimensionarea se face cu o calitate corespunzătoare. Am fost încercarea de a găsi o soluție adecvată la acest lucru, dar după un timp a decis acest lucru a fost suficient de bun pentru actuala mea nevoie.
Notă: Utilizarea 200x200! pentru a forța dat rezoluție
Dacă sunteți pe MacOS X și având probleme cu Imagemagick's converti, ai putea încerca să-l reinstalați cu RSVG lib. Folosind HomeBrew:
brew remove imagemagick
brew install imagemagick --with-librsvg
Verificați că-l's a delega corect:
$ 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
Acesta ar trebui să afișeze rsvg
.
Inkscape nu't par să funcționeze atunci când svg unități nu sunt px
(de exemplu, cm). Am o imagine goală. Poate, ar putea fi reparate de către twiddling dpi, dar era prea supărătoare.
Svgexport este un node.js program și deci nu sunt în general utile.
Imagemagick's a converti funcționează bine cu:
~$ convert -background none -size 1024x1024 infile.svg outfile.png
Dacă utilizați -redimensiona
, imaginea este neclară și fișierul este mult mai mare.
Cel MAI bun
~$ rsvg -w 1024 -h 1024 infile.svg outfile.png
Este mai rapid, are mai puține dependențe, și de ieșire este de aproximativ 30% mai mici decât converti. Instalați librsvg2-bin a obține-l. Acolo nu pare a fi un om pagină, dar aveți posibilitatea să tastați:
~$ rsvg --help
pentru a obține ajutor. Simplu este bun.
După ce a urmat pașii în Jose Alban's a răspunde, am fost capabil de a obține ImageMagick să funcționeze bine, folosind următoarea comandă:
convert -density 1536 -background none -resize 100x100 input.svg output-100.png
Numărul 1536 vine de la un stadion estimare a densității, a se vedea acest răspuns pentru mai multe informații.
În scopul de a redimensiona imaginea, opțiunea densitate
ar trebui să fie utilizate. Din câte știu densitatea standard este de 72 și hărți dimensiunea 1:1. Dacă doriți ieșire png să fie de două ori la fel de mare ca cel original, svg, setați densitatea la 72*2=144:
convert -density 144 source.svg target.png
de ce nu't ai da o încercare de a folosi linia de comandă, acest lucru este meu bat de fișiere pentru a converti toate svg în acest dir la png:
PENTRU %%x ÎN (*.svg) FACE C:\Ink\App\Inkscape\inkscape.exe %%x -z --export-dpi=500 --export-zona-desen-export-png="%%~nx.png"
Am venit la acest post, dar am vrut doar pentru a face conversia de lot și rapid, fără utilizarea de orice parametri (ca urmare a mai multor fișiere cu dimensiuni diferite).
rsvg drawing.svg drawing.png
Pentru mine cerințele au fost, probabil, un pic mai ușor decât pentru autorul original. (A vrut să folosească svg s în MS PowerPoint, dar nu't permite)
În ImageMagick, se obține o mai bună SVG redare dacă se folosește Inkscape sau RSVG cu ImageMagick decât propriile sale interne MSVG/XML prestate. RSVG este un delegat care trebuie să fie instalat cu ImageMagick. Dacă Inkscape este instalat pe sistem, ImageMagick va folosi în mod automat. Eu folosesc Inkscape în ImageMagick de mai jos.
Nu există nici o "magic" parametru care va face ceea ce vrei.
Dar, se poate calcula foarte simplu exact densitatea necesară pentru a face ieșire.
Aici este un mic 50x50 buton, atunci când făcut în mod implicit densitatea 96:
convert button.svg button1.png
Să presupunem că vrem ieșire să fie de 500. Intrarea este 50 la default densitate de 96 (versiunile mai vechi de Inkscape poate fi folosind 92). Astfel încât să puteți calcula nevoie de densitate în funcție de raporturile dintre dimensiuni și densități.
512/50 = X/96
X = 96*512/50 = 983
convert -density 983 button.svg button2.png
În ImageMagick 7, puteți face calculul în linie, după cum urmează:
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
Pentru simplu SVG la PNG conversie am găsit cairosvg (https://cairosvg.org/) se comportă mai bine decât ImageMagick. Pași pentru a instala și rula pe toate SVG fișiere în directorul dumneavoastră.
pip3 install cairosvg
Deschide un python shell în directorul care conține .fișierele svg și rula:
import os
for file in os.listdir('.'):
name = file.split('.svg')[0]
cairosvg.svg2png(url=name+'.svg',write_to=name+'.png')
Acest lucru va asigura, de asemenea, don't suprascrie original .fișierele svg, dar va păstra același nume. Apoi, puteți muta toate .png fișiere către un alt director cu:
$ mv *.png [new directory]
Fără librsvg, s-ar putea obține un negru png/jpeg imagine. Avem de a instala librsvg
pentru a "converti" fișier svg, cu imagemagick.
`` sudo apt-get install imagemagick librsvg converti cu densitate 1200 de testare.svg test.png
``
`` brew install imagemagick librsvg converti cu densitate 1200 de testare.svg test.png
``
Am'am rezolvat aceasta problema prin schimbarea "lățime" și "înălțime" atribute de `
Aici's my cod Python, o funcție care va returna fișier JPG's conținut:
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
Răspunsul de sus de @808sound nu au de lucru pentru mine. Am vrut să redimensiona
Deci, în loc am deschis Inkscape, apoi a mers la Fișier
, `Export ca fișier PNG și un GUI cutie apărut că mi-a permis de a stabili exact dimensiunile de care aveam nevoie.
Versiunea pe Ubuntu 16.04 Linux:
Inkscape 0.91 (Septembrie 2016)`
(Această imagine este de la Kenney.nl's a activelor pachete apropo)