Как изменить размер файла изображения SVG с помощью привязки Python librsvg

При растеризации файла SVG, я хотел бы иметь возможность установить ширину и высоту для результирующего файла PNG. С помощью следующего кода только холст устанавливается на желаемую ширину и высоту, фактическое содержимое изображения с исходным размером файла SVG отображается в верхнем левом углу на холсте (500, 600).

import cairo
import rsvg

WIDTH, HEIGHT  = 500, 600
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, WIDTH, HEIGHT)

ctx = cairo.Context(surface)

svg = rsvg.Handle(file="test.svg")
svg.render_cairo(ctx)

surface.write_to_png("test.png")

Что я должен сделать, чтобы сделать изображение таким же размером с помощью cairo canvas? Я старался

svg.set_property('width', 500)
svg.set_property('height', 500)

но получил

TypeError: property 'width' is not writable

Кроме того, документы для связывания Python librsvg кажутся крайне редкими, только некоторые случайные фрагменты кода на сайте cairo.

3 ответа

Решение

В librsvg есть функция изменения размера, но она устарела.

Установите масштабную матрицу в Каире, чтобы изменить размер вашего рисунка:

  • установить матрицу преобразования масштаба в контексте cairo
  • нарисуйте свой SVG с помощью метода.render_cairo()
  • написать свою поверхность в PNG

Это код, который работает для меня. Он реализует ответ Лупера выше:

import rsvg
import cairo

# Load the svg data
svg_xml = open('topthree.svg', 'r')
svg = rsvg.Handle()
svg.write(svg_xml.read())
svg.close()

# Prepare the Cairo context
img = cairo.ImageSurface(cairo.FORMAT_ARGB32, 
      WIDTH, 
      HEIGHT)
ctx = cairo.Context(img)

# Scale whatever is written into this context
# in this case 2x both x and y directions
ctx.scale(2, 2)
svg.render_cairo(ctx)

# Write out into a PNG file
png_io = StringIO.StringIO()
img.write_to_png(png_io)    
with open('sample.png', 'wb') as fout:
    fout.write(png_io.getvalue())

Программное изменение размера файлов svg неочевидно. Решение, представленное здесь другими ответами, может быть устаревшим/сложным для реализации. Я использую другую библиотеку svgutils .

Следующее должно работать.

      import svgutils.transform as sg
import sys

fig = sg.fromfile('myimage.svg')
fig.set_size(('200','200'))
fig.save('myimage2.svg')

Вы можете установить svgutils с помощью обычного -

      pip install svgutils

После того, как вы правильно изменили размер файла svg, вы можете использовать ffmpeg или любой другой конвертер изображений, чтобы сохранить его в png.

Другие вопросы по тегам