Beispiel #1
0
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
Beispiel #2
0
 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
Beispiel #3
0
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)
Beispiel #5
0
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
Beispiel #7
0
    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)
Beispiel #8
0
 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)
Beispiel #9
0
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.'))