在pyGame应用程序中,我想渲染SVG中描述的无分辨率的GUI小部件.
我可以使用哪些工具和/或库来实现这一目标?
(我喜欢OCEMP GUI工具包,但它的渲染似乎依赖于位图)
这是一个完整的例子,它结合了其他人的提示.它应该从当前目录呈现一个名为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
这个问题已经很老了,但是已经过去了10年,并且有新的可能可行并且不再需要librsvg
了。在nanosvg库上有Cython包装器,它的工作原理是:
from svg import Parser, Rasterizer def load_svg(filename, surface, position, size=None): if size is None: w = surface.get_width() h = surface.get_height() else: w, h = size svg = Parser.parse_file(filename) rast = Rasterizer() buff = rast.rasterize(svg, w, h) image = pygame.image.frombuffer(buff, (w, h), 'ARGB') surface.blit(image, position)
我发现Cairo / rsvg解决方案太复杂,无法安装,因为依赖项安装起来相当晦涩。
您可以使用Cairo(使用PyCairo),它支持渲染SVG.PyGame网页有一个HOWTO用于使用Cairo渲染到缓冲区,并直接使用PyGame缓冲区.