studia/jezyki-skryptowe/image-editor/editor/dialogs/HCLDialog.py

71 lines
2.4 KiB
Python

import numpy as np
from PyQt6.QtWidgets import QLabel, QVBoxLayout, QSlider
from PyQt6.QtCore import Qt
import ImageProcessingWorker
from .ImageParameterDialog import ImageParameterDialog
class HCLDialog(ImageParameterDialog):
def __init__(self, image):
super().__init__(image, ImageProcessingWorker.HLSImageProcessingWorker)
self.setWindowTitle("HCL Correction")
self.layout = QVBoxLayout()
self.hue_slider = QSlider(Qt.Orientation.Horizontal)
self.hue_slider.setRange(-180, 180)
self.chroma_slider = QSlider(Qt.Orientation.Horizontal)
self.chroma_slider.setRange(-100, 100)
self.lightness_slider = QSlider(Qt.Orientation.Horizontal)
self.lightness_slider.setRange(-100, 100)
self.label1 = QLabel("Hue: 0")
self.label2 = QLabel("Chroma: 0")
self.label3 = QLabel("Lightness: 0")
self.hue_slider.valueChanged.connect(lambda value: self.update(self.label1, value, "Hue"))
self.chroma_slider.valueChanged.connect(lambda value: self.update(self.label2, value, "Chroma"))
self.lightness_slider.valueChanged.connect(lambda value: self.update(self.label3, value, "Lightness"))
self.layout.addWidget(self.label1)
self.layout.addWidget(self.hue_slider)
self.layout.addWidget(self.label2)
self.layout.addWidget(self.chroma_slider)
self.layout.addWidget(self.label3)
self.layout.addWidget(self.lightness_slider)
self.layout.addWidget(self.button_box)
self.setLayout(self.layout)
def update(self, label, value, slider_name):
label.setText(f"{slider_name}: {value}")
self.send_to_process({
'hue': self.hue_slider.value(),
'chroma': self.chroma_slider.value() / 100.0,
'lightness': self.lightness_slider.value() / 100.0
})
def process_image(self,image, values):
hue = values.get('hue', 0.0) / 2
chroma = values.get('chroma', 0.0)
lightness = values.get('lightness', 0.0)
image[..., 0] = (image[..., 0] + hue) % 180
image[..., 1] += (255 * lightness)
image[..., 1] = np.clip(image[..., 1], 0, 255)
image[..., 2] += (255 * chroma)
image[..., 2] = np.clip(image[..., 2], 0, 255)
return image
@classmethod
def dialog_name(cls):
return "Hue-Chroma-Lightness"