9

栅格化 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 网站上的一些随机代码片段。

4

2 回答 2

5

librsvg 中有一个调整大小的功能,但它已被弃用。

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

  • 在您的 cairo 上下文中设置比例变换矩阵
  • 使用 .render_cairo() 方法绘制 SVG
  • 将您的表面写入PNG
于 2009-07-27T10:12:28.313 回答
3

这是对我有用的代码。它实现了上面 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())
于 2014-10-01T03:30:09.190 回答