首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用librsvg Python绑定调整svg图像文件的大小

如何使用librsvg Python绑定调整svg图像文件的大小
EN

Stack Overflow用户
提问于 2009-07-27 10:00:21
回答 2查看 7.1K关注 0票数 9

当栅格化svg文件时,我希望能够为生成的png文件设置宽度和高度。使用以下代码,仅将画布设置为所需的宽度和高度,具有原始svg文件尺寸的实际图像内容将呈现在(500,600)画布的左上角。

代码语言:javascript
复制
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画布大小相同?我试过了

代码语言:javascript
复制
svg.set_property('width', 500)
svg.set_property('height', 500)

但是得到了

代码语言:javascript
复制
TypeError: property 'width' is not writable

此外,librsvg python绑定的文档似乎非常稀少,只有开罗网站上的一些随机代码片段。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-07-27 10:12:28

在librsvg中有一个resize function,但它已被弃用。

在Cairo中设置scale matrix以更改图形的大小:

  • 在开罗上下文中设置比例变换矩阵
  • 使用.render_cairo()方法绘制SVG
  • 将表面写入PNG
票数 5
EN

Stack Overflow用户

发布于 2014-10-01 11:30:09

这就是为我工作的代码。它实现了上面Luper的答案:

代码语言:javascript
复制
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())
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1187358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档