brightness_contrast_dialog.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. sliders = {}
  13. layouts = {}
  14. for title in ["Brightness:", "Contrast:"]:
  15. layout = QtWidgets.QHBoxLayout()
  16. title_label = QtWidgets.QLabel(self.tr(title))
  17. title_label.setFixedWidth(75)
  18. layout.addWidget(title_label)
  19. #
  20. slider = QtWidgets.QSlider(Qt.Horizontal)
  21. slider.setRange(0, 3 * self._base_value)
  22. slider.setValue(self._base_value)
  23. layout.addWidget(slider)
  24. #
  25. value_label = QtWidgets.QLabel(f"{slider.value() / self._base_value:.2f}")
  26. value_label.setAlignment(Qt.AlignRight)
  27. layout.addWidget(value_label)
  28. #
  29. slider.valueChanged.connect(self.onNewValue)
  30. slider.valueChanged.connect(
  31. lambda: value_label.setText(f"{slider.value() / self._base_value:.2f}")
  32. )
  33. layouts[title] = layout
  34. sliders[title] = slider
  35. self.slider_brightness = sliders["Brightness:"]
  36. self.slider_contrast = sliders["Contrast:"]
  37. del sliders
  38. layout = QtWidgets.QVBoxLayout()
  39. layout.addLayout(layouts["Brightness:"])
  40. layout.addLayout(layouts["Contrast:"])
  41. del layouts
  42. self.setLayout(layout)
  43. assert isinstance(img, PIL.Image.Image)
  44. self.img = img
  45. self.callback = callback
  46. def onNewValue(self, _):
  47. brightness = self.slider_brightness.value() / self._base_value
  48. contrast = self.slider_contrast.value() / self._base_value
  49. img = self.img
  50. if brightness != 1:
  51. img = PIL.ImageEnhance.Brightness(img).enhance(brightness)
  52. if contrast != 1:
  53. img = PIL.ImageEnhance.Contrast(img).enhance(contrast)
  54. qimage = QImage(
  55. img.tobytes(), img.width, img.height, img.width * 3, QImage.Format_RGB888
  56. )
  57. self.callback(qimage)