使用 UNIX Shell 编写您自己的图像库应用程序

作者:Girish Venkatachalam

如今,数码摄影已变得非常普及,即使是中档手机也能拍摄照片。将照片传输到 PC 后,您需要能够与朋友和亲戚分享它们。大多数数码相机生成如此高分辨率的图像,以至于直接通过电子邮件将它们发送给人们并不总是方便的。

这时您需要一个在线照片分享网站,例如 flickr.com,以帮助您通过上传照片来简单地分享照片。当然,您也可以使用 gallery2 等工具来完成繁重的工作。

但是,在本文中,我将讨论如何利用 Linux 命令行的功能来创建图像库。

Linux 图形工具简述

你们都听说过 GNU 图像处理程序 (GIMP)。它对于交互式图像处理、照片修饰和其他编辑目的非常有用,但我发现它很难使用。通常有更简单的替代方案,可以在常见的图像编辑方面做得更好。这些替代方案的好处在于您可以直接从强大的命令行运行它们,这可以节省时间并方便轻松编写脚本。以下是一些我感兴趣的此类工具

  • qiv:这是最快的工具之一。它很轻巧,并且可以在命令行上处理大量图像列表。实际上,您可以使用 MPlayer 的 -vo jpeg 或 -vo png 驱动程序转储帧,并使用以下命令查看它们,从而重现视频的“视觉暂留”效果qiv *。按空格键可获得与实际观看无音频视频相同的效果。

  • xloadimage:xloadimage 或 xli 是另一个用于查看图像的应用程序。

  • xv:这个现在已经相当过时了,但值得一看。它的一些图像处理算法很酷。

  • tgif:tgif 与 dia、xfig 和其他工具一起,最适合创建技术图纸、框图等。我发现 tgif 在处理某些常见的图像处理任务(例如生成图像拼贴或马赛克以及用文本注释图像)时非常用户友好且功能强大。

  • Netpbm 套件:此套件包含 200 多个命令行实用程序,用于主要设计为从 Linux 命令行调用的高级图像处理目的。

  • ImageMagick 套件:此套件可以描述为图像处理的终极工具。它具有令人难以置信的功能,可以创建动画、徽标、转换文件格式,当然还可以进行高度复杂的图像处理。访问 www.imagemagick.org/Usage 了解其所有功能的详细信息。

在本文中,我主要关注使用 ImageMagick 工具包来创建图像库。

一些基础知识

显然,您会希望该图库是一个 HTML 页面,以便与朋友通过 Web 共享。

第一步是为所有图像生成缩略图。这些缩略图必须使用 HTML 标签链接到图像。但是,在此之前,您需要注意图像的不同方向。不同的照片可能有不同的尺寸,您应该能够根据尺寸对缩略图进行分类。这不是硬性规定,但我更喜欢这种方式。

下一个任务是使用相关文本注释图像,通过在图像下方或上方添加水印。ImageMagick 拥有丰富的工具箱,可以优雅地完成此任务。

您还需要能够检索、保存并选择性地显示照片中嵌入的 EXIF 数据。注释图像后,您可能希望生成边框、框架或 3D 浮雕,以获得更好的视觉效果。通常,它们在白色背景的网页上看起来不错。

另一个锦上添花的功能是能够生成黑白照片等效物。当然,除了所有这些之外,如果用户想要下载原始、未触及的、原始的全尺寸照片,他们应该能够做到。为所有照片提供一个单独的 zip 文件下载链接可能是有价值的。

对于不喜欢单击每个缩略图的人,您可以提供幻灯片。但是,在 Linux 上,您可以做得更好。您可以创建带有声音效果的完整视频。我喜欢一段优美的 MIDI 音乐,适合快照的场合和情绪。这还有一个附带的好处,是可以直接写入 DVD。

但在此之前,最好先创建每张照片的垂直和水平镜像图像。这样,视频具有更好的流畅性和视觉吸引力。碰巧的是,使用 Linux 命令行和 ImageMagick 非常容易做到这一点。

您可能有其他要求,例如校正曝光、亮度或对比度,裁剪图像的某些部分或使用更有趣的效果进行照片修饰。同样,ImageMagick 可以完成这项工作(qiv 和其他图像显示工具也可以)。要校正图像,您可能更喜欢交互式工具,例如 The GIMP 或 tgif。

还存在其他可能性,例如创建用漂亮的字体注释的图像马赛克,但这在图像库应用程序中没有多大意义。

现在,让我们开始进入正题。

任务代码

最好使用 /bin/sh 作为编程语言。由于所有工作都已经通过命令行实用程序以最优雅和自然的方式完成,您只需要使用适当的开关调用它们并生成简单的 HTML 代码,类似于 google.com。

首要任务是将图像根据每个图像的尺寸和方向分隔到不同的目录中。这可以通过以下代码块轻松完成

#!/bin/sh

# script to segregate images based on dimensions

for image in *jpg
do
dimension=`identify -format "%wx%h" $image`
# we don't want mkdir shouting at us for 
# directories that exist!
mkdir $dimension 2>/dev/null 
mv $image $dimension
done

现在我们拥有了所有尺寸相同的图像,整齐地排列在单独的目录中。让我们继续为它们中的每一个生成缩略图。此脚本生成缩略图

#!/bin/sh

# script to segregate images based on dimensions

# this is where we have all the thumbnails for each of the
# images classified by dimensions above
mkdir thumb
for dir in `ls -F |grep / | grep ^[0-9] `
do
 mkdir thumb/$dir 2>/dev/null
 cd $dir
 width=`echo $dir | cut -dx -f1`
 height=` echo $dir | cut -dx -f2 | cut -d/ -f1 ` 
 for image in *
 do
   convert -size ${width}x${height} $image  -resize 20% \
	   ../thumb/${dir}thumb-$image
 done
 cd ..
done

使用 ImageMagick,您可以使用几个不错的功能来装饰缩略图,它们看起来令人印象深刻。

1) 带有厚度和阴影的缩略图

$ convert rose.jpg -matte \
    \( +clone -fx DarkSlateGrey -repage +0+1 \) \
    \( +clone -repage +1+2 \) \
    \( +clone -repage +1+3 \) \
    \( +clone -repage +2+4 \) \
    \( +clone -repage +2+5 \) \
    \( +clone -repage +3+6 \) \
  -background none -compose DstOver -mosaic rose-thickness.jpg

2) 凸起的按钮效果

$ convert -raise 8x8 rose.jpg rose-raised.jpg

3) 向缩略图添加框架

$convert -mattecolor peru -frame 9x9+3+3 rose.jpg rose-frame.jpg
Writing Your Own Image Gallery Application with the UNIX Shell

图 1. 带框架的图像

接下来,让我们看看使用 ImageMagick 注释图像的一些有趣方法

1) 左下角带有垂直方向的文本

$ convert rose.jpg -font helvetica -fill white \
  -pointsize 20 -gravity southwest -annotate \
  270x270+15+0 'Nice pink rose' rose-text.jpg
Writing Your Own Image Gallery Application with the UNIX Shell

图 2. 带文本的图像

2) 框架上的文本

$ montage -geometry +0+0 -background white -fill \
  brown -label 'Nice pink rose' rose.jpg rose-text.jpg

请注意,您可以为 -background 和 -fill 开关指定任何颜色。要查找 ImageMagick 支持哪些颜色,请键入

$ convert -list color

3) 您也可以像这样添加水印

$ convert rose.jpg -font helvetica -pointsize 20 -draw \
    "gravity south  \
      fill black text 0,12 'Nice pink rose' \
      fill white text 1,11 'Nice pink rose' " rose-text.jpg
Writing Your Own Image Gallery Application with the UNIX Shell

图 3. 带水印的图像

4) 像这样在顶部标记图像

$ convert rose.jpg -gravity North -background green \
  -splice 0x18 -draw "text 0,0 'Nice \
  pink rose' " rose-top.jpg

您可以使用 mencoder 或 FFmpeg 从图像创建视频。但在此之前,让我们首先创建快照的水平和垂直镜像图像。在播放视频时将图像与镜像结合起来会很有趣

$convert rose.jpg -flip rose-flip.jpg
$convert rose.jpg -flop rose-flop.jpg

这两个命令分别创建垂直和水平镜像图像。

您可以使用 append 开关将镜像与原始图像组合以进行转换

$convert rose.jpg rose-flip.jpg -append rose-vertical.jpg

如果您指定 +append 而不是 -append,它会并排创建图像,这正是我们想要对水平镜像图像执行的操作

$convert rose.jpg rose-flop.jpg +append rose-horiz.jpg

您可以考虑使用 -resize 选项或 -scale 选项将所有图像转换为相同的尺寸

$ mencoder "mf://*.jp" -mf fps=0.5:type=jpg -o \
  image-video.avi -ovc lavc -lavcopts vcodec=mjpeg

这将创建一个图像视频,其中所有图像以每两秒一张图像(fps=0.5)的间隔依次显示。但是,请记住,所有图像都需要具有相同的尺寸,否则这将不起作用。

现在,您可以将此与一段优美的音频文件结合起来,以创建一个可在 DVD 上播放的视频

$ lav2yuv +n image-video.avi | mpeg2enc -f 8 -o image-video.m2v
$ mplex -f 8 audio.ac3 image-video.m2v -o final-video.mpg

现在,只需将 final-video.mpg 复制到您的 DVD 中即可。

您可以使用此命令生成彩色图像的黑白等效物

$ xloadimage rose.jpg -dump jpeg,grayscale rose-bw.jpg
结论

要创建图像库应用程序,您需要获取缩略图、图像边框样式、背景音乐的音频文件以及用于注释每个图像的文本。您还可以让用户有机会指定特定的注释样式。

获得这些输入后,您可以使用命令行 ImageMagick 工具创建图库,并使用简单的 shell 脚本将它们全部与 HTML 链接在一起并生成网页。

Girish Venkatachalam 是一位密码学家,拥有近十年的各种现代 UNIX 系统工作经验。他从头开始为路由器上的 Nucleus OS 开发了 IPSec,并与 Apache、OpenSSL 和 SSH 的核心组件合作。可以通过 girish1729@gmail.com 与他联系。

加载 Disqus 评论