from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QApplication, QWidget,
QVBoxLayout, QHBoxLayout,
QPushButton, QLabel,
QListWidget, QFileDialog)
from PyQt5.QtGui import QPixmap
from functools import partial
import os
from PIL import Image, ImageOps
app = QApplication([])
window = QWidget()
window.setWindowTitle("Редактор")
window.setFixedSize(700, 400) # resize(700, 400)
lb_image = QLabel("Картинка")
btn_dir = QPushButton("Папка")
lw_files = QListWidget()
btn_left = QPushButton("Лево")
btn_right = QPushButton("Право")
btn_flip = QPushButton("Зеркало")
btn_sharp = QPushButton("Резкость")
btn_bw = QPushButton("Ч/Б")
btn_save = QPushButton("Сохранить")
btn_reset = QPushButton("Сброс")
row = QHBoxLayout()
col1 = QVBoxLayout()
col2 = QVBoxLayout()
row1_tools = QHBoxLayout()
row2_tools = QHBoxLayout()
col1.addWidget(btn_dir)
col1.addWidget(lw_files)
col2.addWidget(lb_image, stretch=95)
row1_tools.addWidget(btn_left)
row1_tools.addWidget(btn_right)
row1_tools.addWidget(btn_flip)
row1_tools.addWidget(btn_sharp)
row1_tools.addWidget(btn_bw)
row2_tools.addWidget(btn_save)
row2_tools.addWidget(btn_reset)
col2.addLayout(row1_tools)
col2.addLayout(row2_tools)
row.addLayout(col1, stretch=20)
row.addLayout(col2, stretch=80)
window.setLayout(row)
# from PIL import Image
class ImageProcessor():
def __init__(self):
self.image = None
self.dir = None
self.filename = None
self.save_dir = "Modified/"
def load_image(self, dir, filename):
self.dir = dir
self.filename = filename
image_path = os.path.join(dir, filename) # Downloads/original.jpg
self.image = Image.open(image_path)
def show_image(self, path):
lb_image.hide()
pixmapimage = QPixmap(path)
w, h = lb_image.width(), lb_image.height()
pixmapimage = pixmapimage.scaled(w, h, Qt.KeepAspectRatio)
lb_image.setPixmap(pixmapimage)
lb_image.show()
def do_bw(self):
self.image = ImageOps.grayscale(self.image)
self.save_image()
image_path = os.path.join(self.dir, self.save_dir, self.filename)
self.show_image(image_path)
def save_image(self):
path = os.path.join(self.dir, self.save_dir)
if not (os.path.exists(path) or os.path.isdir(path)):
os.mkdir(path)
image_path = os.path.join(path, self.filename)
self.image.save(image_path)
workimage = ImageProcessor()
def show_chosen_image(workdir, index):
if index >= 0:
filename = lw_files.currentItem().text()
workimage.load_image(workdir, filename)
image_path = os.path.join(workimage.dir, workimage.filename)
workimage.show_image(image_path)
def choose_workdir():
try:
workdir = QFileDialog.getExistingDirectory()
if workdir:
return workdir
else:
print("Папка не выбрана")
return None
except:
return None
def filter(files):
result = []
extension = [".png", ".jpg", ".jpeg", ".gif", ".bmp"]
for file in files:
for ext in extension:
if file.endswith(ext): # endswith("original.jpg") -> .jpg -> []
result.append(file)
return result
def show_filenames():
dir = choose_workdir()
files = filter(os.listdir(dir)) # ["name.docs", "1.xlsx", "2.pptx", "original.jpg"]
lw_files.clear()
for file in files:
lw_files.addItem(file)
lw_files.currentRowChanged.connect(partial(show_chosen_image, dir))
btn_bw.clicked.connect(workimage.do_bw)
btn_dir.clicked.connect(show_filenames)
window.show()
app.exec_()