批量图片加水印工具 (Batch Image Watermark Tool)
这是一个使用 Python 和 Tkinter 构建的图形用户界面(GUI)应用程序,用于批量向图片添加图片或文字水印。
功能介绍
- 选择图片文件夹: 用户可以选择包含需要处理的图片的源文件夹。
- 选择水印类型:
- 图片水印: 用户可以选择一个图片文件作为水印。
- 文字水印: 用户可以输入自定义文字作为水印。
- 批量处理: 自动处理所选文件夹中的所有支持的图片文件(jpg, jpeg, png, bmp)。
- 自动创建输出文件夹: 处理后的图片将保存在源文件夹内一个名为
watermarked_YYYYMMDD_HHMMSS的新子文件夹中,以避免覆盖原始文件。 - 进度显示: 在处理过程中显示进度信息。
- 跨平台: 基于 Tkinter 和 Pillow,理论上可以在 Windows, macOS, 和 Linux 上运行。
- 可打包: 可以使用 PyInstaller 等工具打包成独立的可执行文件(.exe)。
如何使用
- 运行应用程序(直接运行 Python 脚本或打包后的 .exe 文件)。
- 点击"选择图片文件夹"按钮,选择包含您想要添加水印的图片的文件夹。
- 选择水印类型:"图片水印"或"文字水印"。
- 如果选择"图片水印": 点击"选择水印图片"按钮,选择用作水印的图片文件。
- 如果选择"文字水印": 在"水印文字"输入框中输入您想要的文字。
- (可选)调整水印设置(未来可添加:字体大小、颜色、透明度、位置等)。
- 点击"开始处理"按钮。
- 程序将在源文件夹内创建一个新的子文件夹(例如
watermarked_...),并将处理后的图片保存在那里。 - 处理完成后会弹出提示信息。
依赖库
- Python 3.x
- Pillow (
pip install Pillow) - Tkinter (通常随 Python 标准库一起提供)
创作过程
- 需求分析: 确定核心功能:选择文件夹、选择水印(图片/文字)、批量处理、GUI 界面。
- 技术选型:
- GUI: 选择 Python 内置的
Tkinter库,因为它简单易用且无需额外安装(通常)。使用tkinter.ttk提供更好看的主题控件。 - 图像处理: 选择强大的
Pillow库(PIL 的现代分支)来处理图片打开、编辑(添加水印)和保存。
- GUI: 选择 Python 内置的
- 界面设计: 使用 Tkinter 布局管理器(如
grid)设计用户界面,包括标签、按钮、输入框、单选按钮等,用于选择文件/文件夹和输入文本。 - 核心逻辑实现:
- 编写函数以打开文件/文件夹选择对话框 (
filedialog)。 - 编写水印应用函数:
- 图片水印: 打开主图片和水印图片,调整水印大小(例如,基于主图片的一定比例),计算粘贴位置(例如,右下角),使用
Image.paste()粘贴水印(注意处理透明度)。 - 文字水印: 打开主图片,创建
ImageDraw对象,选择字体 (ImageFont),计算文字大小和位置,使用draw.text()绘制文字。
- 图片水印: 打开主图片和水印图片,调整水印大小(例如,基于主图片的一定比例),计算粘贴位置(例如,右下角),使用
- 实现批量处理逻辑:遍历选定文件夹中的所有图片文件,对每个文件调用相应的水印函数,并将结果保存到新的输出目录。
- 编写函数以打开文件/文件夹选择对话框 (
- 多线程处理: 为了防止在处理大量图片时 GUI 冻结,将批量处理任务放在一个单独的
threading.Thread中运行。 - 线程通信与 GUI 更新: 使用
queue.Queue在工作线程和主 GUI 线程之间安全地传递进度信息。使用root.after()定期检查队列并更新 GUI 上的状态标签,确保 GUI 保持响应。 - 错误处理: 添加
try...except块来处理可能发生的错误,例如文件未找到、图片格式不支持、权限问题等,并使用messagebox向用户显示错误信息。 - 打包: (如果需要 .exe)使用
PyInstaller将脚本及其依赖项打包成单个可执行文件。命令示例:pyinstaller --onefile --windowed --add-data "path/to/font.ttf;." watermark_app.py(如果使用了特定字体)。--windowed隐藏控制台窗口。 - README 生成: 在脚本中加入生成此
README.md文件的代码,以便自动记录项目信息。
注意事项
- 目前文字水印使用默认字体或尝试加载系统字体(如 Arial)。为了在不同系统上获得一致的外观或在打包时确保字体可用,建议捆绑一个字体文件(例如,在
fonts目录下放一个.ttf文件)并修改代码以加载它。 - 水印的位置和大小目前是硬编码的(例如,右下角,图片水印大小为主图的1/8)。未来可以添加更多自定义选项。