需要一张带「时间 + 地点」的打卡照片时,大多数人会去装一个水印相机 App。但这类需求其实很轻:水印格式固定、全在本机就能完成,为什么要为此装个 App 呢?
qdbaby 是我写的一个纯前端单文件 H5:拍照或选照片,自动加上「今日水印相机」风格的时间、日期、星期、天气、地点水印,按原图分辨率导出。打开链接就能用,不用注册、不用下载,照片也不会离开你的手机。
在线体验:https://qdbaby.pages.dev 源码:https://github.com/duruoxian/qdbaby

它能做什么
- 拍照或从相册选照片,水印实时预览,改哪儿立刻刷新;
- 时间、日期、星期自动填好、可改;天气是点选的(晴/多云/阴/雨/雪等 14 种芯片),温度用下拉选;
- 地点是「城市区县 · 详细地址」两段式,「📍 定位获取」一键自动填:区县走秒回的网络定位,详细地址优先附近的 POI(学校、园区这类);
- 右下角「今日水印 / 相机 真实可验」可自定义,防伪码每张照片自动换一个;
- 导出与原图同分辨率(超 30MP 才降采样适配设备画布上限),保存优先走系统分享面板,也支持直接下载和长按保存。
几个实现要点
排版是「量」出来的
水印要长得像参考 App,靠目测调参数永远差一口气。我把参考截图用 PIL 做了像素级测量——每行文字的包围盒、基线间距、黄杠的宽高、颜色采样——换算成「短边 = 1000u」的比例体系写进 Canvas 排版。任何分辨率、横拍竖拍,水印比例都和参考一致。
时间数字的防伪纹理
参考 App 的时间数字不是纯白,内部有一层斜纹。Canvas 里用一个离屏画布:白字填充后,globalCompositeOperation = "destination-out" 擦出 45° 细纹,再贴回主画布——透明处自然透出照片。
「区县 · 地址」两段式定位
定位的坑主要有三个:
- 手机 GPS 冷启动动辄几十秒——所以先要网络定位(WiFi/基站,1~3 秒),精度太差时才升级 GPS;
- 境外地理服务(OpenStreetMap)在国内经常挂起——所有请求都带超时,区县级信息走国内可达的 BigDataCloud 秒出,细节拿不到就放弃,绝不转圈;
- OSM 的行政区数据很脏——街道、功能区(高新区)、甚至宿舍楼名都混在行政层级里。解法是白名单:「 · 」前只放行以省/市/区/县结尾的正式行政区段。
填了高德 Key(可选)还能更准:坐标先做 WGS84 → GCJ02 转换,POI 能到「重庆师范大学(大学城校区)」这个级别。
等宽的「今日水印」
参考 App 里「今日水印」和「相机 真实可验」两行是严格等宽的。实现上以后者自然宽度为准,前者逐字分配字间距;「今」字中间的金色小点,是先画白字再用 clip 区域叠一层琥珀色。
部署
就是 index.html 一个文件,拖到 Cloudflare Pages / Netlify 任何静态托管就能上线;也可以直接把这个文件发给别人,浏览器打开即可(定位功能需要 HTTPS,所以正经分享还是挂个链接)。