143

Are there any command-line programs that can convert an SVG to PNG, that run on Mac OS X?

Edit: Dylan B had a good answer with ImageMagick. For reference, to install ImageMagick with SVG support on Mac OS X using MacPorts, do

port install imagemagick +rsvg

16 Answers 16

204

Or without installing anything:

qlmanage -t -s 1000 -o . picture.svg 

It will produce picture.svg.png that is 1000 pixels wide.

I have tested it only on OS X 10.6.3.

  • 34
    Unfortunately this clips images to a square. – Martijn Pieters Jan 30 '11 at 15:13
  • 5
    Ah, qlmanage -t gives the thumbnail used by Quick Look (in Finder, etc). Clever idea. Unfortunately, these thumbnails can be buggy, especially when there's text involved. – ShreevatsaR Jun 6 '11 at 8:07
  • 6
    This produces images with the svg file in the 1st quadrant. Doesn't auto crop. Trying to convert files from noun project - wish this worked. – Alex Cook Nov 12 '12 at 20:40
  • 6
    This solution fails to take transparency into account. The tool rsvg-convert in @ahti's answer worked out before for me. – BenR May 19 '16 at 8:30
  • 3
    Putting both width and height parameters after the -s option didn't work for me. Still crops it to a square. Very frustrating! – Erik van der Neut Aug 25 '17 at 7:45
88

I found that for me the best tool for the job is rsvg-convert.

It can be found in brew with brew install librsvg and is used like this:

rsvg-convert -h 32 icon.svg > icon-32.png

(This example creates a 32px high png. The width is determined automatically.

  • This is the only one that worked for me on Mavericks and commons.wikimedia.org/wiki/… – Aron Ahmadia Jun 10 '14 at 1:03
  • Actually this one worked, while ImageMagick's convert issued errors and failed to covert a complex SVG – Brice Apr 27 '15 at 10:03
  • 6
    This is by far the best solution I've found for OS X Yosemite +1! – Greg Martin May 9 '15 at 15:03
  • This failed for some of my SVGs, strangely. The qlmanage answer worked for all of them but put a white background, which I don't want. – sudo Jun 25 '15 at 0:35
  • 1
    With rsvg-convert, the resulting .png had the right dimensions, but the image came out all black instead of the original colors. With qlmanage the image is cropped to a square. Still searching for a solution :-( – Erik van der Neut Aug 25 '17 at 7:47
37

ImageMagick is an extremely versatile command-line image editor, which would probably rival Photoshop if it had, you know, a GUI. But who needs those anyways. :P

Something like the following would convert a .svg to .png, after installation:

$ convert picture.svg picture.png

The original .svg isn't deleted.

  • It sort of has a GUI, in display. – Ignacio Vazquez-Abrams Apr 26 '10 at 4:04
  • 1
    When I installed ImageMagick with Fink, I couldn't convert svg to png - there were some errors. It turned out that I needed to install librsvg2-bin as well. – tst May 21 '10 at 12:44
  • If librsvg2-bin isn't installed (like on OS X) this will fail. Couldn't find a way to get that installed on OS X. – John Sheehan Aug 3 '12 at 18:53
  • 3
    This won't work well if you want to resize the SVG as it generates blurry images. – Behrang May 23 '13 at 3:04
  • 3
    It doesn't convert all SVG files correctly either; at least qlmanage got all the parts of the image. – Johan Feb 21 '14 at 19:50
27

Inkscape with it's Commandline-Interface produces the best results for me:

/Applications/Inkscape.app/Contents/Resources/bin/inkscape --export-png output.png -w 1024 -h 768 input.svg

Good thing is, you can specify the exact pixel size of the resulting image, without having to mess with density.

  • this is working for me! - ihave a bigger SVG created with Inkscape – matheszabi Oct 7 '13 at 21:56
  • This is the only method that rendered my hand-written svg correctly – Griffin Jul 31 '14 at 23:45
  • Convert does not generate good PNG files from SVG. Using Inkscape is the best way I have found so far. – ol_v_er Feb 27 '15 at 7:43
  • This works for me, but creates extremely blurry files. – Marcin Apr 16 '15 at 13:04
  • 3
    I had a problem to find files so run it as inkscape $(pwd)/logo.svg --export-png $(pwd)/logo.png – Andrei Jun 7 '15 at 8:32
13

OK, I found a simple way to do it on the Mac if you have Google Chrome.

In one sentence, it is to see the svg image in a webpage (must be in an html file), right click on image and choose "Copy Image" and paste to the Preview app.

Steps:

  1. Download or have the svg file in your hard drive, say, somefile.svg
  2. Now, in the same folder, just make an html file tmp.html that contains this line: <img src="somefile.svg">
  3. Now, open that html file in Google Chrome
  4. You should see the image. Now just right click on the image and choose "Copy Image"
  5. Go to Mac's Preview App, and choose, "File -> New from Clipboard"
  6. Now File -> Save the file and you have the png file. (or other file types).

This is tested on the current Chrome (version 48.0) on Mac OS X El Capitan.

Update: I am not sure whether it is due to some restriction imposed by Google Chrome. I just try an SVG file using Chrome 58.0, and I get a tiny image from the method above. If you see this case too, you can also use

<img src="somefile.svg" style="height: 82vh; margin-top: 9vh; margin-left: 9vh">

and you will have an image on screen good enough for you to do a screenshot -- using CmdShift4 or CmdShift3 on the Mac, for example. Make sure you resize your Chrome window to the maximum allowed on screen.

  • Smart solution! – Manu Mar 2 '16 at 15:07
  • This actually produces the best results for me since it renders exactly the same as the browser. – Jason Haslam Jan 26 '17 at 1:25
  • the resulting image was very poor resolution for me – Michael Sep 22 '17 at 16:02
  • Ingenious :) but for very large SVGs, the resolution of the resulting image is too low, as @Michael mentioned. – waldyrious Oct 23 '18 at 10:24
5

If you want to do many at once, you can:

mogrify -format png *.svg

There are options to resize etc on the fly, too..

  • 3
    mogrify is also par of ImageMagick. – ShreevatsaR Jun 6 '11 at 8:19
  • Works great, but brutally slow. – Meekohi Jan 24 '14 at 21:58
  • -1? Someone thinks this isn't helpful? What's the error? – DefenestrationDay Jul 29 '14 at 20:41
  • I'm not the one who downvoted, but worth noting is that ImageMagick stupidly converts svg to a raster image of arbitrary size before resizing, resulting in blurry output. – Dae Nov 1 '15 at 19:47
3

Try Apache Batik.

java -jar batik-rasterizer.jar FILES

It also supports batch conversion and has many other useful options.

3

I have made svgexport using node/npm for this, it is cross-platform and can be as simple as:

svgexport input.svg output.png
  • This was the easiest one to use and remember by far. Also, the only one that produced a correct result in my case. – Marko Grešak May 9 '17 at 22:09
  • resulting resolution wasn't great for me. – Michael Sep 22 '17 at 16:22
2

You can also use phantomjs to render the svg. The advantage is that it renders it like a browser would since it's basically a headless WebKit.

Once you download it you need phantomjs (binary) and the rasterizer.js file from the examples folder.

phantomjs examples/rasterize.js Tiger.svg out.png
  • For reference, this can be installed with brew cask install phantomjs. In my install, the examples folder was located in the path /usr/local/Caskroom/phantomjs/2.1.1/phantomjs-2.1.1-macosx/examples/. – waldyrious Oct 23 '18 at 10:26
1

I use this command on my linux. It should work for you as well.

mogrify +antialias -density 2000 -verbose -format png *.svg

I learned that without the "-density" argument, the bitmap would be very pixelized. Change the -density value to match your need.

  • 2
    Even with density, the conversion does not generate an image that is as sharp as a vector image. Try Apache Batik instead. – Behrang May 23 '13 at 3:06
1

ImageMagick's convert command, using some other parameters, is what did it for me. Here's my batch Bash script solution that divides the task across multiple processes to make use of all your cores! Modify as needed.

batchConvertToSVG.sh (takes number of processes as argument):

end=$(( $1 - 1 ))
for i in `seq 0 $end`;
        do
            echo Spawning helper $i of $end
                ./convertToSvgHelper.sh $i $1 &
        done 

convertToSvgHelper.sh:

n=$1
for file in ./*.svg; do
   filename=${file%.svg}
   echo converting file named $filename
   test $n -eq 0 && convert -format png -resize 74 -background transparent -density 600 $file $filename.png
   n=$((n+1))
   n=$((n%$2))
done
0

As commented previously ImageMagick does the trick. I just wanted to add a point for GraphicsMagick, an old fork of ImageMagick that has some improvements (and much less dependency bloat when installed via fink).

0

You can perform a batch conversion on an entire folder of SVG files to PNG. I used Inkscape command line interface to produce png files with a width of 80px.

find ~/desktop/toconvert '*.svg' -exec /Applications/Inkscape.app/Contents/Resources/bin/inkscape -z -w 80 -e "{}".png "{}" \;

png will be saved with original name *.png

0

This is what I used:

brew install imagemagick --with-librsvg

Then run the following commands:

find . -type f -name "*.svg" -exec bash -c 'convert $0 $0.png' {} \; rename 's/svg\.png/png/' *

Hope it helps.

-1

wkhtmltoimage (from project wkhtmltopdf) did this convert well:

wkhtmltoimage --zoom 2 foo.svg foo.png

ImageMagick renders CJK character as blank on my mac.

  • While this link may answer the question, it is better to include the essential parts of the answer here and provide the link for reference. Link-only answers can become invalid if the linked page changes. - From Review – Blackwood Dec 14 '18 at 4:09
  • @Blackwood fine, updated. – georgexsh Dec 14 '18 at 8:11
-2

sips — scriptable image processing system. No external binaries required.

sips -s format png mypdf.pdf --out myimage.png

Here's a script I use after a session of screen captures.

PWD=`pwd`
IMAGES=`ls "$PWD"/*.tiff`
TARGET=png
for IMAGE in $IMAGES
do
  SOURCE="$IMAGE"
  DESTINATION=`echo "$SOURCE" | sed "s/tiff/$TARGET/g"`
  sips -s format "$TARGET" "$SOURCE" --out "$DESTINATION" &2>/dev/null
done
  • Tried it, didn't produce any output. – xApple Feb 12 '13 at 13:26
  • 3
    -1 The man page clearly states sips is is used to query or modify raster image files so starting from a SVG which is what the OP was asking will not work – RobV Aug 22 '13 at 18:16

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.