批量处理数码照片相关
davies 发表于 2007 年 04 月 22 日
两周前写了关于批量更新数码照片时间的文章,使用的是 Perl 实现的 ExifTool,非常强大,除了速度有点慢以外。前两天发现了一个更针对常用的处理数码照片操作的更好的工具JHead,它是用C实现的,速度更快。作者是根据处理的照片的实际需求而作,非常贴合实际,目前的最新版已经到2.7,比较成熟和稳定,在Gentoo中可以直接安装:emerge jhead。
具体的使用方法请看官方文档,下面简单列举几个我用到的功能:
自动旋转照片:jhead -autorot photo.jpg
它会根据某些数码相机记录下的拍摄信息自动旋转照片,并适当处理相关EXIF信息,包括缩略图。在要批量自动旋转大量照片是用它的通配符展开还是觉得不太爽,可以结合find来处理,比如把当前目录下的所有照片都自动旋转可以这样:
find . -type f -exec jhead -autorot '{}' \;
Windows自带的图片和传真查看器居然不会处理EXIF,令人发指,建议不要使用它来旋转照片。对于那些不包含旋转信息的照片,用 Picasa 来处理还是很不错的,会将缩略图跟照片同步起来。只是它总是要备份照片到名为"Orinigals"的子目录中,没得选择。可以用下面的命令一次性删除:
find .-type d -name Originals -exec rm -rf '{}' \;
导出照片中的缩略图:jhead -st thumbnail.jpg photo.jpg
网站上为了浏览图片时更迅速,需要生成缩略图。使用GD或者ImageMagick等工具来处理时,需要解压缩图片再进行放缩,还是比较慢的。而从数码照片直接提取已经生成好的缩略图时,速度要快上一个数量级,所消耗内存也非常小,在需要实时生成缩略图的应用非常有用,比如第一次浏览基于目录的相册Singapore时。但是这种方式也是有代价的,因为照片中的缩略图是事先生成的,尺寸未知,很可能跟实际用来显示的大小不一致,这样浏览器再重新进行大小调整时会时画质下降很多,影响浏览时的视觉效果。缩略图的作用也就是让用户大概知道是什么内容,这方面的要求还是可以基本满足的。
另外,再用ImageMagick的convert来生成缩略图时,建议采用-sample参数而不是-resize或者-geometry,前者会比后者快三倍。比如:
# time convert P4175994.JPG -resize 100x100 1.jpg
real 0m2.268s
user 0m2.114s
sys 0m0.122s
# time convert P4175994.JPG -sample 100x100 1.jpg
real 0m0.881s
user 0m0.772s
sys 0m0.108s
处理数码照片的拍摄时间方面,更是方便,可以直接相对调整照片的牌是时间,根据拍摄时间调整文件的修改时间(便于做排序),可以根据拍摄时间来格式化文件名等,非常贴心。
此外,还能操作JPG文件中的评论文字,根据文件比例选择文件,比如选择所有竖型照片。看看它的参数说明文档就非常清除了。