版本 7.5 初次更新
在支持PNG格式的基础上,新增了jpg、jpeg和bmp格式的支持(其他格式的水印真的必要吗...)
现在上传的水印图片可以在按钮上显示预览图!
上传图片后,系统会显示已生成的图片数量及保存路径,同时增加了一个小进度条
代码示例
```python
import os
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QPushButton, QFileDialog, QGridLayout, QSizePolicy, QLabel, QProgressBar
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtCore import Qt, QSize
from PIL import Image
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("水印工具 2.0")
self.setWindowIcon(QIcon("push.ico"))
self.central_widget = QWidget()
self.setCentralWidget(self.central_widget)
self.layout = QGridLayout(self.central_widget)
self.layout.setSpacing(0)
self.watermark_path = ""
self.image_paths = []
self.output_folder = ""
self.watermark_button = QPushButton("选择水印图片")
self.watermark_button.clicked.connect(self.select_watermark)
self.layout.addWidget(self.watermark_button, 2, 0)
self.image_button = QPushButton("选择图片")
self.image_button.clicked.connect(self.select_images)
self.layout.addWidget(self.image_button, 2, 1)
self.folder_label = QLabel()
self.layout.addWidget(self.folder_label, 3, 0)
self.folder_button = QPushButton("选择输出文件夹")
self.folder_button.clicked.connect(self.select_output_folder)
self.layout.addWidget(self.folder_button, 4, 0)
self.start_button = QPushButton("开始添加水印")
self.start_button.clicked.connect(self.start_watermarking)
self.layout.addWidget(self.start_button, 4, 1)
self.progress_bar = QProgressBar()
self.layout.addWidget(self.progress_bar, 5, 0, 1, 2)
self.central_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
self.watermark_button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
self.image_button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
self.folder_button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
self.start_button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
self.central_widget.setLayout(self.layout)
self.setMinimumSize(500, 500)
self.show()
def select_watermark(self):
file_dialog = QFileDialog()
file_dialog.setNameFilter("Image files (*.png *.jpg *.jpeg *.bmp)")
if file_dialog.exec_():
self.watermark_path = file_dialog.selectedFiles()[0]
pixmap = QPixmap(self.watermark_path)
pixmap = pixmap.scaled(self.watermark_button.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation)
scaled_path = os.path.join(os.path.dirname(self.watermark_path), "scaled_watermark.png")
pixmap.save(scaled_path)
scaled_path = scaled_path.replace('\\', '/') # 将路径中的反斜杠替换为正斜杠
self.watermark_button.setStyleSheet(f"QPushButton {{background-image: url({scaled_path}); background-position: center; background-repeat: no-repeat; background-attachment: fixed}}")
def select_images(self):
file_dialog = QFileDialog()
file_dialog.setNameFilter("Image files (*.png *.jpg *.jpeg)")
file_dialog.setFileMode(QFileDialog.ExistingFiles)
if file_dialog.exec_():
self.image_paths = file_dialog.selectedFiles()
# 更新按钮文本,显示选择的图片数量
self.image_button.setText(f"选择图片 ({len(self.image_paths)})")
pixmap = QPixmap(self.image_paths[0])
pixmap = pixmap.scaled(self.image_button.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation)
pixmap.save("scaled_image.png")
self.image_button.setStyleSheet("QPushButton {background-image: url(" + os.path.abspath("scaled_image.png") + "); background-position: center; background-repeat: no-repeat; background-attachment: fixed}")
def select_output_folder(self):
file_dialog = QFileDialog()
file_dialog.setFileMode(QFileDialog.DirectoryOnly)
if file_dialog.exec_():
self.output_folder = file_dialog.selectedFiles()[0]
self.folder_button.setText("输出文件夹: " + self.output_folder)
def start_watermarking(self):
self.progress_bar.setMaximum(len(self.image_paths))
for index, image_path in enumerate(self.image_paths):
image = Image.open(image_path)
watermark = Image.open(self.watermark_path)
watermark = watermark.resize(image.size, Image.ANTIALIAS)
image.paste(watermark, (0, 0), watermark)
image.save(os.path.join(self.output_folder, os.path.basename(image_path)))
self.progress_bar.setValue(index + 1)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.setWindowIcon(QIcon("ppush.ico")) # 设置应用程序图标
sys.exit(app.exec_())
```