svgtools.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. from PyQt4 import QtGui, QtCore, QtSvg
  2. import sys
  3. from xml import FileToTree, TreeToFile, NS_MAP
  4. from PIL import Image
  5. class SVG2PNG_View(QtGui.QGraphicsView):
  6. """
  7. Uses a graphics view to render an svg image.
  8. """
  9. def __init__(self, svgfile, pngfile, manipulate=None):
  10. ''' read a svg file and store it in rasterized form as a png image
  11. @param manipulate: callable that can manipulate the xml tree
  12. @type manipulate: callable
  13. '''
  14. QtGui.QGraphicsView.__init__(self)
  15. if manipulate is not None:
  16. tree = FileToTree(svgfile)
  17. manipulate(tree)
  18. TreeToFile(tree, svgfile + '.svg')
  19. item = QtSvg.QGraphicsSvgItem(svgfile + '.svg')
  20. else:
  21. item = QtSvg.QGraphicsSvgItem(svgfile)
  22. self.scene = QtGui.QGraphicsScene(self)
  23. item.setPos(QtCore.QPointF(0, 0))
  24. self.scene.addItem(item)
  25. self.setScene(self.scene)
  26. self.saveImage(pngfile)
  27. #~ img = Image.open(pngfile)
  28. #~ img = img.resize((int(img.size[0] * 0.5), int(img.size[1] * 0.5)))
  29. #~ img.save(pngfile)
  30. def saveImage(self, pngfile):
  31. """create a QImage and render graphics scene to it.
  32. """
  33. isize = self.scene.sceneRect().size().toSize()
  34. self.qimage = QtGui.QImage(isize, QtGui.QImage.Format_ARGB32)
  35. painter = QtGui.QPainter(self.qimage)
  36. self.scene.render(painter)
  37. self.qimage.save(pngfile)
  38. def svg2png(svgfile, pngfile, manipulate=None):
  39. SVG2PNG_View(svgfile, pngfile, manipulate=manipulate)
  40. def stripLayers(layername):
  41. def _inner(tree):
  42. for e in tree.xpath('//svg:g[not(@id="layer3")]', namespaces=NS_MAP):
  43. e.getparent().remove(e)
  44. return _inner
  45. p = tree.xpath('//svg:g/svg:path', namespaces=NS_MAP)[0]
  46. p.attrib['style'] = 'fill:#FFFFFF;'
  47. if __name__ == '__main__':
  48. app = QtGui.QApplication(sys.argv)
  49. svg2png('umic.svg', 'out.png', manipulate=stripLayers('asd'))