# 给照片添加“徕卡风格水印”，兼谈 Shortcuts 中的字典

> 本文公开全文。

原文：https://utgd.net/article/20147

给照片加水印，目的不外乎几种，或防盗防窃防误用，例如打上“某某版权所有”或“仅用于某某活动”；或追求美观；或与摄影同好分享拍摄参数，以互通有无。本文所谓的水印，在于后两者。水印原本非常硬核，多为第一类（常见诸官场），或者第三类（常见于发烧论坛），而自小米于2022年推出徕卡专属水印以来，水印的装饰价值也终于脱颖而出。

最初，许多并没有徕卡相机或合作款手机的人，也给自己的照片打上徕卡 Logo，这一阶段基本属于凑热闹、图新鲜；后来，有一些软件开始适配各种相机和手机机型，真实反映拍摄设备，这一阶段的玩家就理性许多。相比事实上没有任何知识产权限制的 Android，iOS 这边的现成软件寥寥无几，主要靠玩家自己制作 Shortcuts 动作，@24Says 就做过一款水印，他的摄影作品不仅美观，而且识别度很高。不过，玩家们制作的水印动作通常太个人化，主要针对各自手头的设备，别人下载之后往往不知如何下手改动。我综合之前处理截图和复杂数据的经验，设计了一款轻量级水印动作，同时也可以轻松拓展、更换个性模板。

- Shortcuts 动作下载

- GitHub 第一时间获得更新

## 如何使用

示例动作适用于 iPhone、RICOH 和 FUJIFILM 的产品，配有对应的模板，Shortcuts 会自动识别照片来源机型并套用模板，不需要手动操作。您也可以参考下一节，添加更多品牌或自定义模板。不过，除 iPhone 以外，我不能保证其他品牌的所有机型都可以正常加水印，使用相机的读者最好参照下一节检查具体的制造商名字。

总之，先下载本文动作，用手机上的照片试一试！

我设计的水印动作有三组信息，从左到右、从上到下，列如下：

- Shot On \+ 相机品牌，品牌信息预先设置了模板，可以展示商标，而非单纯的本文；

- 机型 \| 光圈 \| 感光，列出主要参数，这里只是举例，故非常精简，您可以参照下一节内容添加更多信息；

- 日期 \+ 版权信息，使用前请将 © Minja 更改为您自己的权利信息，如果名字较长，可能需要参考下一节内容微调这一部分信息的摆放位置。

确定上述信息符合要求后，你可以选择任意一张照片，运行动作，静待几秒，就能得到带有水印的图片。如果是从相机中导入的照片，部分可能体积较大，Shortcuts 需要更多时间。本动作采用拼接图片的形式添加水印，不会压缩原图的尺寸，一般不伤质量——不过，加水印一般是为了分享到社交网络，大概也不需要太高的像素。

## 原理简析

为简化步骤和计算量，本方案集中处理水印，制作完成后再和原图拼接，而种种细节，也都集中在水印制作的步骤中。

### 用字典事先存储水印模板

自近几个版本以来，Shortcuts 可以在图片上叠加另一层图片或者文字，而相机水印，本质上就是图文的不断叠加组合。然而，Shortcuts 非常浪费资源，步骤越多越容易崩溃，鉴此，一旦确定喜欢的水印模板，不少内容最好事先载于模板图片上，避免每次都临时渲染、叠加。

你可以用任何绘图工具自制模板，我在示例动作中内置了三种，对应 iPhone、RICOH 和 FUJIFILM，其中已经配有 Shot On 字样和制造商商标，以减少一些叠放工作量——事实上，我后续叠放的只有文本。具体排列方式全凭个人好恶，只要在叠放图文时注意对准位置。

接着，将准备好的图片编码为 Base64 格式，并填入 Shortcuts 开头的字典（Dictionary）中。

上图中的字典数据，多为 制造商 和 Base64 编码 的一一对应。所谓字典，就是用 键（Key）\-值（Value） 的形式存储信息，输入 键 即可获得对应的 值。和传统的 If 串烧相比，数据越多，字典优势越明显，因为 If 会越来越长、步骤越来越多，而字典永远是固定步骤。Shortcuts 还有致命问题：编辑常常靠拖动，手一滑就容易拖错，步骤太长的时候还会死机，因此简短的字典也容易维护。

例言之，iPhone 的制造商是 Apple，当 Shortcuts 检测到该制造商时，就会选用对应的 Shot On iPhone  模板。至于其他相机制造商，您可以在电脑上查看文件详情，找到“Device make”信息。

注意，理光（RICOH）的制造商名称为 RICOH IMAGING COMPANY, LTD\.（末尾是两个空格），带有符号英文句号 \.，这在字典语法中有特殊含义，会被 Shortcuts 错误理解。事情是这样的，假设你有下面的字典：

```
"iPhone":"图片A"
"FUJIFILM":"图片B"
"RICOH":{图:图片B}
```

用 iPhone，当然可以获得 图片A；但用 RICOH，你得到的就是一个子字典 \{图\:图片B\}，里面又是一组“键\-值”对。如果想获得 图片B，就要使用带句号的语法 RICOH\.图，先后使用 RICOH 和 图 两个键，把子字典中的数据提取出来。

最“快捷”的指令是写一个 If 分支，但我觉得这些分支不美观，就像重症晚期病人身上插满的导管。不妨将计就计，顺着 Shortcuts 的误会修改字典中的数据格式，将原本的文本换为子字典，将新字典的键设置为 RICOH 设备名中的两个英文空格 ，值继续填写模板的 Base64 编码。这个巧妙的转换，即可大幅精简 Shortcuts 步骤。此处固然是无奈迁就，而后面我们处理 Exif 信息时，将更积极地使用字典语法。

### 用字典获取 Exif 信息

稍微了解一些 Shortcuts 的读者可能知道，Shortcuts 中的照片对象有很多属性，例如拍摄时间、地点、分辨率，等等，我也据此做个一个相册自动分类动作。不过，镜头相关的硬核数据并不在默认属性中，而是一股脑塞在元数据字典（Metadata Dictionary）里，需要进一步将其提取出来。照片的元数据字典一般是以下格式（为方便阅读，已经在不破坏数据格式的前提下大幅简化）

可以看到一个又一个的“键\-值”对，并且还有多个层级的字典嵌套。示例动作中用到的光圈值 FNumber 就在其中，藏在一个子字典里。前文已经提到过提取子字典数据的语法，对应到获取 FNumber 的值上，就是 \{Exif\}\.FNumber。将这段文本填入 Shortcuts 变量中的“Get Value for Key”一栏，即可获得光圈数据。

其他参数，例如 ISO 感光度、拍摄日期和经纬度，大多可以如法炮制。之后的工作就是排列组合这些数据，并将其叠放在水印模板上。管见以为，参数主要是用于交流的，如果别人觉得你拍得不错，他可能想知道你用了什么机身、哪种镜头以及调了多少的 ISO，等等，如果有条件，观者也可以循着你提供的参数拍拍看。当然，这是站在摄影的角度，如果想把照片当作呈堂证供——无论是作品权利信息还是不在场证明——可能就更注重经纬度、时间和权利人等信息，不过这些恐怕不是本文所能解决的。

至于确定叠放时的位置与尺寸，纯属力气活，在电脑上用绘图软件提前量好即可。

待添加好各项信息，剩下的事情就是把水印图片拉到和照片等宽，然后上下对齐、一拼，结束。

---

[前往标准阅读页](https://utgd.net/article/20147?audience=web)
