基于目录的网络相册软件:Singapore
davies 发表于 2007 年 04 月 22 日
随着数码相机等的普及,数码照片日趋泛滥,几乎看都看不过来了。由于照片数量巨大,传统的通过web方式上传照片的方式变得不再有效。这些照片在文件系统中通常是通过数型目录的方式进行管理的,如果能够直接根据数型目录生成相应的相册,将会使把本地资源通过网络相册的方式来分享变得非常容易。
清华大学山野协会经过十几年的发展,已经积累了三十多G的照片(包括以前的扫描部分),而且还在以每月上G的速度增长。曾经想把这些宝贵资料搬到Google PicasaWeb上去,经过几天的尝试,觉得工作量实在是大,最后暂停工作。这些照片都是在协会服务器上按照年份整理好的,非常需要一个基于目录的网络相册软件。
snakesu推荐了miniShowCase和Singapore,经过试用,发现Singapore基本符合我的期望。它能够根据目录自动动态生成相册,其它相关数据存储可以采用MySQL、SQLite或者csv文件的形式。前端页面由模板生成,自带的模板效果很不错。它是用PHP实现的,安装和管理非常简单,代码也采用面向对象的方式写的,很直白,注释丰富,修改很容易,这一点非常重要。
在实际使用过程中,发现一些细节不太理想,于是做了一些Hack:
不知为什么,它对所有请求做了HTML转译处理(singapore.class.php文件的107行),导致所有带有中文名的内容无法访问,注释掉那一行就搞定了。
默认生成的缩略图等信息存储在照片的源目录中,我把它们设置到专门的目录中,这样就不需要原照片目录的写权限,保证安全性,同时能够保持原目录的干净。
优化了生成缩略图的方法,原来会使用ImageMagick或者GD创建100x100,80x80和50x50的三种缩略图,效率非常低。当处理比较大的照片时,会占用大量内存,我的服务器的320M内存根本撑不住,有一次把耗尽了所有内存,服务器瘫痪了几个小时,表现为可以连接但是长时间没有响应。不过最后内核杀掉了PHP-CGI进程,居然活过了来,真是神奇,可见Linux的可靠性不一般呀。现在改成了尽量用JHead来提取照片中已有的缩略图,如果失败则用convert加-sample参数来生成固定尺寸的缩略图。经过这样的优化,即使是第一次访问某个相册也不需要长时间等待了,响应比较快。正如批量处理数码照片相关上文中所说的,这种方案会导致浏览缩略图时画质下降,也还可以接受啦。同时将大量用到的两种尺寸的缩略图缩减为一种。
在原系统中,将文件夹分为带有子目录的Gallery和只包含有照片的Album两类,假定Gallery中不直接包含照片,这样导致既有子目录又有照片的目录中的照片无法看到。最好的处理方式是将他们统一对待,但改起来有点费劲,就做了简单的调整,将Gallery和Album的判别方式改为比较子目录和照片的数量,并将Gallery的照片和Album中的子目录也一并显示出来,通常都比较少。
出于性能方面的考虑,现在的Gallery还不能够选择封面,于是加了一个默认封面,勉强凑或。以后有时间了再改进Gallery和Album的封面处理方式。
虽然做了一些改进,但是还有不足:用户不能做基本的修改操作,比如旋转。导致我用JHead和Picasa结合的方式花了一整天的时间来旋转照片:-) 要实现的话也不难,就是担心简单的实现方式会让机器人乱点链接导致反复旋转,而且还需要对照片的写权限,不安全。另外一个就是匿名评论功能,有这个的话可以给多人分享照片增加很多乐趣。官方可能会做这方面的工作,就先放着吧。
以上所做修改是基于singapore-0.10.1进行的,具体的修改内容可以查看diff文件(不一定能用patch直接应用)。
已经使用Hack过的Singapore把山野的相册做好了,欢迎访问。