Основная проблема в коде OP заключается в том, что он не обновил показанное изображение. Например, если документы проверяются, подразумевается, что метод расширения возвращает измененное изображение, но не сохраняется и не отображается.
С другой стороны, применение изменений должно быть каскадным (одно после other).
Существуют также ошибки, такие как не проверка того, что имя файла является пустой строкой, кроме того, что нажатый сигнал связан с завершением работы, а не с возвращаемой оцененной функцией.
Учитывая вышеизложенное, решение:
from PIL.ImageQt import Image, ImageQt
from PIL import ImageEnhance
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import (
QApplication,
QDialog,
QGridLayout,
QLabel,
QPushButton,
QGroupBox,
QSlider,
QVBoxLayout,
QFileDialog,
)
class MainWindow(QDialog):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.createTopGroupBox()
self.createBottomGroupBox()
mainLayout = QGridLayout(self)
mainLayout.addWidget(self.topGroupBox, 0, 0)
mainLayout.addWidget(self.bottomGroupBox, 1, 0)
self.setWindowTitle("Photo Editor")
self.resize(800, 800)
self.input_image = None
self.output_image = None
def createTopGroupBox(self):
self.topGroupBox = QGroupBox()
openImgButton = QPushButton("Open Image")
openImgButton.clicked.connect(self.getImage)
self.label = QLabel("Your Photo")
layout = QVBoxLayout()
layout.addWidget(openImgButton)
layout.addWidget(self.label)
layout.addStretch(1)
self.topGroupBox.setLayout(layout)
def getImage(self):
fname, _ = QFileDialog.getOpenFileName(
self, "Open file", "", "Image files (*.jpeg *.jpg *.gif *.bmp *.png)"
)
if fname:
self.input_image = Image.open(fname)
self.show_image(self.input_image)
def show_image(self, image):
qimage = ImageQt(image)
self.label.setPixmap(QPixmap.fromImage(qimage))
def createBottomGroupBox(self):
self.bottomGroupBox = QGroupBox()
self.sliderBrightness = QSlider(
Qt.Horizontal,
tickPosition=QSlider.TicksBelow,
tickInterval=1,
value=100,
minimum=0,
maximum=200,
)
brightnessLabel = QLabel("Brightness:")
brightnessLabel.setBuddy(self.sliderBrightness)
self.brightnessValueLabel = QLabel()
self.brightnessValueLabel.setNum(self.sliderBrightness.value())
self.sliderContrast = QSlider(Qt.Horizontal, value=1, minimum=0, maximum=2)
contrastLabel = QLabel("Contrast:")
contrastLabel.setBuddy(self.sliderContrast)
self.contrastValueLabel = QLabel()
self.contrastValueLabel.setNum(self.sliderContrast.value())
self.sliderSharpness = QSlider(Qt.Horizontal, value=1, minimum=0, maximum=2)
sharpnessLabel = QLabel("Sharpness:")
sharpnessLabel.setBuddy(self.sliderSharpness)
self.sharpnessValueLabel = QLabel()
self.sharpnessValueLabel.setNum(self.sliderSharpness.value())
savePushButton = QPushButton("Save")
savePushButton.clicked.connect(lambda: self.saveImage("image.png", "PNG"))
self.sliderBrightness.valueChanged.connect(self.update_image)
self.sliderContrast.valueChanged.connect(self.update_image)
self.sliderSharpness.valueChanged.connect(self.update_image)
layout = QVBoxLayout()
layout.addWidget(brightnessLabel)
layout.addWidget(self.sliderBrightness)
layout.addWidget(self.brightnessValueLabel)
layout.addWidget(contrastLabel)
layout.addWidget(self.sliderContrast)
layout.addWidget(self.contrastValueLabel)
layout.addWidget(sharpnessLabel)
layout.addWidget(self.sliderSharpness)
layout.addWidget(self.sharpnessValueLabel)
layout.addWidget(savePushButton)
self.bottomGroupBox.setLayout(layout)
def saveImage(self, fileName, fileFormat):
if self.output_image is not None:
self.output_image.save(fileName, fileFormat)
def update_image(self):
if self.input_image is not None:
factor_brightness = self.sliderBrightness.value() / 100.0
factor_contrast = self.sliderContrast.value()
factor_sharpness = self.sliderSharpness.value()
enhancer_object = ImageEnhance.Brightness(self.input_image)
image = enhancer_object.enhance(factor_brightness)
enhancer_object = ImageEnhance.Contrast(image)
image = enhancer_object.enhance(factor_contrast)
enhancer_object = ImageEnhance.Sharpness(image)
self.output_image = enhancer_object.enhance(factor_sharpness)
self.show_image(self.output_image)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())