В настоящее время я использую rsvg для загрузки svg (из строки, а не из файла) и рисования в cairo. Кто-нибудь знает лучший способ? Я использую PIL в другом месте в своем приложении, но я не знаю, как это сделать с PIL.
SVG на стороне сервера для PNG (или какой-либо другой формат изображения) в python
Ответ 1
Здесь у меня есть:
import cairo
import rsvg
def convert(data, ofile, maxwidth=0, maxheight=0):
svg = rsvg.Handle(data=data)
x = width = svg.props.width
y = height = svg.props.height
print "actual dims are " + str((width, height))
print "converting to " + str((maxwidth, maxheight))
yscale = xscale = 1
if (maxheight != 0 and width > maxwidth) or (maxheight != 0 and height > maxheight):
x = maxwidth
y = float(maxwidth)/float(width) * height
print "first resize: " + str((x, y))
if y > maxheight:
y = maxheight
x = float(maxheight)/float(height) * width
print "second resize: " + str((x, y))
xscale = float(x)/svg.props.width
yscale = float(y)/svg.props.height
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, x, y)
context = cairo.Context(surface)
context.scale(xscale, yscale)
svg.render_cairo(context)
surface.write_to_png(ofile)
Ответ 2
Как насчет imagemagic? - http://www.imagemagick.org/script/magick-vector-graphics.php Он может читать/писать с/на stdin/stdout, поэтому вы можете интегрировать его с вашим приложением, даже если вы не хотите для использования файлов
Ответ 3
Вы также можете использовать PhantomJS (см. http://phantomjs.org/screen-capture.html)
Из оболочки:
phantomjs rasterize.js http://ariya.github.com/svg/tiger.svg tiger.png
Или из python с использованием селена:
from selenium import webdriver
driver = webdriver.PhantomJS()
driver.set_window_size(1024, 768)
driver.get('http://ariya.github.com/svg/tiger.svg')
driver.save_screenshot('tiger.png')
Ответ 4
У меня установлен inkscape, поэтому я просто обрабатываю процесс командой inkscape с inkscape -f file.svg -e file.png
Используя этот код:
import subprocess
inkscape_dir=r"C:\Program Files (x86)\Inkscape"
assert os.path.isdir(inkscape_dir)
os.chdir(inkscape_dir)
subprocess.Popen(['inkscape.exe',"-f",fname,"-e",fname_png])
Я нахожусь в Windows 7 и получил ошибку Windows 5 [Access Denied] (или что-то в этом роде) до тех пор, пока я не перейду в каталог inkscape