# photo_watermark **Repository Path**: lc123/photo_watermark ## Basic Information - **Project Name**: photo_watermark - **Description**: 给图片添加水印和边框的app - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-24 - **Last Updated**: 2026-05-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 照片相机参数水印工具 基于 Python 的照片水印工具,自动读取 EXIF 相机参数并以美观水印形式添加到照片上。支持 GUI 可视化操作,所见即所得。 --- ## 目录 - [功能总览](#功能总览) - [项目架构](#项目架构) - [快速开始](#快速开始) - [使用指南](#使用指南) - [开发历程](#开发历程) - [技术栈](#技术栈) - [打包发布](#打包发布) --- ## 功能总览 ### 水印内容 | 功能 | 说明 | |------|------| | 📷 EXIF 自动提取 | 相机型号、光圈、快门、ISO、焦距、镜头、拍摄日期 | | ✏️ 可编辑字段 | 4 个独立字段,可自由修改/清空/隐藏 | | 📋 单行/多行布局 | 排成一行或用换行分隔,分隔符可自定义 | | 🔤 字体选择 | 385+ 系统字体,三级字号独立设置 | ### 水印样式 | 功能 | 说明 | |------|------| | 📍 位置调整 | 9 个预设位置 + 边距 + X/Y 偏移滑块 | | 🎨 颜色 | 文字颜色、描边颜色自定义 | | 🔲 描边 | 0~8px 描边宽度,支持高斯模糊柔光 | | 🌊 不透明度 | 10%~100% 滑块调节 | ### 图片编辑 | 功能 | 说明 | |------|------| | 🔄 旋转 | 顺时针/逆时针 90° | | ↔️ 翻转 | 水平/垂直镜像翻转 | | ✂️ 裁切 | 拖拽框选自由裁切,Esc 取消 | | 🔍 缩放 | 滚轮缩放(最大 8×),拖拽平移视图 | ### 背景特效 | 功能 | 说明 | |------|------| | 🌫️ 模糊背景 | 照片模糊后作底图,原图居中叠加 | | 📐 独立边距 | 左右/上下边距独立调节(0~500px) | | 🔲 圆角 | 0~120px 前景圆角半径 | | ✨ 边框 | 高斯模糊阴影 + 半透明描边,随值动态缩放 | ### 品牌 Logo | 功能 | 说明 | |------|------| | 🏷️ 内置品牌 | Canon / NIKON / NIKON Z / SONY / FUJIFILM / Leica / LUMIX / OLYMPUS / PENTAX / HASSELBLAD / GoPro / DJI / SIGMA / RICOH | | 🖼️ 自定义 Logo | 支持加载 PNG/JPG 图片 | | 🤖 自动匹配 | 根据 EXIF 相机型号自动选择品牌 Logo | ### 其他 | 功能 | 说明 | |------|------| | ✍️ 签名 | 加载签名图片,显示在文字右侧,偏移可调 | | 📝 底部留白 | 图片下方扩展白边区域展示水印 | | 📦 批量处理 | 多张照片一次性添加水印 | | 💾 多格式导出 | JPG / PNG / BMP / TIFF | | ⌨️ 快捷键 | Ctrl+O 打开 / Ctrl+S 保存 / Ctrl+R 重置 / Ctrl+0 缩放适应 | --- ## 项目架构 ``` photograph_mask/ ├── main.py # 程序入口 ├── gui.py # GUI 主界面(tkinter, ~1300行) ├── watermark.py # 水印渲染核心(PIL + OpenCV) ├── exif_reader.py # EXIF 数据读取模块 ├── camera_logos.py # 品牌 Logo 生成器 ├── logos/ # 品牌 Logo PNG 文件(14个) ├── requirements.txt # Python 依赖 ├── README.md # 本文档 └── .gitignore ``` ### 模块职责 | 模块 | 职责 | |------|------| | `gui.py` | tkinter GUI,包含 `CollapsibleSection` 折叠面板、缩放/平移、图片编辑、防抖渲染 | | `watermark.py` | 核心渲染引擎:水印文字/Logo/签名绘制、模糊背景、圆角、阴影、高斯柔光 | | `exif_reader.py` | Pillow EXIF 读取,合并主IFD和ExifIFD(0x8769)子IFD标签 | | `camera_logos.py` | 14 品牌 Logo 生成,也可从 `logos/` 文件夹直接加载 PNG 图片 | ### 渲染管线 ``` 原图 → [EXIF方向纠正] → [图片编辑: 翻转/旋转/裁切] → [模糊背景 + 圆角 + 阴影 + 描边] (OpenCV加速) → [水印文字 + Logo + 签名] (PIL渲染) → 预览显示 / 导出保存 ``` ### 性能优化 - **OpenCV 加速**:GaussianBlur 和 resize 使用 cv2(比 PIL 快 3~5×),自动回退 PIL - **防抖渲染**:滑块操作 60ms 防抖,避免频繁重绘 - **字体缓存**:`_load_font` 按 `(font_name, size)` 缓存 - **底图缓存**:模糊背景+圆角渲染一次后缓存,文字参数变化时只重绘文字层 - **智能失效**:图片变更/背景参数变更时自动清缓存 --- ## 快速开始 ### 环境要求 - Python 3.8+ - Windows / macOS / Linux ### 安装依赖 ```bash pip install -r requirements.txt ``` ### 运行 ```bash python main.py ``` ### 打包为 exe(可选) ```bash pyinstaller --onefile --windowed --name "PhotoWatermark" --add-data "logos;logos" main.py # 输出: dist/PhotoWatermark.exe ``` --- ## 使用指南 ### 基本操作 1. 点击 **打开图片** 或 Ctrl+O 加载照片 2. EXIF 相机参数自动填充到「水印内容」面板 3. 勾选/取消勾选控制各项显隐 4. 勾选「排成一行」切换单行/多行布局 5. 在「位置调整」中选预设位置或微调偏移 6. 在「样式设置」中调颜色/字号/透明度 7. 点击 **导出图片** 或 Ctrl+S 保存 ### 模糊背景 1. 展开「模糊背景」面板 2. 勾选「启用模糊背景」 3. 调节左右/上下边距、圆角、边框 4. 滚轮缩放视图,拖拽平移查看细节 ### 品牌 Logo 1. 展开「相机Logo」面板 2. 下拉选择品牌自动生成,或点击「选择Logo图片」 3. 替换 `logos/` 文件夹中的 PNG 为官方 Logo 图片 ### 图片编辑 - 工具栏按钮:旋转/翻转/裁切 - 裁切模式:拖拽框选区域,按 Esc 取消 - 滚轮缩放视图查看细节 --- ## 开发历程 | 提交 | 内容 | |------|------| | `d058df6` | 初始化项目:EXIF读取、水印渲染、GUI界面 | | `fb4429b` | 自定义文字水印、键盘快捷键 | | `a953787` | 右键菜单、快速定位 | | `dea03c7` | 批量处理多张照片 | | `51b3951` | 字体选择(385个系统字体)、可编辑水印字段、Logo支持 | | `3f61198` | EXIF默认值填充 + Logo独立偏移 | | `df4f1da` | 修复参数/镜头/日期字段不填充(直接从exif_data提取) | | `6846a76` | 修复ExifIFD子IFD读取(主IFD+0x8769合并) | | `47a6f3e` | 底部留白区域 | | `f0cd713` | 描边默认0 + 留白自动黑字 | | `7fd6cde` | 单行布局 + 间距可调 | | `858dcdf` | 默认中下位置 + 默认单行 + 勾选框 | | `a765c08` | 图片翻转/旋转/裁切 | | `c3b4293` | 控制面板分组可折叠 | | `48c6491` | 内置13种品牌Logo绘制 | | `f181ded` | Logo改为图片文件方案,支持替换官方Logo | | `409bcf5` | Nikon Z系列优化:Z Logo变体 + 自动匹配 | | `32c016a` | 模糊背景功能 | | `3352c8a` | 左右/上下边距独立 + 留白底部无间隙 | | `d084760` | 边距范围扩大0~500px | | `4db4f9b` | 前景圆角 + 白色边框 + 阴影 | | `9a121fd` | 圆角0~120 + 高斯柔光边框 | | `b919089` | 边框高斯模糊柔光过渡 | | `e1cd295` | 前景边缘羽化融入发光 | | `6e847b2` | 性能:防抖+字体缓存+底图缓存 | | `9fd8f8d` | 性能:BILINEAR缩放 + 模糊先缩小 + 防抖60ms | | `5172940` | 预览低分辨率渲染(后回退) | | `5d24cec` | 阴影均匀环绕,四边对称 | | `4e34ee2` | 边框极简重设计:1px描边+柔影 | | `b530bd9` | 边框效果可视化:随值动态缩放 | | `836dca9` | EXIF方向自动旋转(竖图修复) | | `e33f75f` | 集成OpenCV加速 | | `8985654` | 摄影师签名功能 | | `b57533c` | 签名右侧 + 偏移可调 | | `80f49bb` | 预览视图缩放(滚轮+按钮) | | `fc651f0` | 修复缩放变量未初始化 | | `c07ef9f` | 去Ctrl+滚轮偏移 + 拖拽3px阈值 | | `63e4b2d` | 拖拽仅裁切模式 | | `f3ebc01` | 拖拽平移视图 | | `249d579` | 修复全方向平移 | | `a49e092` | PyInstaller打包exe | --- ## 技术栈 | 技术 | 用途 | |------|------| | **Python 3.14** | 主语言 | | **tkinter** | GUI 框架 | | **Pillow (PIL)** | 图像处理、EXIF读取、文字渲染 | | **OpenCV (cv2)** | 高性能高斯模糊和缩放(可选回退PIL) | | **NumPy** | OpenCV 图像数据桥接 | | **PyInstaller** | 打包为独立 exe | ## 打包发布 ```bash # 安装打包工具 pip install pyinstaller # 打包(单文件,无控制台窗口) pyinstaller --onefile --windowed --name "PhotoWatermark" --add-data "logos;logos" main.py # 输出文件 dist/PhotoWatermark.exe ``` > **提示**:如需替换品牌 Logo,将官方 PNG 文件覆盖 `logos/` 目录中的同名文件后重新打包即可。 - Python 3.8+ - Pillow (PIL) - tkinter (Python 内置)