コード例 #1
0
ファイル: pictures.py プロジェクト: Dan-Eli/test_action
    def colorize_picture(picture, color):
        """
        Applies a color overlay to a picture, emulating the ArcMap
        results
        """
        if issubclass(picture.__class__, StdPicture):
            picture = picture.picture

        image = QImage()
        image.loadFromData(picture.content)
        if image.isNull():
            raise UnreadablePictureException('Could not read embedded picture data')

        image = image.convertToFormat(QImage.Format_ARGB32)
        ucharptr = image.bits()
        ucharptr.setsize(image.byteCount() * image.height())

        # assume top left pixel is transparent?
        c = image.pixelColor(0, 0)
        trans_rgba = qRgba(c.red(), c.green(), c.blue(), c.alpha())
        actual_trans_rgba = qRgba(c.red(), c.green(), c.blue(), 0)

        for y in range(image.height()):
            start = y * image.width() * 4
            for x in range(image.width()):
                x_start = x * 4 + start
                rgba = struct.unpack('I', ucharptr[x_start:x_start + 4])[0]

                if rgba == trans_rgba:
                    ucharptr[x_start:x_start + 4] = struct.pack('I', actual_trans_rgba)

        if color is None or color.is_null:
            return image

        fg_color = ColorConverter.color_to_qcolor(color)
        if not fg_color.isValid():
            return image

        alpha = QImage(image)
        image.detach()
        p = QPainter(image)
        p.setCompositionMode(QPainter.CompositionMode_SourceIn)
        p.setBrush(fg_color)
        p.drawRect(image.rect())
        p.setCompositionMode(QPainter.CompositionMode_Multiply)
        p.drawImage(0, 0, alpha)
        p.end()
        return image
コード例 #2
0
ファイル: pictures.py プロジェクト: nyalldawson/slyr
    def colorize_picture_data(data, color: QColor, fix_alpha=True):
        """
        Colorizes picture data
        """
        image = QImage()
        image.loadFromData(data)
        if image.isNull():
            raise UnreadablePictureException('Could not read embedded picture data')

        image = image.convertToFormat(QImage.Format_ARGB32)
        ucharptr = image.bits()
        ucharptr.setsize(image.byteCount() * image.height())

        # assume top left pixel is transparent?
        if fix_alpha:
            c = image.pixelColor(0, 0)
            trans_rgba = qRgba(c.red(), c.green(), c.blue(), c.alpha())
            actual_trans_rgba = qRgba(c.red(), c.green(), c.blue(), 0)

            for y in range(image.height()):
                start = y * image.width() * 4
                for x in range(image.width()):
                    x_start = x * 4 + start
                    rgba = struct.unpack('I', ucharptr[x_start:x_start + 4])[0]

                    if rgba == trans_rgba:
                        ucharptr[x_start:x_start + 4] = struct.pack('I', actual_trans_rgba)

        if not color.isValid():
            return image

        alpha = QImage(image)
        image.detach()
        p = QPainter(image)
        p.setCompositionMode(QPainter.CompositionMode_SourceIn)
        p.setBrush(color)
        p.drawRect(image.rect())
        p.setCompositionMode(QPainter.CompositionMode_Multiply)
        p.drawImage(0, 0, alpha)
        p.end()
        return image