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)
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)
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))
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()
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)
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()
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))
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))
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