PyQt5 - Non Linear Gradients - What is best way to implement?

I converted the best I could for Python and I got something like this:

def UVD_Color(self, rgb_d):
    # Measures
    self.uvd_width = self.layout.panel_uvd_mask.width()
    self.uvd_height = self.layout.panel_uvd_mask.height()
    w2 = 0.5 * self.uvd_width
    h2 = 0.5 * self.uvd_height
    # Black Base Image
    image = QImage(self.uvd_width, self.uvd_height, QImage.Format_ARGB32_Premultiplied)
    image.fill(QColor(0,0,0))
    # Painter
    painter = QPainter(image)
    painter.begin(image)
    painter.setCompositionMode(QPainter.CompositionMode_Plus)
    # Gradient Variables
    diag = self.uvd_3 * 3
    if diag <= 0:
        # RED
        gradient_red = QLinearGradient(self.P45[0],self.P45[1], self.P12[0],self.P12[1])
        gradient_red.setColorAt(0.0, QColor(0,0,0,255))
        gradient_red.setColorAt(1.0, QColor(0,0,0,0))
        # GREEN
        gradient_green = QLinearGradient(self.P23[0],self.P23[1], self.P56[0],self.P56[1])
        gradient_green.setColorAt(0.0, QColor(0,0,0,255))
        gradient_green.setColorAt(1.0, QColor(0,0,0,0))
        # BLUE
        gradient_blue = QLinearGradient(self.P61[0],self.P61[1], self.P34[0],self.P34[1])
        gradient_blue.setColorAt(0.0, QColor(0,0,0,255))
        gradient_blue.setColorAt(1.0, QColor(0,0,0,0))
    if (diag > 0 and diag < 1):
        v=diag*255
        # RED
        gradient_red = QLinearGradient(self.P45[0],self.P45[1], self.P12[0],self.P12[1])
        gradient_red.setColorAt(0.0, QColor(v,0,0,255))
        gradient_red.setColorAt(1.0, QColor(0,0,0,255))
        # GREEN
        gradient_green = QLinearGradient(self.P23[0],self.P23[1], self.P56[0],self.P56[1])
        gradient_green.setColorAt(0.0, QColor(0,v,0,255))
        gradient_green.setColorAt(1.0, QColor(0,0,0,255))
        # BLUE
        gradient_blue = QLinearGradient(self.P61[0],self.P61[1], self.P34[0],self.P34[1])
        gradient_blue.setColorAt(0.0, QColor(0,0,v,255))
        gradient_blue.setColorAt(1.0, QColor(0,0,0,255))
    if (diag >= 1 and diag <= 2):
        # RED
        gradient_red = QLinearGradient(self.P45[0],self.P45[1], self.P12[0],self.P12[1])
        gradient_red.setColorAt(0.0, QColor(255,0,0,255))
        gradient_red.setColorAt(1.0, QColor(0,0,0,0))
        # GREEN
        gradient_green = QLinearGradient(self.P23[0],self.P23[1], self.P56[0],self.P56[1])
        gradient_green.setColorAt(0.0, QColor(0,255,0,255))
        gradient_green.setColorAt(1.0, QColor(0,0,0,0))
        # BLUE
        gradient_blue = QLinearGradient(self.P61[0],self.P61[1], self.P34[0],self.P34[1])
        gradient_blue.setColorAt(0.0, QColor(0,0,255,255))
        gradient_blue.setColorAt(1.0, QColor(0,0,0,0))
    if (diag > 2 and diag < 3):
        v=(diag-2)*255
        # RED
        gradient_red = QLinearGradient(self.P45[0],self.P45[1], self.P12[0],self.P12[1])
        gradient_red.setColorAt(0.0, QColor(255,0,0,255))
        gradient_red.setColorAt(1.0, QColor(v,0,0,255))
        # GREEN
        gradient_green = QLinearGradient(self.P23[0],self.P23[1], self.P56[0],self.P56[1])
        gradient_green.setColorAt(0.0, QColor(0,255,0,255))
        gradient_green.setColorAt(1.0, QColor(0,v,0,255))
        # BLUE
        gradient_blue = QLinearGradient(self.P61[0],self.P61[1], self.P34[0],self.P34[1])
        gradient_blue.setColorAt(0.0, QColor(0,0,255,255))
        gradient_blue.setColorAt(1.0, QColor(0,0,v,255))
    if diag >= 3:
        # RED
        gradient_red = QLinearGradient(self.P45[0],self.P45[1], self.P12[0],self.P12[1])
        gradient_red.setColorAt(0.0, QColor(255,255,255,255))
        gradient_red.setColorAt(1.0, QColor(0,0,0,0))
        # GREEN
        gradient_green = QLinearGradient(self.P23[0],self.P23[1], self.P56[0],self.P56[1])
        gradient_green.setColorAt(0.0, QColor(255,255,255,255))
        gradient_green.setColorAt(1.0, QColor(0,0,0,0))
        # BLUE
        gradient_blue = QLinearGradient(self.P61[0],self.P61[1], self.P34[0],self.P34[1])
        gradient_blue.setColorAt(0.0, QColor(255,255,255,255))
        gradient_blue.setColorAt(1.0, QColor(0,0,0,0))
    # Paint the Gradients
    painter.setBrush(QBrush(gradient_red))
    painter.drawRect(0,0, self.uvd_width,self.uvd_height)
    painter.setBrush(QBrush(gradient_green))
    painter.drawRect(0,0, self.uvd_width,self.uvd_height)
    painter.setBrush(QBrush(gradient_blue))
    painter.drawRect(0,0, self.uvd_width,self.uvd_height)
    # End the Painter
    painter.end()
    # Place image on Widget
    self.layout.panel_uvd_input.setPixmap(QPixmap(image))

And it is extremely fast. i am actually stunned.

I think I will be able to set it to update in real time with it so it works like the other panels.
Thank you for pointing me this method.

1 Like