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ć?

Author: javac, 2012-03-24

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:

Tutaj wpisz opis obrazka

Tutaj wpisz opis obrazka

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)
 361
Author: 808sound,
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!

 97
Author: Ali Shakiba,
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ść

 77
Author: Hardev,
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.

 47
Author: Jose Alban,
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.

 23
Author: september_converter,
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.

 12
Author: Ian,
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

 8
Author: Stanislav Schmidt,
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 "

 6
Author: ampecs,
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.).

 2
Author: Nick,
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)

 1
Author: Qohelet,
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
 1
Author: Yanone,
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 Kenney.nl UI Pack

I dostał Kenney UI Pack

Więc zamiast tego otworzyłem Inkscape, potem poszedłem do File, Export as PNG filei 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)

 0
Author: James L.,
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]
 0
Author: edank,
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