def svg_to_image(string, size=None): """ Convert a SVG document to a QImage. Parameters ---------- string : basestring A Python string containing a SVG document. size : QSize, optional The size of the image that is produced. If not specified, the SVG document's default size is used. Raises ------ ValueError If an invalid SVG string is provided. Returns ------- A QImage of format QImage.Format_ARGB32. """ if isinstance(string, unicode_type): string = string.encode('utf-8') renderer = QtSvg.QSvgRenderer(QtCore.QByteArray(string)) if not renderer.isValid(): raise ValueError('Invalid SVG data.') if size is None: size = renderer.defaultSize() image = QtGui.QImage(size, QtGui.QImage.Format_ARGB32) image.fill(0) painter = QtGui.QPainter(image) renderer.render(painter) return image
def _get_default_size(self): """Get dfault size of SVG image.""" size = QSize() if self._path: item = QtSvg.QGraphicsSvgItem(self._path) size = item.renderer().defaultSize() return size
def load_cursor(filename, hotX=-1, hotY=-1): renderer = QtSvg.QSvgRenderer(filename) pm = QtGui.QPixmap(16, 16) pm.fill(QtCore.Qt.transparent) painter = QtGui.QPainter(pm) renderer.render(painter) del painter, renderer return QtGui.QCursor(pm, hotX, hotY)
def addFile(self, fileName, size, mode, state): if fileName: abs = fileName if fileName[0] != ':': abs = QtCore.QFileInfo(fileName).absoluteFilePath() al = abs.lower() if (al.endswith(".svg") or al.endswith(".svgz") or al.endswith(".svg.gz")): renderer = QtSvg.QSvgRenderer(abs) if renderer.isValid(): self._svgFiles[(mode, state)] = abs else: pm = QtGui.QPixmap(abs) if pm is not None: self.addPixmap(pm, mode, state)
def svg_to_np_qt(svg_bytestring, size): """ Renders a svg bytestring as a RGB image in a numpy array However, the QT backend seems to have some issues """ if isinstance(svg_bytestring, str): svg_bytestring = bytes(svg_bytestring, 'ascii') ren = QtSvg.QSvgRenderer(svg_bytestring) assert ren.isValid(), "SVG rendering failed" qimg = QtGui.QImage( size[0], size[1], QtGui.QImage.Format_RGB32) # QtGui.QImage.Format_ARGB32_Premultiplied) # TODO colors is wrong - maybe see https://doc.qt.io/qt-5/qimage.html # raise NotImplementedError #TODO handle size/dpi imagePainter = QtGui.QPainter(qimg) ren.render(imagePainter) imagePainter.end() arr = qimage2ndarray.byte_view(qimg) return arr
def pixmap(self, size, mode, state): # Check if the palette has changed (if so invalidate cache) if self._palette_key != QtWidgets.QApplication.palette().cacheKey(): QtGui.QPixmapCache.clear() self._set_replacements_from_palette() pmckey = self._make_cache_key(size, mode, state) pm = QtGui.QPixmapCache.find(pmckey) if pm: return pm if (mode, state) in self._addedPixmaps: pm = self._addedPixmaps[(mode, state)] if pm is not None and pm.size() == size: return pm renderer = QtSvg.QSvgRenderer() self._loadDataForModeAndState(renderer, mode, state) if not renderer.isValid(): return QtGui.QPixmap() actualSize = renderer.defaultSize() if actualSize is not None: actualSize.scale(size, QtCore.Qt.KeepAspectRatio) img = QtGui.QImage(actualSize, QtGui.QImage.Format_ARGB32_Premultiplied) img.fill(0x00000000) p = QtGui.QPainter(img) renderer.render(p) p.end() pm = QtGui.QPixmap.fromImage(img) opt = QtWidgets.QStyleOption() opt.palette = QtWidgets.QApplication.palette() if self.use_qt_disabled or mode != QtGui.QIcon.Disabled: generated = QtWidgets.QApplication.style().generatedIconPixmap(mode, pm, opt) if generated is not None: pm = generated if pm is not None: QtGui.QPixmapCache.insert(pmckey, pm) return pm
def onOpen(self): filters = [ self.tr('All files (*)'), ] filters.extend('{} file (*.{})'.format(str(f).upper(), str(f)) for f in QtGui.QImageReader.supportedImageFormats()) filename, filter_ = QtWidgets.QFileDialog.getOpenFileName( self, self.tr('Load picture'), QtCore.QDir.home().absolutePath(), ';;'.join(filters)) # , filters[1]) if filename: if '.svg' in filename: item = QtSvg.QGraphicsSvgItem(filename) else: image = QtGui.QImage(filename) item = QtWidgets.QGraphicsPixmapItem(image) item.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True) item.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True) self.scene.addItem(item)
def __init__(self, parent=None, icons=None): if icons is None or len(icons) < 1: icons = [] path = os.path.dirname(__file__) for fn in [ path + "/../images/visibility_on.svg", path + "/../images/visibility_off.svg" ]: renderer = QtSvg.QSvgRenderer(fn) pm = QtGui.QPixmap(12, 12) pm.fill(Qt.transparent) painter = QtGui.QPainter(pm) renderer.render(painter) icons.append(pm) icons = tuple(icons) elif len(icons) < 2: icons = tuple(icons) + (QtGui.QPixmap(), ) else: icons = tuple(icons) self.icons = icons self.margin = 2 super(VisbilityDelegate, self).__init__(parent)
def imgexport(obj, parent=None): filters = [ obj.tr('All files (*)'), obj.tr('Simple Vector Graphics file (*.svg)'), obj.tr('PDF file (*.pdf)'), obj.tr('PostScript file (*.ps)'), ] filters.extend('{} file (*.{})'.format(str(fmt).upper(), str(fmt)) for fmt in QtGui.QImageWriter.supportedImageFormats()) formats = { str(fmt).lower() for fmt in QtGui.QImageWriter.supportedImageFormats() } formats.update(('svg', 'pdf', 'ps')) # @TODO: check if parent is None: try: parent = obj.window() except AttributeError: parent = None target = os.path.join(utils.default_workdir(), 'image.jpeg') filename, filter_ = QtWidgets.QFileDialog.getSaveFileName( parent, obj.tr('Save picture'), target, ';;'.join(filters)) ext = 'unknown' while filename and (ext not in formats): ext = os.path.splitext(filename)[1] if ext: ext = ext[1:].lower() if ext in formats: break else: QtWidgets.QMessageBox.information( parent, obj.tr('Unknown file format'), obj.tr('Unknown file format "%s".\nPlease retry.') % ext) filename, filter_ = QtWidgets.QFileDialog.getSaveFileName( parent, obj.tr('Save draw'), filename, ';;'.join(filters), filter_) else: ext = 'unknown' if filename: if hasattr(obj, 'viewport'): srcsize = obj.viewport().rect().size() elif hasattr(obj, 'sceneRect'): # QGraphicsViews also has a viewport method so they should be # trapped by the previous check srcsize = obj.sceneRect().toRect().size() else: srcsize = QtWidgets.QSize(800, 600) if ext in ('pdf', 'ps'): device = QtPrintSupport.QPrinter( QtPrintSupport.QPrinter.HighResolution) device.setOutputFileName(filename) if ext == 'pdf': device.setOutputFormat(QtPrintSupport.QPrinter.PdfFormat) else: # ext == 'ps' device.setOutputFormat( QtPrintSupport.QPrinter.PostScriptFormat) elif ext == 'svg': device = QtSvg.QSvgGenerator() device.setFileName(filename) device.setSize(srcsize) # device.setViewBox(obj.sceneRect().toRect()) # device.setTitle(obj.tr('Graphics Draw')) # device.setDescription(obj.tr('Qt SVG drawing.')) else: device = QtGui.QPixmap(srcsize) # @TODO: check device.fill(QtCore.Qt.white) painter = QtGui.QPainter() if painter.begin(device): # painter.setRenderHint(QtGui.QPainter.Antialiasing) obj.render(painter) painter.end() if hasattr(device, 'save'): device.save(filename) else: QtWidgets.QMessageBox.warning( parent, obj.tr('Warning'), obj.tr('Unable initialize painting device.'))