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