5

我想做类似的事情:

    import image
    image.display_image('http://upload.wikimedia.org/wikipedia/commons/8/84/Example.svg')

它会以图像的形式出现。

PS 我想要 PNG 或 JPEG,而不是 GIF。

4

1 回答 1

5

这个问题有些陈旧,但是由于在网上不容易找到有关如何轻松执行此操作的信息,因此我发布了此答案,希望将来对其他人有用。

要栅格化 SVG 并将其放入 ImageTk.PhotoImage 对象中,您可以在用于 tkinter gui 的类中执行此操作:

def svgPhotoImage(self,file_path_name):
        import Image,ImageTk,rsvg,cairo
        "Returns a ImageTk.PhotoImage object represeting the svg file" 
        # Based on pygame.org/wiki/CairoPygame and http://bit.ly/1hnpYZY        
        svg = rsvg.Handle(file=file_path_name)
        width, height = svg.get_dimension_data()[:2]
        surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, int(width), int(height))
        context = cairo.Context(surface)
        #context.set_antialias(cairo.ANTIALIAS_SUBPIXEL)
        svg.render_cairo(context)
        tk_image=ImageTk.PhotoImage('RGBA')
        image=Image.frombuffer('RGBA',(width,height),surface.get_data(),'raw','BGRA',0,1)
        tk_image.paste(image)
        return(tk_image)

然后以这种方式在 Frame 小部件(例如 mainFrame)上显示图像:

tk_image=self.svgPhotoImage(filename)
mainFrame.configure(image=tk_image)

如果要保存图片,可以返回 image 而不是 tk_image 并以这种方式保存:

image.save(filename) # Image format is autodected via filename extension
于 2014-06-13T19:43:53.797 回答