brightness_contrast_dialog.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import PIL.Image
  2. import PIL.ImageEnhance
  3. from qtpy import QtWidgets
  4. from qtpy.QtCore import Qt
  5. from qtpy.QtGui import QImage
  6. class BrightnessContrastDialog(QtWidgets.QDialog):
  7. def __init__(self, img, callback, parent=None):
  8. super(BrightnessContrastDialog, self).__init__(parent)
  9. self.setModal(True)
  10. self.setWindowTitle("Brightness/Contrast")
  11. self.slider_brightness, widget_brightness = self._create_slider()
  12. self.slider_contrast, widget_contrast = self._create_slider()
  13. form_layout = QtWidgets.QFormLayout()
  14. form_layout.addRow(self.tr("Brightness"), widget_brightness)
  15. form_layout.addRow(self.tr("Contrast"), widget_contrast)
  16. self.setLayout(form_layout)
  17. assert isinstance(img, PIL.Image.Image)
  18. self.img = img
  19. self.callback = callback
  20. def onNewValue(self, _):
  21. brightness = self.slider_brightness.value() / 50.0
  22. contrast = self.slider_contrast.value() / 50.0
  23. img = self.img
  24. if brightness != 1:
  25. img = PIL.ImageEnhance.Brightness(img).enhance(brightness)
  26. if contrast != 1:
  27. img = PIL.ImageEnhance.Contrast(img).enhance(contrast)
  28. qimage = QImage(img.tobytes(), img.width, img.height, QImage.Format_RGB888)
  29. self.callback(qimage)
  30. def _create_slider(self):
  31. slider = QtWidgets.QSlider(Qt.Horizontal)
  32. slider.setRange(0, 150)
  33. slider.setValue(50)
  34. slider.valueChanged.connect(self.onNewValue)
  35. value_label = QtWidgets.QLabel(f"{slider.value() / 50:.2f}")
  36. slider.valueChanged.connect(
  37. lambda value: value_label.setText(f"{value / 50:.2f}")
  38. )
  39. layout = QtWidgets.QHBoxLayout()
  40. layout.addWidget(slider)
  41. layout.addWidget(value_label)
  42. widget = QtWidgets.QWidget()
  43. widget.setLayout(layout)
  44. return slider, widget