【问题标题】:"Blur" photo metadata from command line?从命令行“模糊”照片元数据?
【发布时间】:2017-10-27 18:31:08
【问题描述】:

在另一个用户的建议下转发from Superuser,因为这可能涉及一些(基本的)编程。

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

【问题讨论】:

    标签: image metadata exif exiftool


    【解决方案1】:

    您可以使用 exiftool 完成此操作,但需要对内部工作原理和 Perl 有一点了解。

    例如,我将随机“模糊”时间跨度 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,您可以执行类似的操作,使用十进制坐标而不是度/分/秒,以及更小的数字,因为即使十分之一度也可能是很多英里。在这种情况下,命令的重要部分类似于
    "-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 下运行,请反转任何双/单引号以避免 bash 解释。

    【讨论】:

    • 非常感谢您提供非常详细和翔实的答案!对此,我真的非常感激。这应该完全符合我的需要。
    猜你喜欢
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 2015-05-16
    • 1970-01-01
    • 2015-05-17
    相关资源
    最近更新 更多