from PyQt4 import QtGui, QtCore, QtSvg import sys from xml import FileToTree, TreeToFile, NS_MAP from PIL import Image class SVG2PNG_View(QtGui.QGraphicsView): """ Uses a graphics view to render an svg image. """ def __init__(self, svgfile, pngfile, manipulate=None): ''' read a svg file and store it in rasterized form as a png image @param manipulate: callable that can manipulate the xml tree @type manipulate: callable ''' QtGui.QGraphicsView.__init__(self) if manipulate is not None: tree = FileToTree(svgfile) manipulate(tree) TreeToFile(tree, svgfile + '.svg') item = QtSvg.QGraphicsSvgItem(svgfile + '.svg') else: item = QtSvg.QGraphicsSvgItem(svgfile) self.scene = QtGui.QGraphicsScene(self) item.setPos(QtCore.QPointF(0, 0)) self.scene.addItem(item) self.setScene(self.scene) self.saveImage(pngfile) #~ img = Image.open(pngfile) #~ img = img.resize((int(img.size[0] * 0.5), int(img.size[1] * 0.5))) #~ img.save(pngfile) def saveImage(self, pngfile): """create a QImage and render graphics scene to it. """ isize = self.scene.sceneRect().size().toSize() self.qimage = QtGui.QImage(isize, QtGui.QImage.Format_ARGB32) painter = QtGui.QPainter(self.qimage) self.scene.render(painter) self.qimage.save(pngfile) def svg2png(svgfile, pngfile, manipulate=None): SVG2PNG_View(svgfile, pngfile, manipulate=manipulate) def stripLayers(layername): def _inner(tree): for e in tree.xpath('//svg:g[not(@id="layer3")]', namespaces=NS_MAP): e.getparent().remove(e) return _inner p = tree.xpath('//svg:g/svg:path', namespaces=NS_MAP)[0] p.attrib['style'] = 'fill:#FFFFFF;' if __name__ == '__main__': app = QtGui.QApplication(sys.argv) svg2png('umic.svg', 'out.png', manipulate=stripLayers('asd'))