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