发布时间:2007-08-30 11:40 原文链接: 数码照片web处理

首先是你要得到多么好的一张照片。怎么样来定义好呢?700万像素算不算好呢,当然好了,这意味这你的文件可以冲出20寸的大照片来,但实际上家用的相片除了6寸或者7寸的,很少冲那么大的照片,200万像素足够了。而且web上的照片实际是在显示器上显示的,所需要的像素数甚至更少,以800x600为例,这样的图片基本可以充满而且不必横向滚动网页,还不到50万像素。很多时候,为了减小传输的负担,缩小图幅是最有效的缩减文件尺寸的方法,这意味着为了在web上使用照片,不管你的数码相机的像素有多高,最后都会减到像素最低的相机的水平。所以像素值就其本身而言没什么意义。

如果不就其本身而言,像素值就有意义了。因为通常高像素的相机都有一个相当好的镜头,一个好镜头焦距范围更大,能拍到一般镜头拍不到的更近或者更远的地方;有更宽的视角,能拍出雄壮的景色;有更大的通光量(光圈),能拍黑暗环境的景色,或者能以很高的暴光速度拍到运动的景象。总之能拍出超过视力观察范围之外的东西,通常也是更有趣的照片。更让人想不到的是,好镜头产生的照片的尺寸也小,这好像有违常理,因为照片占的空间应该只和照片的分辨率相关才对。

我原来也是这么想的, 但一个镜头是24-120mm f/3.5-5.6的相机拍了一张2256x1496分辨率相片有790k大小,而一个4.5-45mm f/1.8镜头的相机拍了一张1600x1200分辨率相片有720k大小,这两张照片的拍摄环境和景物很相似。如果把两张照片都缩到640x480图幅,前者的大小只有后者的一半,这一倍的差别是怎样产生的呢?是噪声,因为差一些的镜头的光圈小,通光量不够,也许是差一些的镜头感光元件也差一些,照出来的照片仔细观察的话都会有噪声点,你能在蓝天中发现红色的小点。正是这些小点干扰了JPEG的压缩算法,因为临近的像素越相似,压缩的效率越高,而噪声点使得本该相似的临近像素不相似了,所以不如信噪比高的相片压缩得多。为了证实这个想法,我找了一个降噪的插件在gimp里面试了一下,如果噪声除得比较狠,尺寸能缩减1/4,不过这样搞过的相片很模糊。

其实这个问题没有什么好解决办法,最好用数码相机的镜头拍数码照片(废话?),如果用摄像机的镜头拍,就只能在光线充足,拍摄对象稳定的情况下拍出噪声干扰小的照片。又因为每一张照片的情况不同,所以要在人眼干预的情况下用软件降噪才能有可以接受的效果,这样就没法把这件事情自动化。其他的减小照片尺寸的办法,改变格式,减少颜色数,等等效果都不如改变图幅明显,也许对png减少颜色数的效果很明显,但jpg是更合适的图片格式。

其次是照片的共享管理,最基本的管理工作就是搜索,要在海量的照片中搜索需要某种索引机制,文件名/目录名太简陋,exif正是为此而来的。现在能塞在图片中这一部分的内容是越来越多了,这里面有拍摄的相机,分辨率,白平衡,镜头,焦距,快门等拍摄时的条件,还有一个精确的拍摄时间,能精细到 0.01秒,我想将来肯定会有某种获取经纬度的装置出现在数码相机上,这样可以把拍摄时的地理位置加到图片中,现在有不少网站在IPTC的 keywords部分把经纬度加上然后就可以把这个照片钉在googlearth上。因相机而异,这一部分还包含一到两张缩略/预览图。就是说现在数码相机拍出的照片中其实包含着2~3张照片,这样照片处理软件不用读完整个文件的数据,只要跳到一个偏移位置上读一小段数据就能立即得到一张缩略/预览图。目前这一部分大的话需要60k左右,而且以后肯定会占更大的空间,也许还有使用xml的趋势。

可能为了减小尺寸有必要把这一部分去掉,但至少要保留IPTC:keywords部分,因为象flickr,picasaweb这样的网站就是用照片中的这个字段来作索引的。处理exif的软件有很多,有个perl语言写的工具叫exiftool非常强,可以用这个工具做任何有关exif的可以自动化的事情。还有一个专门给照片加tag而设计的软件,用python写的,jbrout,可以把某个tag拖到一堆文件上面,是我用过的最快的操作exif的软件。

可能还有一些处理web照片的时候需要的功能,比如简单的修改,生成web发布用的网页,上传。我发现没有任何一个软件能做到在所有方面都比较出色的,比如gimp的编辑功能非常强,应该和photoshop不相上下吧;虽然它也支持脚本但是如果修改是针对大量文件的话,它并不如命令行的工具,比如 ImageMagick的convert锋利。jbrout虽然也有上传到flickr的功能,但是你的帐户必须是老的,老到flickr还没有和 yahoo合作以前的帐户。我找到一个用perl写的工具,用flickr网站的api上传,不必和用户关联,认证起来很简单,使得上传和复制一样方便。也有人把这功能做成nautilus的插件,nautilus也能浏览照片。nautilus的竞争对手konqueror,却可以很方便的生成web发布。类似acdsee的软件多如牛毛,但我觉得没有必要用这类软件,因为每一个桌面系统的文件浏览器的图片浏览功能做的都不差,差不多足够用了,我就用 nautilus/konqueror,挺不错的。

上面这些软件差不多都是在一个移植性很强的语言或者库平台上写出来的,perl,python,gtk(好像他本身就是从gimp的项目中来的), ImageMagick...他们已经在各种各样的平台上有移植,所以其他操作系统的用户也可以尝试一下这些出色的软件。我曾经觉得picasa可能是个很快很全的东西,但其实他的linux移植似乎是一个公司催逼出来的那类应付公事的东西,它用wine!表现非常差呀,也许windows的用户比较喜欢它,听说微软要发布的vista中也有一个功能强大的照片管理工具,不知道怎么样。

我的使用办法就是先用jbrout给照片做tag,分类;然后使用exiftool/imagemagick这样的工具处理要上传的照片;最后用flickr_upload上传到flickr网站,或者用konqueror在apache上发布。

gimp开发环境,装dcam noise插件必须:
apt-get install libgimp2.0-dev

dcam noise插件:
http://registry.gimp.org/plugin?id=5610

exiftool:
wget http://www.sno.phy.queensu.ca/~phil/exiftool/Image-ExifTool-6.49.tar.gz

jbrout:
apt-get install jbrout

flickr_upload:
wget http://cpan.linuxforum.net/authors/id/C/CP/CPB/Flickr-Upload-1.22.tar.gz

ImageMagick:
apt-get install imagemagick

一个可以把find,ls的输出当参数的脚本

#/bin/bash
# -o mean only resize pics ,do not upload them
if [ $1 == "-o" ];then
only=true;
shift;
fi

total=0;
ac=0;
while [ $# -gt 0 ] && [ -s $1 ];do
echo "resize $1...";
convert -resize 640x480 $1 "/tmp/_$1";
if [ $? != 0 ];then
echo resize false;
exit 1;
fi

quant=$(($(du -b $1|awk '{print $1}') - $(du -b "/tmp/_$1"|awk '{print $1}')));
ac=$(($ac + $(du -b "/tmp/_$1"|awk '{print $1}')));
echo ok,reduced $quant bytes;
total=$(($total + $quant));

exiftool -fast "/tmp/_$1"|grep Keywords;

if [ $only != "true" ];then
flickr_upload "/tmp/_$1";
if [ $? != 0 ];then
echo upload false;
exit 2;
fi
fi
shift;
done
echo all reduced $total bytes,total size $ac bytes;

转自:http://bartuer.3322.org/blog/cgi-bin/blosxom.cgi/think/tech/digital_image_process.wikieditish