目前市面上有相当多的素材管理软件,例如Bridge、Eagle等等,它们各有优劣。
知乎上讨论的关于Eagle对硬盘有所伤害的问题,并不能够确定,因为双方至始至终没有提供一个性能图表。
最新的同类软件是billfish,在发布伊始就受到了很大的关注,一开始就主打C++技术并以性能作为优先考虑;虽然性能对比图也并没有给出。
从发布的时候,我就下载了该软件,进行了技术上的评估。
1. billfish采用的是Qt开发,因此界面风格偏向于古老,虽然能够用来做跨平台开发,但是更多使用在非PC平台。
2. 众所周知的原因,C++开发速度慢,即使是经验丰富的开发人员,也不能保证完全没有crash的问题发生;而且为了更快的性能,使用了多线程技术。由于billfish诞生时间很短,崩溃问题在一段时间内将会频繁出现。
3. 对于本地数据库,billfish使用了sqlite。由于需要进行文本搜索,软件采用了腾讯某款名气不大的分词库,从技术上说,因为知名度低,使用的人少,所以踩坑很容易碰到无法解决的问题。
4. 对于主色调抽取,采用的是查找表技术。软件内部已经提前设置好了颜色种类。
一、问题
作为一个对图片有管理需求的用户来说,我比较关心如下几个问题:
- 存储的数据不能丢失。
- 丰富的检索功能。
- 多样化的存储支持。
- 多种类的格式支持。
- 好看而又易用的界面。
从技术上来说,sqlite能够比较好的完上面的第1个功能。
对于4这个需求,billfis采用了插件方式读取,因此后续对各种格式的数据读入是很容易的,然而由于UI采用的是Qt,所以界面的可扩展性不高,即使开放C++的插件接口,界面也较难美观的定制化。
对于3这个需求,billfish提供了多种存储方式,并承诺后续会提供更多的存储方式。
至于2这个需求,个人认为是一个考验算法架构能力的一个部分。牵涉到数据存储和检索,billfish如果仅仅只依靠sqlite自身的功能是不够的,需要有能力去对数据库本身做修改。
billfish在推出之时,卖点之一是快速的批量加载。然而这个功能并不是经常使用,只在第一次才会用到。从技术角度来说,加载的性能并不需要很高,而且由于加载操作是IO操作,完全可以与图像分析操作分离。
二、解决方案
鉴于上述讨论的这些问题,我开发并开源了一个图像管理软件(预计三月左右发布第一个不带色彩检索的版本):
https://github.com/webbery/civet
这款软件在设计初期兼顾了上述几个问题:
1. 一个好看的颜值是软件流行的一个重要因素之一,所以Electron是极佳的选择。
2. 因为Electron界面是js写的,因此设计良好的架构完全可以为插件开发者提供自定义界面功能,能够集中开源社区的力量,以支持各类格式。
3. 对于磁盘读写的问题,快速而又高效的方式是使用共享内存技术。而lmdb数据库能够非常不错的满足需求。事实上,已经有不少做图像处理算法的人,已经在使用lmdb来保存图片了。
4. 由于lmdb源码非常简单且协议友好,因此可以在这基础上进行修改,扩展新的检索算法。
5. 另外,可以支持成熟的中文分词算法,可以用来作为全文检索的分词器,而不是局限于sqlite中。
6. 最重要的一点是,所有已知的管理软件都是闭源的,而这款软件是基于MIT协议开源的,用户完全可以基于该软件进行再次开发,以满足自己的需求。
7. 跨平台的一致性(Mac、Win、Ubuntu)
最新研发进展可到github查看:https://github.com/webbery/civet。
欢迎大家支持,谢谢