如何使用librsvg Python绑定程序调整SVG图像文件大小

11

在将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画布大小相同?我尝试过:

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

但是得到了

TypeError: property 'width' is not writable

另外,librsvg的Python绑定文档似乎非常罕见,cairo网站上只有一些随机的代码片段。

3个回答

5

Librsvg中有一个调整大小的resize函数,但已被弃用。

在Cairo中设置缩放矩阵以更改绘图的大小:

  • 在cairo上下文中设置缩放变换矩阵
  • 使用.render_cairo()方法绘制您的SVG
  • 将您的表面写入PNG

2
重新调整已经光栅化的图像,会导致原始矢量图像数据丢失吗? - btw0
3
cairo 变换矩阵作用于在其设置之后绘制的向量数据。你不会对光栅化图像进行缩放,而是对产生它的 librsvg 命令进行缩放。 - Luper Rouch
2
能否贴出一小段代码?你提供的文档是针对C语言的,Python中相应的语法并不明显,特别是在处理矩阵和变换时。此外,缩放似乎总是通过“因子”进行,而不是直接对(x,y)尺寸进行重新调整。 - MestreLion

5
这是适用于我的代码。它实现了上面Luper的答案:
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())

我找不到安装rsvg库的方法。我提供了使用svgutils的解决方案。 - tired and bored dev

1

以编程方式调整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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接