brightness_contrast_dialog.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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(
  30. img.tobytes(), img.width, img.height, img.width * 3, QImage.Format_RGB888
  31. )
  32. self.callback(qimage)
  33. def _create_slider(self):
  34. slider = QtWidgets.QSlider(Qt.Horizontal)
  35. slider.setRange(0, 3 * self._base_value)
  36. slider.setValue(self._base_value)
  37. slider.valueChanged.connect(self.onNewValue)
  38. value_label = QtWidgets.QLabel(f"{slider.value() / self._base_value:.2f}")
  39. slider.valueChanged.connect(
  40. lambda value: value_label.setText(f"{value / self._base_value:.2f}")
  41. )
  42. layout = QtWidgets.QHBoxLayout()
  43. layout.addWidget(slider)
  44. layout.addWidget(value_label)
  45. widget = QtWidgets.QWidget()
  46. widget.setLayout(layout)
  47. return slider, widget