Jak przekonwertować SVG NA PNG za pomocą Image Magick?
Mam plik SVG, który ma określony rozmiar 16x16. Kiedy używam programu Image Magick do konwersji do PNG, dostaję PNG o wymiarach 16x16 pikseli, który jest o wiele za mały:
convert test.svg test.png
Muszę określić rozmiar piksela wyjściowego PNG. -size
parametr wydaje się być ignorowany, -scale
parametr skaluje PNG po został przekonwertowany do PNG. Najlepszy wynik do tej pory uzyskałem używając parametru -density
:
convert -density 1200 test.svg test.png
Ale nie jestem zadowolony, ponieważ chcę określić rozmiar wyjściowy w pikselach bez obliczania wartości gęstości. Więc chcę zrobić coś takiego:
convert -setTheOutputSizeOfThePng 1024x1024 test.svg test.png
Więc jaki jest magiczny parametr, którego muszę tu użyć?
13 answers
Nie byłem w stanie uzyskać dobrych wyników z ImageMagick w tym przypadku, ale Inkscape robi dobrą robotę na Linuksie i Windows:
inkscape -z -e test.png -w 1024 -h 1024 test.svg
Oto wynik skalowania SVG 16x16 do PNG 200x200 za pomocą tego polecenia:
Dla przypomnienia, moja wersja Inkscape (na Ubuntu 12.04) to:
Inkscape 0.48.3.1 r9886 (Mar 29 2012)
A na Windows 7 jest:
Inkscape 0.48.4 r9939 (Dec 17 2012)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-05 18:09:55
Spróbuj svgexport:
svgexport input.svg output.png 64x
svgexport input.svg output.png 1024:1024
Svgexport jest prostym wieloplatformowym narzędziem wiersza poleceń, które zrobiłem do eksportowania plików svg do jpg i png, Zobacz tutaj aby uzyskać więcej opcji. Aby zainstalować svgexport zainstaluj npm , Następnie uruchom:
npm install svgexport -g
Edit: jeśli znajdziesz problem z biblioteką, proszę prześlij go na Githubie, dzięki!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-11 04:25:38
To nie jest idealne, ale robi swoje.
convert -density 1200 -resize 200x200 source.svg target.png
Zasadniczo zwiększa wystarczająco wysokie DPI (wystarczy użyć wykształconego/bezpiecznego zgadywania), że zmiana rozmiaru odbywa się z odpowiednią jakością. Starałem się znaleźć odpowiednie rozwiązanie, ale po chwili uznałem, że jest to wystarczająco dobre dla moich obecnych potrzeb.
Uwaga: Użyj 200x200! aby wymusić daną rozdzielczość
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-29 10:10:25
Jeśli korzystasz z systemu MacOS X i masz problemy z konwersją Imagemagick, możesz spróbować ponownie zainstalować go za pomocą rsvg lib. Użycie HomeBrew:
brew remove imagemagick
brew install imagemagick --with-librsvg
Sprawdź czy jest poprawnie:
$ 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
Powinien wyświetlać rsvg
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-17 11:46:39
Wygląda na to, że Inkscape nie działa, gdy jednostki svg nie są px
(np. cm). Mam czysty obraz. Może da się to naprawić, przesuwając dpi, ale było to zbyt kłopotliwe.
Svgexport jest węzłem.program js i tak ogólnie nie przydatny.
Imagemagick ' s convert Działa ok z:
~$ convert -background none -size 1024x1024 infile.svg outfile.png
Jeśli używasz -resize
, obraz jest rozmyty, a plik jest znacznie większy.
BEST
~$ rsvg -w 1024 -h 1024 infile.svg outfile.png
Jest najszybsza, ma najmniejszą zależność, a wyjście wynosi około 30% mniejsze niż Konwertuj. Zainstaluj librsvg2-bin, aby go pobrać. Nie wygląda na to, że istnieje strona podręcznika, ale możesz wpisać:
~$ rsvg --help
Aby uzyskać pomoc. Proste jest dobre.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-14 22:03:06
Po wykonaniu kroków w odpowiedź Jose Albana , udało mi się uruchomić ImageMagick za pomocą następującego polecenia:
convert -density 1536 -background none -resize 100x100 input.svg output-100.png
Liczba 1536 pochodzi z oszacowania gęstości, zobacz ta odpowiedź aby uzyskać więcej informacji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:38
Aby przeskalować obraz, należy użyć opcji-gęstość. Z tego co wiem standardowa gęstość to 72 i ma rozmiar 1: 1. Jeśli chcesz, aby wyjściowy plik png był dwukrotnie większy od oryginalnego formatu svg, Ustaw gęstość na 72 * 2=144
Convert-density 144 source.cel svg.png
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-14 09:58:38
Dlaczego nie spróbujesz linii poleceń inkscape, to jest mój plik bat do konwersji całego svg w tym katalogu do png:
Dla % % X w (*.svg) DO C:\Ink\App\Inkscape\inkscape.exe % % x-z --export-DPI=500 --export-area-drawing --export-png= " % % ~nx.png "
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-05 17:07:39
Jedna rzecz, która mnie ugryzła, to ustawienie -density
po nazwie pliku wejściowego. To nie zadziałało. Przeniesienie go do pierwszej opcji w convert (przed czymkolwiek innym) sprawiło, że działał (dla mnie, YMMV, itp.).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-23 23:19:44
Przyszedłem do tego postu - ale chciałem zrobić konwersję wsadową i szybką bez użycia jakichkolwiek parametrów (ze względu na kilka plików o różnych rozmiarach).
rsvg drawing.svg drawing.png
Dla mnie wymagania były chyba nieco łatwiejsze niż dla oryginalnego autora. (Chciał używać SVGs w MS PowerPoint, ale nie pozwala)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-28 09:33:42
Rozwiązałem ten problem zmieniając atrybuty width
i height
znacznika <svg>
, aby pasowały do zamierzonego rozmiaru wyjściowego, a następnie konwertując go za pomocą ImageMagick. Działa jak urok.
Oto Mój kod Pythona, funkcja, która zwróci zawartość pliku 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-24 19:57:50
Najlepsza odpowiedź przez @808sound nie działa dla mnie. Chciałem zmienić rozmiar
Więc zamiast tego otworzyłem Inkscape, potem poszedłem do File
, Export as PNG file
i wyskoczyło okno GUI, które pozwoliło mi ustawić dokładne wymiary, których potrzebowałem.
Wersja na Ubuntu 16.04 Linux
:
Inkscape 0.91 (September 2016)
(ten obrazek pochodzi z Kenney.nl ' s asset packs by the way)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-07 18:45:34
Dla prostej konwersji SVG do PNG znalazłem cairosvg (https://cairosvg.org / ) działa lepiej niż ImageMagick. Kroki instalacji i uruchomienia wszystkich plików SVG w katalogu.
pip3 install cairosvg
Otwórz powłokę Pythona w katalogu, który zawiera Twoje .pliki svg i uruchom:
import os
for file in os.listdir('.'):
name = file.split('.svg')[0]
cairosvg.svg2png(url=name+'.svg',write_to=name+'.png')
Zapewni to również, że nie nadpiszesz oryginału .plików svg, ale zachowa tę samą nazwę. Następnie można przenieść wszystkie swoje .pliki png do innego katalogu z:
$ mv *.png [new directory]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-11 21:30:46