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

发布于 2024-07-27 21:44:35 字数 652 浏览 9 评论 0原文

光栅化 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

librsvg python 绑定的文档似乎极其罕见,只有开罗网站上的一些随机代码片段。

When rasterizing svg file, I would like to be able to set width and height for the resulting png file. With the following code, only the canvas is set to the desired width and height, the actual image content with the original svg file dimension is rendered in the top left corner on the (500, 600) canvas.

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")

What should I do to make the image content same size with cairo canvas? I tried

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

but got

TypeError: property 'width' is not writable

Also documents for librsvg python binding seem to be extremely rare, only some random code snippets on cairo site.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

止于盛夏 2024-08-03 21:44:35

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

在开罗设置比例矩阵来更改绘图的尺寸:

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

There is a resize function in librsvg, but it is deprecated.

Set up a scale matrix in Cairo to change the size of your drawing:

  • setup a scale transformation matrix on your cairo context
  • draw your SVG with the .render_cairo() method
  • write your surface to PNG
暮年慕年 2024-08-03 21:44:35

这是适合我的代码。
它实现了上面 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())

This is the code that works for me.
It implements the answer by Luper above:

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())
吐个泡泡 2024-08-03 21:44:35

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

Resizing svg files programmatically is not obvious. The solution provided here by other answers may be outdated/difficult to implement. I'm using another library svgutils.

The following should work.

import svgutils.transform as sg
import sys

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

You can install svgutils with usual -

pip install svgutils

Once you have properly resized svg file, you can use ffmpeg or any other image converter to save it into png.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文