semi-utils 批量照片水印:一键给 500 张照片加上相机参数与品牌 Logo
如果你试过给几百张照片一张张加水印,大概懂这种痛:打开、放大、核对型号、敲参数、保存,到第 200 张才发现第 1 张的焦距写错了。semi-utils 批量照片水印就是干这个的——它直接读照片自带的 EXIF 元数据,把相机型号、镜头、光圈、快门、ISO 自动"抄"出来,再按模板批量渲染到每张照片上,顺便从内置素材库匹配品牌 Logo。7 套模板开箱即用,iPhone 的 HEIC 也不用提前转格式。
🚀 批量照片水印 4 步上手:从克隆到出图 5 分钟
全程不用写代码。
第一步,克隆项目并初始化环境。 init.sh 会替你检查 Python、建虚拟环境、装依赖,最后直接拉起服务:
git clone https://gitcode.com/gh_mirrors/se/semi-utils
cd semi-utils
./init.sh
跑完的预期结果:看到服务启动提示,浏览器自动打开 http://localhost:15050,页面里列着 input 文件夹下的照片。Windows 用户可以直接用打包好的发布版,macOS 用户在项目根目录有现成的启动脚本。
第二步,放照片。 项目目录下建一个 input 文件夹,把要处理的照片丢进去。支持 .jpeg、.jpg、.png、.heic 四种后缀,HEIC 会先自动转成 JPEG 再处理,不用你操心。
第三步,选模板、勾照片。 全选,或挑几张先试都行。
第四步,点开始。 服务用多线程并发处理(最多 4 个 worker 并行),页面实时推送进度和成功 / 跳过 / 失败计数,成品写入 output 文件夹,并完整保留 input 里的目录结构。
一个建议:首次先试跑 5 张,样式确认没问题再全量。原图自始至终不会被改动,input 当原料区、output 当成品区,来回对比都方便。
📷 相机参数和品牌 Logo 是怎么自动匹配的
semi-utils 最值钱的一点:它不让你填任何东西。点击开始后,每张片子先经 exiftool 解析 EXIF,直接拿到相机型号和品牌、镜头型号、焦距、光圈、快门速度、ISO,以及精确到秒的拍摄时间。
拿到品牌字段后,它会去 Logo 素材目录 匹配标识——尼康、佳能、索尼、富士、徕卡、哈苏、奥林巴斯、松下、宾得、理光、大疆等 13 个品牌的 Logo 现成备好,匹配逻辑在 核心渲染模块 的 auto_logo() 里:按 Make 字段扫一遍素材目录,命中就自动摆进水印区。
说白了,这是数据直读不是人工誊写,抄错参数的机会几乎为零。但有一种情况救不了:照片的 EXIF 被后期软件抹掉过,或者是手机截图、转存过的图,型号位只会显示占位符 -。看到 - 先拿原片确认元数据还在,别怪模板。
🎨 7 套内置模板:不同场景怎么选
7 套模板都在 模板配置目录 里,按用途对号入座:
- 标准水印:左上相机型号加粗、左下镜头信息、右上焦距 / 光圈 / 快门 / ISO、品牌 Logo,一条分割线隔开图文。信息最全,适合作品集和投稿。
- 标准水印 2:在标准版基础上加圆角、阴影、留白,社交媒体信息流里更耐看。
- 右下角参数:只在右下角放一行拍摄参数,低调不抢戏,朋友圈、小红书首选。
- 文件夹名 + 右下角参数:橙色文字显示文件夹名与拍摄时间,整理外拍交付时很好用。
- 尼康专用背景模糊:把型号里的红色"Z"字高亮,配高斯模糊背景,尼康 Z 系用户值得一试。
- 背景模糊:型号加参数垂直居中,模糊背景托底,构图均衡。
- Logo 居中:画面中心放大品牌 Logo,四周文字可自定义,视觉冲击强,适合宣发物料。
我的建议:同一批片子每套模板各跑一张,7 张摆一起对比 10 分钟,主力模板就选出来了。
✏️ 模板自定义:复制一份改 3 个字段
7 套不够用时不用从零写。模板本身就是 JSON 文件,复制一份再改就行。以"标准水印"模板为例:
- 把
"color"从black改成你的品牌色,文字颜色立刻变 - 调
height控制文字在水印区里的大小 - 把
font_path指向别的文件换字体,项目自带阿里巴巴普惠体和 Roboto 两套直接可用
模板里还能用 Jinja2 语法引用 EXIF 字段:{{ exif.FNumber }} 显示光圈、{{ exif.ISO }} 显示 ISO,也能塞进"摄影 / 某某某"这种自定义署名。保存后刷新页面,新模板就出现在下拉列表里。
不想碰 JSON 的话,最常改的几个值在 全局配置文件:
quality = 60
override_existed = False
template_name = 文件夹名+右下角参数
quality 是输出 JPEG 质量(1~100),默认 60 是为了控体积——追画质就调到 85~95 重新处理,成片观感会明显不同。override_existed 控制 output 里已有文件时是否覆盖,默认不覆盖,防止重跑时误伤上一批成品。template_name 是默认模板。
⚙️ 水印背后:一条批量照片处理流水线
老手视角看,semi-utils 的水印只是最上层的一个应用,底下是一套通用的图片管道。打开 processor 目录 能看到生成器、滤镜、合并器三类模块——所谓模板,其实就是一份处理器清单,描述"上哪些滤镜、按什么顺序、带什么参数"。
这么理解之后,能力边界比"加水印"宽得多:margin_with_ratio 能按比例加白边,把竖图横图统一成同一种画幅;quality 参数本身就是为批量压缩服务的;内置的纯色和渐变生成器,想批量做风格化背景也有得玩。服务侧同样为批量考虑过:多线程并发、SSE 实时进度、自动创建 output 子目录、跳过已存在文件,千张级别的活都替你铺好了。
现在就可以动手:打开终端执行 git clone https://gitcode.com/gh_mirrors/se/semi-utils,把 5 张片子丢进 input 文件夹,在页面上选"标准水印"点开始。几分钟后就是一批型号、参数、Logo 齐全的成品——唯一要用手动的,就是放照片那一下。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考








