Esempio n. 1
0
    def __init__(self, window):
        super(View, self).__init__(window)

        self.setFocusPolicy(Qt.StrongFocus)
        self.shiftKey = False
        self.ctrlKey = False
        self.lastMousePos = QPoint()
        self.lastTabletPos = QPoint()
        self.mode = 'add'
        self.maskOnly = False

        self.refresh = QTimer(self)
        self.refresh.setSingleShot(True)
        self.refresh.timeout.connect(self.repaint)

        self.addCursor = makeCursor('images/cursor-add.png',
                                    QColor.fromRgbF(0.5, 0.5, 1.0))
        self.delCursor = makeCursor('images/cursor-del.png',
                                    QColor.fromRgbF(1.0, 0.5, 0.5))
        self.setCursor(self.addCursor)

        self.imagefile = None
        self.maskfile = None
        self.image = QImage()
        self.mask = QImage(self.image.size(), QImage.Format_RGB32)
        self.mask.fill(Qt.black)
        self.changed = False
        self.update()

        self.path = list()

        self.load_threads = QThreadPool()
        self.load_threads.setMaxThreadCount(4)
Esempio n. 2
0
    def __init__(self, parent=None):
        QOpenGLWidget.__init__(self, parent)
        QOpenGLFunctions.__init__(self)
        self.setMinimumSize(32, 32)

        self.info = ""
        self._supported_images = [
            "TGA", "PNG", "JPG", "JPEG", "TIF", "TIFF", "BMP", "DDS"
        ]

        # indices
        indices = [0, 1, 3, 1, 2, 3]
        self._indices = array('I', indices)

        # vertices
        # 3 position | 2 texture coord
        vertex = [
            1.0,
            1.0,
            0.0,
            1.0,
            1.0,  # top right
            1.0,
            -1.0,
            0.0,
            1.0,
            0.0,  # bottom right
            -1.0,
            -1.0,
            0.0,
            0.0,
            0.0,  # bottom left
            -1.0,
            1.0,
            0.0,
            0.0,
            1.0  # top left
        ]
        self._vertex = array('f', vertex)

        # opengl data related
        self._program = QOpenGLShaderProgram()
        self._program_bg = QOpenGLShaderProgram()
        self._vao = QOpenGLVertexArrayObject()
        self._vbo = QOpenGLBuffer(QOpenGLBuffer.VertexBuffer)
        self._texture = None
        self._texture_size = (1, 1)
        self._location = ()

        self._colors_default = (QColor.fromRgbF(0.65, 0.65, 0.65, 1.0),
                                QColor.fromRgbF(0.90, 0.90, 0.90, 1.0))
        self._u_colors = self._colors_default
        self._height = QVector4D(0, self.height(), 0, 0)

        self._u_channels = QMatrix4x4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0,
                                      0, 0)
Esempio n. 3
0
 def refreshItems(self):
     filenames = sorted(self.items.keys())
     for i in range(len(filenames)):
         filename = filenames[i]
         item = self.items[filename]
         file = self.files.item(i)
         if not file:
             file = QListWidgetItem(filenames[i])
             self.files.insertItem(i, file)
         if item['active']:
             file.setTextColor(QColor.fromRgbF(0.0, 0.5, 0.0))
         else:
             file.setTextColor(QColor.fromRgbF(0.5, 0.0, 0.0))
     while self.files.count() > len(filenames):
         self.files.takeItem(len(filenames))
Esempio n. 4
0
    def run(self):
        image = QImage()
        image.load(str(self.filename))

        mask = QImage(image.size(), QImage.Format_RGB32)
        mask.fill(Qt.black)

        maskfile = self.filename.parent / (self.filename.stem + ".mask")
        if maskfile.exists():
            bitmap = QImage(str(maskfile))
            if bitmap.size() != image.size():
                raise Exception("Mask %s doesn't match image size" % maskfile)
            mask.fill(QColor.fromRgbF(1.0, 0.0, 1.0))
            p = QPainter(mask)
            p.setCompositionMode(QPainter.CompositionMode_Multiply)
            p.drawImage(mask.rect(), bitmap)
            p.end()

        self.view.imagefile = self.filename
        self.view.image = image
        self.view.mask = mask
        self.view.maskfile = maskfile

        self.view.path = list()
        self.view.changed = False
        self.view.update()
Esempio n. 5
0
 def save(self):
     if self.maskfile and self.changed:
         self.load_threads.waitForDone()
     if self.maskfile and self.changed:
         bitmap = self.mask.createMaskFromColor(
             QColor.fromRgbF(1.0, 0.0, 1.0).rgb())
         bitmap.save(str(self.maskfile), "PNG")
         self.changed = False
def qcolor_linear_to_srgb(color):
    """
    Converts linear color value to sRGB color value
    :type color: QColor
    :param color: the linear color to convert
    :rtype: QColor
    :return: the calculated sRGB color
    """
    r, g, b, _ = color.getRgbF()
    r = linear_to_srgb(r)
    g = linear_to_srgb(g)
    b = linear_to_srgb(b)
    return QColor.fromRgbF(r, g, b)
def qcolor_srgb_to_linear(color):
    """
    Converts sRGB color value to linear color value
    :type color: QColor
    :param color: the sRGB color to convert
    :rtype: QColor
    :return: the calculated linear color
    """
    r, g, b, _ = color.getRgbF()
    r = srgb_to_linear(r)
    g = srgb_to_linear(g)
    b = srgb_to_linear(b)
    return QColor.fromRgbF(r, g, b)
Esempio n. 8
0
    def paintEvent(self, event):
        p = QPainter(self.mask)
        for (mode, p1, p2, weight) in self.path:
            if mode == 'add':
                p.setPen(
                    QPen(QColor.fromRgbF(1.0, 0.0, 1.0), (weight * 10.0)**2,
                         Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
            else:
                p.setPen(
                    QPen(QColor.fromRgbF(0.0, 0.0, 0.0), (weight * 10.0)**2,
                         Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
            p.drawLine(realCoords(p1, self.mask.rect()),
                       realCoords(p2, self.mask.rect()))
            self.changed = True
        self.path = list()
        p.end()

        p = QPainter(self)
        p.setCompositionMode(QPainter.CompositionMode_SourceOver)
        if not self.maskOnly:
            p.drawImage(self.rc, self.image)
            p.setCompositionMode(QPainter.CompositionMode_Plus)
        p.drawImage(self.rc, self.mask)
        p.end()
Esempio n. 9
0
 def setUp(self):
     self.original = QColor.fromRgbF(0.2, 0.3, 0.4, 0.5)
 def testReduceRGB(self):
     self.reduceColor(QColor.fromRgbF(0.1, 0.2, 0.3, 0.4))
Esempio n. 11
0
 def setUp(self):
     self.original = QColor.fromRgbF(0.2, 0.3, 0.4, 0.5)
Esempio n. 12
0
 def testReduceRGB(self):
     self.reduceColor(QColor.fromRgbF(0.1, 0.2, 0.3, 0.4))
    def updateColor(self, color: QColor, value: float, percent: float) -> None:
        item: ColorPanelBar = self.sender()
        index: int = self.__items.index(item)

        if index is 0:
            # 获取当前HSB处的颜色值
            self.__items[1].topColor = color
            self.__items[2].topColor = color
            self.__items[1].borderColor = color
            self.__items[2].borderColor = color
        elif index is 1:
            self.__items[2].topColor = color
            self.__items[2].borderColor = color
        elif index is 2:
            self.__items[1].topColor = color
            self.__items[1].borderColor = color
        elif index == 3:
            self.__items[6].percent = 100 - percent
        elif index == 4:
            self.__items[7].percent = 100 - percent
        elif index == 5:
            self.__items[8].percent = 100 - percent
        elif index == 6:
            self.__items[3].percent = 100 - percent
        elif index == 7:
            self.__items[4].percent = 100 - percent
        elif index == 8:
            self.__items[5].percent = 100 - percent

        # 如果是HSB变化则CMY和RGB变化
        if index < 3:
            hue: float = self.__items[0].percent / 100
            sat: float = self.__items[1].percent / 100
            bright: float = self.__items[2].percent / 100

            # 组合HSB当前值,然后转为CMY和RGB计算百分比进行设置
            color: QColor = QColor.fromHsvF(hue, sat, bright)
            percentRed: float = color.redF() * 100
            percentGreen: float = color.greenF() * 100
            percentBlue: float = color.blueF() * 100

            self.__items[3].percent = 100 - percentRed
            self.__items[4].percent = 100 - percentGreen
            self.__items[5].percent = 100 - percentBlue
            self.__items[6].percent = percentRed
            self.__items[7].percent = percentGreen
            self.__items[8].percent = percentBlue

        # 根据百分比获取颜色值
        red: float = self.__items[6].percent / 100
        green: float = self.__items[7].percent / 100
        blue: float = self.__items[8].percent / 100
        currentColor: QColor = QColor.fromRgbF(red, green, blue)
        self.colorChanged.emit(currentColor, self.__items[0].value,
                               self.__items[1].percent,
                               self.__items[2].percent)

        # 如果是CMY或者RGB变化则HSB变化
        if index >= 3:
            # hue活出现负数=白色,要矫正
            percentHue: float = currentColor.hueF() * 100
            if percentHue < 0:
                percentHue = 0

            percentSat: float = currentColor.saturationF() * 100
            percentBright: float = currentColor.lightnessF() * 100

            # 计算当前值所占百分比
            self.__items[0].percent = percentHue
            self.__items[1].percent = percentSat
            self.__items[2].percent = percentBright

            self.__items[1].topColor = currentColor
            self.__items[2].topColor = currentColor
            self.__items[1].borderColor = currentColor
            self.__items[2].borderColor = currentColor