python - एक PyGame एप्लिकेशन में एसवीजी रेंडरिंग



svg widget (5)

आप काइरो (पायकाइरो के साथ) का उपयोग कर सकते हैं, जो एसवीजी के प्रतिपादन के लिए समर्थन करते हैं। PyGame वेबपेज में एक काहिरा के साथ एक बफर में रेंडर करने के लिए एक हैवोटो, और उस बफर को सीधे PyGame के साथ उपयोग किया जाता है।

एक pyGame एप्लिकेशन में, मैं एसवीजी में वर्णित संकल्प-मुक्त GUI विजेट को प्रस्तुत करना चाहता हूं।

इस लक्ष्य तक पहुंचने के लिए मैं कौन सी उपकरण और / या लाइब्रेरी का उपयोग कर सकता हूं?

(मुझे ओसीईएमपी जीयूआई टूलकिट पसंद है, लेकिन ऐसा लगता है कि इसके प्रतिपादन के लिए बिटमैप निर्भर है)


काहिरा बॉक्स से एसवीजी बाहर नहीं कर सकता। ऐसा लगता है कि हमें 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 आप क्या चाहते हैं ऐसा लगता है (हालांकि मैंने इसे करने की कोशिश नहीं की है)।


आखिरी टिप्पणी दुर्घटनाग्रस्त हो गई जब मैंने भाग लिया क्योंकि svg.render_cairo () एक कैरो संदर्भ की अपेक्षा कर रहा है और कैरो सतह नहीं है मैंने निम्नलिखित फ़ंक्शन का निर्माण और परीक्षण किया और यह मेरे सिस्टम पर ठीक चलने लगता है

import array,cairo, pygame,rsvg

def loadsvg(filename,surface,position):
    WIDTH = surface.get_width()
    HEIGHT = surface.get_height()
    data = array.array('c', chr(0) * WIDTH * HEIGHT * 4)
    cairosurface = cairo.ImageSurface.create_for_data(data, cairo.FORMAT_ARGB32, WIDTH, HEIGHT, WIDTH * 4)
    svg = rsvg.Handle(filename)
    svg.render_cairo(cairo.Context(cairosurface))
    image = pygame.image.frombuffer(data.tostring(), (WIDTH, HEIGHT),"ARGB")
    surface.blit(image, position) 

WIDTH = 800
HEIGHT = 600
pygame.init()
window = pygame.display.set_mode((WIDTH, HEIGHT))
screen = pygame.display.get_surface()

loadsvg("test.svg",screen,(0,0))

pygame.display.flip() 

clock = pygame.time.Clock()
while True:
    clock.tick(15)
    event = pygame.event.get()
    for e in event:
        if e.type == 12:
            raise SystemExit

अन्य उत्तरों के आधार पर, एक पीजीएम छवि में एक एसवीजी फाइल को पढ़ने के लिए एक समारोह है - रंग चैनल ऑर्डर और स्केलिंग को सुधारने सहित:

def pygame_svg( svg_file, scale=1 ):
    svg = rsvg.Handle(file=svg_file)
    width, height= map(svg.get_property, ("width", "height"))
    width*=scale; height*=scale
    data = array.array('c', chr(0) * width * height * 4)
    surface = cairo.ImageSurface.create_for_data( data, cairo.FORMAT_ARGB32, width, height, width*4)
    ctx = cairo.Context(surface)
    ctx.scale(scale, scale)
    svg.render_cairo(ctx)

    #seemingly, cairo and pygame expect channels in a different order...
    #if colors/alpha are funny, mess with the next lines
    import numpy
    data= numpy.fromstring(data, dtype='uint8')
    data.shape= (height, width, 4)
    c= data.copy()
    data[::,::,0]=c[::,::,1]
    data[::,::,1]=c[::,::,0]
    data[::,::,2]=c[::,::,3]
    data[::,::,3]=c[::,::,2]

    image = pygame.image.frombuffer(data.tostring(), (width, height),"ARGB")
    return image