python实现的批量图片加水印工具

162 阅读4分钟

批量图片加水印工具 (Batch Image Watermark Tool)

这是一个使用 Python 和 Tkinter 构建的图形用户界面(GUI)应用程序,用于批量向图片添加图片或文字水印。

功能介绍

  • 选择图片文件夹: 用户可以选择包含需要处理的图片的源文件夹。
  • 选择水印类型:
    • 图片水印: 用户可以选择一个图片文件作为水印。
    • 文字水印: 用户可以输入自定义文字作为水印。
  • 批量处理: 自动处理所选文件夹中的所有支持的图片文件(jpg, jpeg, png, bmp)。
  • 自动创建输出文件夹: 处理后的图片将保存在源文件夹内一个名为 watermarked_YYYYMMDD_HHMMSS 的新子文件夹中,以避免覆盖原始文件。
  • 进度显示: 在处理过程中显示进度信息。
  • 跨平台: 基于 Tkinter 和 Pillow,理论上可以在 Windows, macOS, 和 Linux 上运行。
  • 可打包: 可以使用 PyInstaller 等工具打包成独立的可执行文件(.exe)。

如何使用

  1. 运行应用程序(直接运行 Python 脚本或打包后的 .exe 文件)。
  2. 点击"选择图片文件夹"按钮,选择包含您想要添加水印的图片的文件夹。
  3. 选择水印类型:"图片水印"或"文字水印"。
  4. 如果选择"图片水印": 点击"选择水印图片"按钮,选择用作水印的图片文件。
  5. 如果选择"文字水印": 在"水印文字"输入框中输入您想要的文字。
  6. (可选)调整水印设置(未来可添加:字体大小、颜色、透明度、位置等)。
  7. 点击"开始处理"按钮。
  8. 程序将在源文件夹内创建一个新的子文件夹(例如 watermarked_...),并将处理后的图片保存在那里。
  9. 处理完成后会弹出提示信息。

依赖库

  • Python 3.x
  • Pillow (pip install Pillow)
  • Tkinter (通常随 Python 标准库一起提供)

创作过程

  1. 需求分析: 确定核心功能:选择文件夹、选择水印(图片/文字)、批量处理、GUI 界面。
  2. 技术选型:
    • GUI: 选择 Python 内置的 Tkinter 库,因为它简单易用且无需额外安装(通常)。使用 tkinter.ttk 提供更好看的主题控件。
    • 图像处理: 选择强大的 Pillow 库(PIL 的现代分支)来处理图片打开、编辑(添加水印)和保存。
  3. 界面设计: 使用 Tkinter 布局管理器(如 grid)设计用户界面,包括标签、按钮、输入框、单选按钮等,用于选择文件/文件夹和输入文本。
  4. 核心逻辑实现:
    • 编写函数以打开文件/文件夹选择对话框 (filedialog)。
    • 编写水印应用函数:
      • 图片水印: 打开主图片和水印图片,调整水印大小(例如,基于主图片的一定比例),计算粘贴位置(例如,右下角),使用 Image.paste() 粘贴水印(注意处理透明度)。
      • 文字水印: 打开主图片,创建 ImageDraw 对象,选择字体 (ImageFont),计算文字大小和位置,使用 draw.text() 绘制文字。
    • 实现批量处理逻辑:遍历选定文件夹中的所有图片文件,对每个文件调用相应的水印函数,并将结果保存到新的输出目录。
  5. 多线程处理: 为了防止在处理大量图片时 GUI 冻结,将批量处理任务放在一个单独的 threading.Thread 中运行。
  6. 线程通信与 GUI 更新: 使用 queue.Queue 在工作线程和主 GUI 线程之间安全地传递进度信息。使用 root.after() 定期检查队列并更新 GUI 上的状态标签,确保 GUI 保持响应。
  7. 错误处理: 添加 try...except 块来处理可能发生的错误,例如文件未找到、图片格式不支持、权限问题等,并使用 messagebox 向用户显示错误信息。
  8. 打包: (如果需要 .exe)使用 PyInstaller 将脚本及其依赖项打包成单个可执行文件。命令示例:pyinstaller --onefile --windowed --add-data "path/to/font.ttf;." watermark_app.py (如果使用了特定字体)。--windowed 隐藏控制台窗口。
  9. README 生成: 在脚本中加入生成此 README.md 文件的代码,以便自动记录项目信息。

注意事项

  • 目前文字水印使用默认字体或尝试加载系统字体(如 Arial)。为了在不同系统上获得一致的外观或在打包时确保字体可用,建议捆绑一个字体文件(例如,在 fonts 目录下放一个 .ttf 文件)并修改代码以加载它。
  • 水印的位置和大小目前是硬编码的(例如,右下角,图片水印大小为主图的1/8)。未来可以添加更多自定义选项。

1.png

2.png