PyGame应用程序中的SVG渲染
时间:2020-03-06 14:35:39 来源:igfitidea点击:
在pyGame应用程序中,我想呈现SVG中描述的无分辨率的GUI小部件。
我可以使用什么工具和/或者库来实现此目标?
(我喜欢OCEMP GUI工具包,但它的呈现似乎依赖于位图)
解决方案
我们可以使用Cairo(与PyCairo一起使用),它支持渲染SVG。 PyGame网页有一个HOWTO,可使用Cairo渲染到缓冲区中,并直接与PyGame一起使用该缓冲区。
我意识到这并不能完全回答问题,但是有一个名为Squirtle的库可以使用Pyglet或者PyOpenGL渲染SVG文件。
开罗无法直接使用SVG。
看来我们必须使用librsvg。
刚刚找到了这两个页面:
- 使用libRSVG,Python和c-types渲染SVG
- 如何从Python使用librsvg
这样的事情可能应该起作用(将test.svg渲染为test.png):
import cairo
import rsvg
WIDTH, HEIGHT = 256, 256
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")
pygamesvg似乎可以满足要求(尽管我还没有尝试过)。
这是一个完整的示例,在此结合了其他人的提示。
它应该从当前目录渲染一个名为test.svg的文件。它已在Ubuntu 10.10,python-cairo 1.8.8,python-pygame 1.9.1,python-rsvg 2.30.0上进行了测试。
#!/usr/bin/python
import array
import math
import cairo
import pygame
import rsvg
WIDTH = 512
HEIGHT = 512
data = array.array('c', chr(0) * WIDTH * HEIGHT * 4)
surface = cairo.ImageSurface.create_for_data(
data, cairo.FORMAT_ARGB32, WIDTH, HEIGHT, WIDTH * 4)
pygame.init()
window = pygame.display.set_mode((WIDTH, HEIGHT))
svg = rsvg.Handle(file="test.svg")
ctx = cairo.Context(surface)
svg.render_cairo(ctx)
screen = pygame.display.get_surface()
image = pygame.image.frombuffer(data.tostring(), (WIDTH, HEIGHT),"ARGB")
screen.blit(image, (0, 0))
pygame.display.flip()
clock = pygame.time.Clock()
while True:
clock.tick(15)
for event in pygame.event.get():
if event.type == pygame.QUIT:
raise SystemExit

