Как изменить размер файла изображения 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.