"Blur" 来自命令行的照片元数据?

"Blur" photo metadata from command line?

根据其他用户的建议重新发布from Superuser,因为这可能涉及一些(基本的)编程。

当我将照片发布到社交媒体时,我经常想模糊图像的某些部分以删除个人身份数据。这对于任何数量的图像处理工具来说都是直截了当的。假设我想做一些大致相当于图片元数据的事情?例如,我想随机倾斜拍摄的日期和时间,以便有兴趣的人仍然可以大致了解拍摄时间(一天中的日期和时间),并随机倾斜 GPS 坐标——比如,圆形他们到最近的四分之一英里。我可能想要也可能不想删除其他数据,例如相机类型。它不需要精确,只要将元数据匿名化到足以让我不会对有人确切知道我的时间和地点感到厌恶。使用 EXIFTool 似乎很简单,但是元数据的读取、倾斜和重写会有点麻烦。不想重新发明轮子,有没有直接的方法来做到这一点?感谢您的帮助。

您可以使用 exiftool 执行此操作,但需要了解一些内部工作原理和 Perl。

例如,我将 "blur" 时间以 10 分钟的跨度(+/- 5 分钟)随机调整(好吧,技术上是 9 分 59 秒,它有可能落在 0 上) :
exiftool -d %s "-DateTimeOriginal<${DateTimeOriginal;$_+=(int(rand(600))-300)}" <FileOrDir>

细分:
-d %s - 这会将日期格式更改为 UNIX 时间,即自 1970:01:01 00:00:00
以来的秒数 -DateTimeOriginal< - 被复制到的标签,可能与被复制的标签相同。小于号<表示标记复制操作。
${DateTimeOriginal;$_+=(int(rand(600))-300)} - 使用 exiftools 高级格式化功能(又名 Perl 代码)进行一些更改后复制的标签。由于 -d 选项,此 DateTimeOriginal 标记值采用 UNIX 时间格式。然后,生成一个介于 0 和 599 之间的随机数 int(rand(600)),减去 300 将其拆分,因此一半多一点是负数,其余是正数(或 0)。使用默认变量 $_ 并将其添加到生成的数字 +=.

要模糊 GPSLatitudeGPSLongitude,您可以做类似的事情,使用十进制坐标而不是 degrees/minutes/seconds,并且使用更小的数字,因为即使十分之一度也可以是很多英里.在这种情况下,命令的重要部分将类似于
"-GPSLatitude<${GPSLatitude#;$_+=(rand()-.5)/10}"
在这里,我使用了标签 #GPSLatitude,因为这将给出十进制坐标值。另一种选择是使用 -c 选项。我还把它带到了小数点后第 100 位的变化水平,我认为这可能在英里或几十英里的范围内。这将在赤道和子午线附近严重崩溃,因为它没有正确考虑半球。

总而言之:
exiftool -d %s "-DateTimeOriginal<${DateTimeOriginal;$_+=(int(rand(600))-300)}" "-GPSLatitude<${GPSLatitude#;$_+=(rand()-.5)/10}" "-GPSLongitude<${GPSLongitude#;$_+=(rand()-.5)/10}" <FileOrDir>

此命令创建备份文件。添加 -overwrite_original 以禁止创建备份文件。添加 -r 以递归到子目录。如果此命令在 Unix/Mac 下是 运行,请反转任何 double/single 引号以避免 bash 解释。