ImageMagick을 사용하여 SVG를 PNG로 변환하는 방법은 무엇입니까?


388

16x16 크기로 정의 된 SVG 파일이 있습니다. ImageMagick의 변환 프로그램을 사용하여 PNG로 변환하면 너무 작은 16x16 픽셀 PNG가 나타납니다.

convert test.svg test.png

출력 PNG의 픽셀 크기를 지정해야합니다. -size매개 변수는 무시 될 것으로 보인다 -scale매개 변수는 PNG를 조정 한 후 이 PNG로 변환되었습니다. 지금까지 가장 좋은 결과는 -density매개 변수 를 사용하여 얻은 것입니다 .

convert -density 1200 test.svg test.png

그러나 밀도 값을 계산하기 위해 수학을 수행하지 않고 출력 크기를 픽셀 단위로 지정하려고하기 때문에 만족스럽지 않습니다. 그래서 나는 이런 식으로하고 싶다 :

convert -setTheOutputSizeOfThePng 1024x1024 test.svg test.png

여기서 사용해야 할 마법 매개 변수는 무엇입니까?


6
예를 들어 -size 1024x1024잘 작동하고 있다면 imagemagick 버전은 무엇입니까?
Dejan Marjanovic


2
ImageMagick-6.9.0-Q16. convert -resize 1024x1024 foo.svg foo.png는 정상적으로 작동합니다.
Jichao

11
@Jichao -resize는 변환 된 이미지를 늘려 품질이 좋지 않습니다.
Elist

5
convert -size 1024x1024 test.svg test.pngImageMagick 7.0.7-0 Q16 (Windows 용 Chocolatey repo의 현재 버전)에서 제대로 작동합니다. -size입력 파일 이름 앞에 표시 되는지 확인하십시오 . 그렇지 않으면 16x16 사진이 업 스케일되어 흐릿한 결과를냅니다.
Futal

답변:


502

이 경우 ImageMagick에서 좋은 결과를 얻을 수 없었지만 Inkscape는 Linux 및 Windows에서 훌륭하게 작동합니다.

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

편집 (2020 년 5 월) : Inkscape 1.0 사용자, 명령 행 인수가 변경되었습니다.

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

이 명령을 사용하여 16x16 SVG를 200x200 PNG로 스케일링 한 결과는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

참고로, 내 Inkscape 버전 (Ubuntu 12.04)은 다음과 같습니다.

Inkscape 0.48.3.1 r9886 (Mar 29 2012)

Windows 7에서는 다음과 같습니다.

Inkscape 0.48.4 r9939 (Dec 17 2012)

15
imagemagick에 관한 한 +1. SVG 엔진에 문제가있는 것 같습니다. 대부분의 경우 정확한 결과를 얻을 수 없었습니다. Inkscape, OTOH는 완벽하게 작동합니다.
Glutanimate

13
나는 잉크 스케이프가 리눅스 이후 OSS의 가장 인상적인 예라고 생각한다. 팁 고마워!
kim3er

8
OSX에서도 잘 작동합니다.
조나스 그란 빅

12
X11 용 Inkscape가 설치된 OSX에서는 다음을 사용하여 작동했습니다./Applications/Inkscape.app/Contents/Resources/bin/inkscape -z -e test.png -w 1024 -h 1024 test.svg
chmullig

11
@ Rörd ImageMagick으로 배경을 투명하게 유지하려면 -background none명령 행 옵션을 사용하십시오.
John

142

svgexport를 사용해보십시오 :

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

svgexport는 svg 파일을 jpg 및 png로 내보내기 위해 만든 간단한 크로스 플랫폼 명령 줄 도구입니다 . 자세한 옵션 은 여기 를 참조 하십시오 . svgexport install npm 을 설치하려면 다음을 실행하십시오.

npm install svgexport -g

편집 : 라이브러리에 문제가 있으면 GitHub에 제출하십시오 . 감사합니다!


4
svgexport는 저에게 효과적이었습니다. 출력은 ImageMagick보다 브라우저 렌더링과 훨씬 더 일치합니다.
t9mike

5
svgexport 품질이 정말 높습니다. 이제 그것은 내가 가장 좋아하는 도구가되었습니다. shakiba! :)
Alessio Periloso

1
이것은 나를 위해 잘 작동했습니다. GUI 도구에서 수동으로 수행하는 것과 비교하여 실시간 절약. 핸들이 잘 SVG 어쨌든 싼 범위에서 맥의 GUI 응용 프로그램 찾기 매우 어렵
에릭 Engheim

4
잘 작동하지만 큰 이미지를 생성합니다. optipng를 사용하여 텍스트 로고를 3MB에서 ~ 20kB로 압축 할 수있었습니다.
miek

2
evgexport는 크기에 따라 거대한 png 파일을 만듭니다. 내보내기에 PhantomJS를 사용하지만 훨씬 더 작은 이미지를 생성하는 svg2png를 권장합니다.
Aaron_H

112

이것은 완벽하지는 않지만 작업을 수행합니다.

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

기본적으로 크기 조정이 적절한 품질로 수행 될 수있을 정도로 DPI를 충분히 높입니다 (교육받은 / 안전한 추측 만 사용). 나는 이것에 대한 적절한 해결책을 찾으려고 노력했지만 잠시 후 이것이 현재의 필요에 충분하다고 결정했습니다.

참고 : 200x200을 사용하십시오! 주어진 해상도를 강제로


4
내 경우에는 불투명도와 그림자가 사라졌습니다.
jiyinyiyong

2
나는 복잡한 svg를 가지고 있지 않으므로 이것이 나를 위해 일했다. -resize 200%작동하지 않았고 크기를 픽셀 단위로 지정해야했습니다.
jozxyqk

18
@jiyinyiyong ImageMagick으로 배경을 투명하게 유지하려면 -background none명령 줄 옵션을 사용하십시오. 이미지 비율을 유지하기 -resize 200위해 너비 또는 -resize x200높이 와 같은 치수 만 지정할 수 있습니다 . 철저한 ImageMagick 지오메트리 옵션에 대해서는 imagemagick.org/script/command-line-processing.php#geometry 를 참조하십시오 .
John

나에게도 효과가 없다. 결과가 모두 흐릿합니다.
mbonnin

IM에 -verbose를 설정하면 IM 자체가 inkscape를 사용하여 중간 eps 파일을 생성하는 것처럼 보입니다 (리눅스에 적용되며 창에 적용될 수 있음). 808sound @ 의해 제안 그러므로 내가 직접 잉크 스케이프를 사용하는 것이 좋습니다 것
북 - 브래들리

55

MacOS X를 사용 중이고 Imagemagick의 변환에 문제가있는 경우 RSVG lib로 다시 설치하십시오. 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입니다. 설명대로 imagemagick이 rsvg에 위임되어 있는지 확인하십시오.
Shane Creighton-Young

1
나를 위해 완벽하게 작동했습니다. 기본값 convert은 svg를 png로 변환했지만 결과는 희망이 없었습니다. 다시 설치하면 완벽합니다. 또한 변환 속도가 훨씬 빠릅니다.
ssc

1
이것은 Mac OSX에서 저에게 효과적이었습니다. 새로운 전환을 더 빨리 찾지는 않지만 훨씬 더 정확합니다. 모든 Mac OSX 사용자가 시도해 볼 것을 적극 권장합니다.
HelloWorld

1
이것은 받아 들일만한 대답이어야합니다. 감사합니다, 매력처럼 일하고, 나는이 단계를 다른 방법으로 취하는 것을 결코 알지 못했을 것입니다
sdailey

8
invalid option: --with-librsvg
mojave에서

39

svg 단위가 아닌 경우 px(예 : cm) 잉크 스케이프가 작동하지 않는 것 같습니다 . 빈 이미지가 있습니다. 아마도 dpi를 꼬아 서 고칠 수도 있지만 너무 번거로 웠습니다.

Svgexport는 node.js 프로그램이므로 일반적으로 유용하지 않습니다.

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
이것은 쉽게 가장 좋은 답변입니다 (왜 20 개의 다른 답변이 동일한 imagemagick 응답을 제공하는지 모르겠습니다). 색상과 그림자를 유지하고 아무것도 얽매이지 않습니다. 그러나 imagemagick 크기 조정 동작 (특히 -aWxH는 가로 세로 비율을 유지하면서 해당 크기의 상자에 맞게 이미지 크기 조정을 의미 함)을 일치 시키려면 매개 변수를 rsvg와 함께 사용해야합니다.
Mahmoud Al-Qudsi

1
이것은 내 이미지, 모든 종류의 이상한 유물을 엉망으로 만들었습니다. inkscape가 더 나은 일을했습니다.
우아한 주사위

1
, 경고 brew install rsvg등 GDK, OpenSSL을, 파이썬, - OSX 백만 가지 설치에
Timmmm

4
참고로, 현재 설치 명령은 brew install librsvg이고 변환 명령은 rsvg-convert입니다.
waldyrious

rsvg-convert복잡한 svgs를 png로 변환 할 때 librsvg (또는 Arch의 경우)가 가장 일관되고 최상의 결과를 제공한다는 것을 알았습니다. optipng출력 파일 크기를 줄이 십시오 .
maktel

18

Jose Alban 's answer 의 단계를 수행 한 후 다음 명령을 사용하여 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

변환 옵션은 입력 파일 앞에 있어야합니다. 즉 convert source.svg -density 144 target.png, 이미지 크기를 조정하지 않습니다.
Skippy le Grand Gourou

실제로 표준 밀도는 90 인 것 같습니다. 따라서convert -density 180 source.svg target.png
adius

7

왜 inkscape 명령 행을 시도하지 않습니까?이 디렉토리의 모든 svg를 png로 변환하는 박쥐 파일입니다.

%% 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에서 SVG를 사용하고 싶지만 허용하지 않습니다)


1
참고로, macOS에서는 이것이 설치되며 brew install librsvg변환 명령은 rsvg-convert입니다.
waldyrious

Ubutni에서 그것은 또한 rsvg-convert이고, 패키지는 librsvg2-bin이며 출력은 -o
drawing.png

4

ImageMagick에서는 자체 내부 MSVG / XML 렌더링보다 ImageMagick과 함께 Inkscape 또는 RSVG를 사용하는 경우 더 나은 SVG 렌더링을 얻을 수 있습니다. RSVG는 ImageMagick과 함께 설치해야하는 대리인입니다. 시스템에 Inkscape가 설치되어 있으면 ImageMagick이 자동으로 사용합니다. 아래 ImageMagick에서 Inkscape를 사용합니다.

원하는 것을 수행 할 "매직"매개 변수가 없습니다.

그러나 출력을 렌더링하는 데 필요한 정확한 밀도를 매우 간단하게 계산할 수 있습니다.

기본 밀도 96으로 렌더링 할 때 작은 50x50 버튼은 다음과 같습니다.

convert button.svg button1.png


여기에 이미지 설명을 입력하십시오

출력이 500이 되길 원한다고 가정합니다. 입력의 기본 밀도는 96입니다 (이전 버전의 Inkscape는 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입력 파일 이름을 설정 한 후 한 가지 물었습니다. 작동하지 않았습니다. 변환 (첫 번째, YMMV 등)에서 변환의 첫 번째 옵션으로 옮기면 작동합니다.


2

간단한 SVG에서 PNG 로의 변환을 위해 cairosvg ( https://cairosvg.org/ )가 ImageMagick보다 성능이 우수하다는 것을 알았 습니다. 디렉토리의 모든 SVG 파일에서 설치 및 실행 단계.

pip3 install cairosvg

.svg 파일이 들어있는 디렉토리에서 Python 쉘을 열고 다음을 실행하십시오.

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]

Windows 10에서 충돌 : cairo 파일로 cairocffi 가져 오기 "c : \ program files (x86) \ python35-32 \ lib \ site-packages \ cairocffi_ init_ .py", 39 행, <module> cairo = dlopen (ffi , 'cairo', 'cairo-2', 'cairo-gobject-2', 'cairo.so.2') 파일 "c : \ program files (x86) \ python35-32 \ lib \ site-packages \ cairocffi_ init_ dlopen raise OSError ( "dlopen ()에서 라이브러리를로드하지 못했습니다 : % s"% '/'.join (names)) OSError : dlopen ()이 라이브러리를로드하지 못했습니다 : cairo / cairo- 2 / cairo-gobject-2 / cairo.so.2
Pete Lomax

니스, cairosvg우분투 19.04에 나를 위해 일을했다.
fhgd

2

librsvg가 없으면 검은 색 png / jpeg 이미지가 나타날 수 있습니다. imagemagick 를 사용 librsvg하여 convertsvg 파일 에 설치해야 합니다 .

우분투

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

맥 OS

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

이 라이브러리가 설치되어 있지 않으며 검은 이미지가 없습니다.
Aaron Franke

1

의도 한 출력 크기와 일치하도록 태그 의 widthheight속성 을 변경 <svg>한 다음 ImageMagick을 사용하여 변환 하여이 문제를 해결 했습니다. 매력처럼 작동합니다.

다음은 JPG 파일의 내용을 반환하는 함수 인 Python 코드입니다.

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 :(?
Willi Mentzel

1

@ 808sound의 최고 답변은 저에게 효과적이지 않았습니다. 나는 크기를 조정하고 싶었다 Kenney.nl UI 팩

그리고있어 케니 UI 팩 엉망

그래서 그 대신 나는 그 때, 잉크 스케이프를 열어 갔던 File, Export as PNG file그리고 GUI 상자가 제가 필요로하는 정확한 크기를 설정할 수 있다는 팝업.

에 버전 Ubuntu 16.04 Linux: Inkscape 0.91 (September 2016)

(이 이미지는 Kenney.nl의 자산 팩 에서 가져온 것입니다)


1

brew를 사용하는 macOS에서 librsvg를 사용하면 직접 작동합니다.

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

많은 옵션을 통해 사용할 수 있습니다 rsvg-convert --help


0

Linux에서 Inkscape 1.0을 사용하는 경우 svg에서 png로 변환해야합니다.

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

아니

inkscape -w 1024 -h 1024 input.svg --export-filename output.png
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.