brightness_contrast_dialog.py 2.0 KB

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