import os from PIL import Image from PyQt5.QtWidgets import QApplication, QFileDialog, QMainWindow, QLabel, QPushButton, QWidget, QMessageBox from PyQt5.QtGui import QFont, QIcon from PyQt5.QtCore import Qt class ImageConverter(QMainWindow): def __init__(self): super().__init__() self.input_paths = [] self.output_path = '' self.setWindowTitle('Image Converter') self.setGeometry(100, 100, 500, 275) self.setFixedSize(500, 275) self.setStyleSheet('background-color:#e2e2e2;') # set window icon self.setWindowIcon(QIcon('icon.png')) # create widgets self.title_label = QLabel('Image Converter', self) self.title_label.setGeometry(10, 10, 500, 50) font = QFont('Arial', 18, QFont.Bold) self.title_label.setFont(font) self.title_label.setStyleSheet('color: #2a8c2a; text-align: center;') self.input_path_label = QLabel('Select input file:', self) self.input_path_label.setGeometry(10, 70, 300, 30) font = QFont('Arial', 9) self.input_path_label.setFont(font) self.input_path_label.setStyleSheet('color: #2a2a2a;') self.input_path_button = QPushButton('Browse', self) self.input_path_button.setGeometry(360, 70, 100, 30) font = QFont('Arial', 9) self.input_path_button.setFont(font) self.input_path_button.setStyleSheet('color: white; background-color: #2a80ff; border-radius: 5px;') self.input_path_button.clicked.connect(self.selectInput) self.output_path_label = QLabel('Select output folder:', self) self.output_path_label.setGeometry(10, 110, 300, 30) font = QFont('Arial', 9) self.output_path_label.setFont(font) self.output_path_label.setStyleSheet('color: #2a2a2a;') self.output_path_button = QPushButton('Browse', self) self.output_path_button.setGeometry(360, 110, 100, 30) font = QFont('Arial', 9) self.output_path_button.setFont(font) self.output_path_button.setStyleSheet('color: white; background-color: #2a80ff; border-radius: 5px;') self.output_path_button.clicked.connect(self.selectOutput) self.convert_button = QPushButton('Convert', self) self.convert_button.setGeometry(200, 160, 100, 40) font = QFont('Arial', 12) self.convert_button.setFont(font) self.convert_button.setStyleSheet('color: white; background-color: #2a80ff; border-radius: 5px;') self.convert_button.clicked.connect(self.convertImages) self.info_label = QLabel('This program converts JPG and PNG images to WEBP format.', self) self.info_label.setGeometry(10, 210, 480, 30) font = QFont('Arial', 10) self.info_label.setFont(font) self.info_label.setStyleSheet('color: #050505;') self.info_label.setAlignment(Qt.AlignCenter) self.designed_by_label = QLabel('Programmed by Mahdi Ziraki', self) self.designed_by_label.setGeometry(10, 250, 200, 20) font = QFont('Arial', 9) self.designed_by_label.setFont(font) self.designed_by_label.setStyleSheet('color: #d40000;') self.designed_by_label.setAlignment(Qt.AlignLeft) self.show() def selectInput(self): file_names, _ = QFileDialog.getOpenFileNames(self, 'Select input file(s)', '', 'All Files (*);;JPG Files (*.jpg);;PNG Files (*.png)', options=QFileDialog.Options()) if file_names: self.input_paths = file_names self.input_path_label.setText('Input file(s): ' + str(len(file_names)) + ' selected') def selectOutput(self): folder_name = QFileDialog.getExistingDirectory(self, 'Select output folder') if folder_name: self.output_path = folder_name self.output_path_label.setText('Output folder: ' + self.output_path) def convertImages(self): if not self.input_paths: self.showError('Please select input file(s).') return if not self.output_path: self.showError('Please select output folder.') return for input_path in self.input_paths: if os.path.isfile(input_path): if input_path.endswith(('.jpg', '.png')): image = Image.open(input_path) new_file_name = os.path.splitext(os.path.basename(input_path))[0] + '.webp' new_image_path = os.path.join(self.output_path, new_file_name) image.save(new_image_path, 'webp') else: self.showError('Invalid input file format. Please select files with JPG or PNG format.') else: for filename in os.listdir(input_path): if filename.endswith(('.jpg', '.png')): image_path = os.path.join(input_path, filename) image = Image.open(image_path) new_file_name = os.path.splitext(filename)[0] + '.webp' new_image_path = os.path.join(self.output_path, new_file_name) image.save(new_image_path, 'webp') # show completion message msgBox = QMessageBox() msgBox.setIcon(QMessageBox.Information) msgBox.setText('Image conversion completed successfully.') msgBox.setWindowTitle('Success') msgBox.exec_() def showError(self, message): msgBox = QMessageBox() msgBox.setIcon(QMessageBox.Critical) msgBox.setText(message) msgBox.setWindowTitle('Error') msgBox.exec_() if __name__ == '__main__': app = QApplication([]) converter = ImageConverter() app.aboutToQuit.connect(converter.closeEvent) app.exec_()