import os
from PyQt5.QtWidgets import (
QApplication, QWidget,
QFileDialog, # Диалог открытия файлов (и папок)
QLabel, QPushButton, QListWidget,
QHBoxLayout, QVBoxLayout
)
from PyQt5.QtCore import Qt # нужна константа Qt.KeepAspectRatio для изменения размеров с сохранением пропорций
from PyQt5.QtGui import QPixmap # оптимизированная для показа на экране картинка
from PIL import Image
app = QApplication([])
win = QWidget()
win.resize(700, 500)
win.setWindowTitle('Easy Editor')
lb_image = QLabel("Картинка")
btn_dir = QPushButton("Папка")
lw_files = QListWidget()
btn_left = QPushButton("Лево")
btn_right = QPushButton("Право")
btn_flip = QPushButton("Зеркало")
btn_sharp = QPushButton("Резкость")
btn_bw = QPushButton("Ч/Б")
row = QHBoxLayout() # Основная строка
col1 = QVBoxLayout() # делится на два столбца
col2 = QVBoxLayout()
col1.addWidget(btn_dir) # в первом - кнопка выбора директории
col1.addWidget(lw_files) # и список файлов
col2.addWidget(lb_image, 95) # вo втором - картинка
row_tools = QHBoxLayout() # и строка кнопок
row_tools.addWidget(btn_left)
row_tools.addWidget(btn_right)
row_tools.addWidget(btn_flip)
row_tools.addWidget(btn_sharp)
row_tools.addWidget(btn_bw)
col2.addLayout(row_tools)
row.addLayout(col1, 20)
row.addLayout(col2, 80)
win.setLayout(row)
win.show()
workdir = ''
def filter(files, extensions):
result = []
for filename in files:
for ext in extensions:
if filename.endswith(ext):
result.append(filename)
return result
def chooseWorkdir():
global workdir
workdir = QFileDialog.getExistingDirectory()
def showFilenamesList():
extensions = ['.jpg','.jpeg', '.png', '.gif', '.bmp']
chooseWorkdir()
filenames = filter(os.listdir(workdir), extensions)
lw_files.clear()
for filename in filenames:
lw_files.addItem(filename)
btn_dir.clicked.connect(showFilenamesList)
class ImageProcessor():
def __init__(self):
self.image = None
self.dir = None
self.filename = None
self.save_dir = "Modified/"
def loadImage(self, dir, filename):
''' при загрузке запоминаем путь и имя файла '''
self.dir = dir
self.filename = filename
image_path = os.path.join(dir, filename)
self.image = Image.open(image_path)
def do_bw(self):
self.image = self.image.convert("L")
self.saveImage()
image_path = os.path.join(self.dir, self.save_dir, self.filename)
self.showImage(image_path)
def saveImage(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)
def showImage(self, path):
pixmapimage = QPixmap(path)
label_width, label_height = lb_image.width(), lb_image.height()
scaled_pixmap = pixmapimage.scaled(label_width, label_height, Qt.KeepAspectRatio)
lb_image.setPixmap(scaled_pixmap)
lb_image.setVisible(True)
def showChosenImage():
if lw_files.currentRow() >= 0:
filename = lw_files.currentItem().text()
workimage.loadImage(workdir, filename)
image_path = os.path.join(workimage.dir, workimage.filename)
workimage.showImage(image_path)
workimage = ImageProcessor() #текущая рабочая картинка для работы
lw_files.currentRowChanged.connect(showChosenImage)
btn_bw.clicked.connect(workimage.do_bw)
app.exec()