规范性图片文件名整理系统的构思,用以解决图片整理、检索的问题

背景

我们都拍过许多图片、视频,但它们的整理和检索是一件麻烦事。

我的手机拍了几千张图,放在电脑上以便查看,前几天我才看到了一张蜻蜓的照片,结果,第二天,我想找它,使劲翻也没找到,幸亏我记得它是在我老家市区拍的,根据GPS信息,才定位到了它,那是 2018 年夏天拍的一张图。

这就让我想:如果一张图经过了编辑、上传、下载,里面的 EXIF 信息都被清除了,拍摄时间没了,拍摄地点没了,放在一大堆上千张的图片中,我该怎么找到它?

或者说,在将一张有意义的图片放入上千张图片的图库之前,我应该做一些什么措施,以确保我以后可以很快找到这张图片?

现状

手机端

在手机上,我们有手机相册,例如小米的相册、谷歌的相册,如果你不介意照片隐私,可以开启他们的云服务,这些公司会使用经过大量用户照片训练过的智能引擎,为你的照片做一些基本的分类,例如:

  • 人脸识别
  • 风景识别
  • 文档、证件识别
  • 物品、动物识别
  • ……

然后再为这些识别结果做 智能相册 ,这非常方便。但上述这些功能的前提是:

  • 使用他们的相册软件
  • 使用他们的云服务

所有这些识别结果,仅仅在 相册 APP 内部可用,出了这些 APP,你无法使用所有上述的智能识别结果。

如果你在电脑上整理图片,上面的识别结果你一个也用不了。

上述的功能也受限于软件,如果你相给照片添加自己的备注,批量添加自己的标签,对不起,做不到。

电脑端

素材管理软件

在电脑端,有一些出色的照片管理软件,国产的有:

  • Eagle(收费)
  • BillFish(目前免费)

这两款软件,都能为图像进行智能整理、打标签、添加备注。但是所有的标签、备注都是在他们自己的数据库中存储,如果脱离了这两个软件,或者将图片拷贝到其它存储位置,那些标签、备注都不会跟随文件。

同时,上述两款软件,他们都是用的自己的数据结构,来存储图片信息:

  • Eagle 将每张图片单独储存在一个乱码名字的文件夹中,文件夹中放一个 json 文件以存储元数据
  • Billfish 保留了原始文件夹结构,但标签、备注信息存储在单独的数据库

在使用中,上述软件都有共同的问题:需要导入,导入过程有各种问题,例如:

  • 有些格式不支持
  • 导入速度很慢

总之,就是让人使用不放心。

基于文件系统的照片管理器

另外,还有一些老牌图片管理软件:

  • ACDSee (现在广告有点多)
  • digiKam
  • XnView MP
  • FastStone Image Viewer

这几个软件在浏览管理图片方面,还是不错的,尤其是 digiKam 还提供人脸识别分类功能。

但它们的共同点是:没有办法为图像添加文字描述信息,以方便以后通过文本搜索照片

严格意义上,也倒有:一些软件可以为图片添加描述信息到同目录的 descript.ion 文件中,它其实就是 description 文件名加了个点,里面的内容是 "文件名" 描述 ,每行一个描述。

但这个方法不太优雅,会有这样的问题:

  • 不同软件对 descript.ion 的编码不同,有的使用 gbk 编码,有的使用 utf-8 编码,由于编码没有标准,会乱(中日韩文字的痛点)
  • 一旦文件名更改,descript.ion 是不会自动改的
  • 一旦移动到其他文件夹,descript.ion 里的信息也不会随之移动。

要求

我希望,能给文件添加标签、文本备注、人物名称、拍摄时间等可搜索的文字信息,这些信息要能够尽可能:

  • 随着图片移动而移动
  • 不会因编辑图片而丢失
  • 可以跨平台
  • 最好能够方便使用各种第三方软件搜索

提出解决方案的过程

能够做到我的要求的,只有文件名了。

因此,要设计一套语法规则,类似 Markdown 的标记语法,用于记录照片、视频的关键信息。

设计需求

这套语法需要能做到:

  • 将一些关键文本信息写到文件名中
    • 在记录备注时,最好能记录多行文字,而不是一大坨文字备注
  • 不同类型的信息要有区分,方便软件、程序识别
  • 最重要的:一定要美观,即便在资源管理器中显示,也要好看!

文件名限制

长度限制

其实不同系统对文件名长度是有限制的,我查阅了一下:

  • Windows 255个字符
  • Android 255字节
  • Linux 255个字节

字符限制

而文件名字符也有限制,有些字符不能用:

< > / \ | : " * ?

可用的英文键盘特殊符号有:

$ # & @ ( ) - [ ] ^ ~ 等以及其它字符

初步方案

参考自 Taglyst,我构思了初步的照片整理文件名标准

语法定义:

(YYYYMMDD-HHMMSS)标题名#标签1#标签2@名字1@名字2^用户评论&换行后的评论.ext

示例:

(20200102-130843)酥肉汤#美食#老家@李明@刘大龙^我和李明在他家,第1次学了炸酥肉,煮了汤&他表弟在旁边捣蛋.mp4
(20190207-105303)合影#过年#走亲戚#老家@唐语^二姨家来走亲戚,和表姐合影.jpg

语法设计解释

  1. 开头有一个括号括住的时间戳,它有这样几方面作用:
    • 字符开头,使得标注过的照片,以文件名排序时靠在前排
    • 这样的时间戳格式比 14 个数字连成一坨要美观
    • 记录照片拍摄时间,即便以后因为各种原因, Exif 中的拍摄信息丢失,也可以根据文件名信息,修复 Exif 中的拍摄时间。这对于使用拍摄时间进行排序相当重要。
  2. 文字标题,就是一个简短的标题,有没有都行
  3. # 开头和作为分隔符的一个或多个标签,符合用户对日常生活中标签的映像,看文件名时,方便理解这是标签。
  4. @ 开头,标注人物,符合在社交媒体上 @用户名 的思维,也是为了方便理解
  5. ^ 作为注释(评论)的开头,之后所有的文字都是注释;以 & 作为换行符。原因是:
    • 前面的内容与注释之间需要一个符号分隔
    • 这两个符号在日常注释性文字中不大可能用上
    • 注释不能是一坨,有分段的需求,就要用一个允许使用的、方便输入的符号,作为换行符的标识

下一步,程序实现

如果定稿了语法,就可以设计一个程序了,它可以是

  • 脚本
  • 各种语言设计的 GUI
  • Quicker 动作

使用方法是:

  1. 选中图片,觉得应该添加些文本信息

  2. 按下快捷键,唤起程序

  3. 程序获取文件路径、元数据时间戳,解析文件名成分,弹出一个提示框,有多个输入框,分别用于填:

    • 标题
    • 标签
    • 人物
    • 注释

    如果文件名中已经有上述语法,就应该解析后,预填入各个输入框中,以便修改

  4. 点击完成,根据设计的语法,合成为规范文件名,为照片、视频重命名。

结语

具体实现的程序、小工具,技术要求不高,只要花些时间,肯定能写出来。我现在还没时间写,但是脑海中弹出了这样一个问题解决方案,还是该用文章写出来。

思想方法指导实践,实践前,多完善思想方法,可以事半功倍。

以上就是我为文件整理所构想的一个解决方案,发出来,希望否能收到一些建设性、启发性意见、想法,希望大家不要吝啬想法呀!

更新

在此方法基础上,我拓展出了可以适合大部分文件的通用命名系统:元数据文件命名法

3 Likes

我自己写了一个,就是 标签 关联所有照片。
标签是通过treeview管理维护,可以非常具体、层次化。
win32桌面程序,使用sqlite存储查询

1 Like

:+1:技术贴
不错的整理思路,感觉这套命名法很完美了,期待最终成果

我现在在用Eagle养老,确实有你说的那种现象,但是懒得换方案了,之前挖的坑太大,不好填,现在就是定期整理一下。

:+1: 我一般只有活动才会拍照片所以通常按照日期/活动建相册就能整理好大多数照片 :rofl:

现在我用表格作界面来管理各种文件。

  1. 可以直接通用表格来打开文件
  2. 上传文件时,直接按表格中的元素命名文件,免去想文件名的麻烦;
    上传文件时,也可以把文件上传至自己的服务器,本地文件丢失也无所谓,可以直接打开服务器上的文件 。命名规则如果考虑不周的话,直接从自己服务器再取回就是最新的文件规则了。
  3. 表格数据非常有用,可以拿来生成word,在线填表。
    GIF

如果文件名也改变了怎么办?例如用社交软件直接发送时文件名变了,除非打个包。

实际上,IPTC,就是来解决图片的元数据存储和检索问题。
IPTC是一套专门设计用于保存照片属性的通用标准。如果你之前使用了Adobe Bridge之类的软件来管理你的素材,那么已经设置保存过的标签信息便都可以无缝的继承过来,避免了重复录入的繁杂手续。

元数据是写入图片本身,用支持IPTC的软件,一般都是可以做到检索和管理。


2 Likes

和我的想法比较类似,有一点点差别
我主要是用python写脚本来实现,所以:
1、#tag,但我一般后面会加个空格,这样提取tag内容时,会相对简单一些,#和空格,或#和点(扩展名前就不加空格了)
对tag的处理:
问题:
1、tag用久了就会知道,存在相同词义,但不同写法的情况,毕竟不可能每次写入tag时都查一下之前用的什么
2、tag存在级别,即父子关系,这样检索时可能会便利一点。
3、某些tag可能存在同时等同或覆盖其他tag的情况,这个和前一条不太一样,而是比如说,某个朋友特别喜欢拍搞笑照片(即一个人可能同时覆盖了多种情况的tag),那么当tag中出现了他的人名时,可以等同其他n的tag的设置
4、tag的设置很麻烦,其实3更多是为了简化操作。
另外,我个人观点是,为了后续便于以防万一的查找而耗费大量时间精力去做设置很是麻烦(所以我一直不太喜欢图形界面给n多格子添对应内容的方式,远不如改文件名省事),用3的方式,可以实现不够精确、但足够简化的设置,可以逐步自己构建一些覆盖关系的特殊tag名称,输入时就直接用这个特殊名称,缩减检索范围,等到真的用的时候,再修改完善好了。
另外,3的方式,有时候有些内容放在一个文件夹里时,也可以对这个文件夹来替代覆盖关系的特殊tag(当然简单方式是直接在文件夹上设置tag)

目前的解决思路:
1、我目前的打算是,后面做一个csv(其实用excel也行,python也支持),然后用py来检索所有既有文件名称中符合前述tag规则的tag名称,导入这个csv
2、tag的分级:这个用二维表格的方式可以很容易的实现那个父子关系,更多级的关系也不是不可以,比如一个子tag同时隶属于两个父tag,或者其他什么特殊情况。
3、这样的方式,可以手动设置父子关系,也可以#父tag-子tag等,同时可以在这里面处理同义不同名的情况。以及,新增的tag,但是没有做相关归类的情况
4、同时,tag存在不同维度的问题,也可以在这里解决。

输出:
1、最简单的输出方式自然是everything,这个简单实用,但是前述tag父子关系等可能就无法实现了(其实也是可以的,在手动处理tag关系后,让python自动查找对应文件,然后修改就是了,但这样会造成文件名称很长,是不是值得有点犹豫)
2、第二种方式,是有其他Hotkey一类输入时来解决,比如输入了父tag,自动弹出子tag的备选,或者是父子tag全都列进来(符合everything语法那种格式),直接在everything检索时使用。或者是新增某个tag时,自动出来备选,便于选择,解决同义不同词、备选等问题。不过我没用过Hotkey,也不知道这个能否用python解决csv修改,hotkey自动修改的问题,所以,纯属臆想。
3、python单独做输出,好处是,可以用备选的方式不断缩减范围,前述所有tag父子关系、维度等都好办,这里,在tag输入差不多时,也可以进行文件名中非tag内容的检索。
然后,输出界面是个问题,由于我不像做单独的软件界面,所以打算这样变相解决:创建一个临时文件夹,然后把不断缩小检索范围的文档做快捷方式到这个临时文件夹(win中,快捷方式也可以显示缩略图等)中,如果反应速度足够快,其实也可以从第一步第一个tag开始就生成快捷方式,然后随着不断筛选tag,而实时变动。

大概思路是这样,估计实际操作时,会遇到n多难题……
另外,其实我一直想把印象笔记和文件的tag统一到一起,理论上EverNote当初很多东西都是开放的,是可以获取EverNote的tag以及写入,那么用一个csv就可以把n多分散的tag统一到一起了,不过这个还得查KPI,就更是遥远的事情了。

另外,我这个思路其实起点并不是管理图片,而是管理工作文档、电子书、电子资料的tag(照片其实我个人一般没啥兴趣看),尤其是和印象笔记里面的tag公用的问题。还算具备较强的通用性。

如果是自己给自己发,不用社交软件……
如果是别人发给你的,反正也不符合你的命名规则,怎么都得自己改啊

再发一遍自己的表格上传,本地文件命名可以这样
本地文件不见了,也无所谓,从网站(最好自建)上重新下载即可

可以试试DTE(https://meta.appinn.net/t/topic/24381)
1、采用标签树形式管理和组织用户自定义的标签,可以很大程度上避免时间长了想不起来以前用的什么标签的问题。
2、标签之间因树的存在而存在父子关系,方便检索。
3、支持文件名标签管理和外部数据库管理法。

我有大量图片要管理,试过各种方案,还是文件名最简单可靠。只是目前没有和楼主想法完全一致的 Quicker 动作,我用的是这个:批量文件名标签 - 动作信息 - Quicker

有些期待楼主方案的 Quicker 动作:sunglasses:

1 Like

看了软件介绍,感觉很是不错,尤其是看着文件直接添加标签的功能,回头尝试一下,感谢推荐!