Shell 技巧 - 在 Apache 中显示图像目录,第四部分
这是关于如何编写 shell 脚本以使图像目录的显示比默认 Apache ls -l 样式输出更有用的四篇专栏文章中的第四篇。ls -l样式输出。
在第一篇专栏中,我解释了如何放置一个脚本来改进 Apache 目录列表功能,在后两篇专栏中,我展示了如何在 shell 脚本中处理图像,包括一个 shell 函数,该函数可以从大多数图像文件类型中提取高度和宽度。
我在那一篇专栏的结尾留下了一个悬念,强调如果您真的想在命令行中使用图像,那么没有比 ImageMagick 更好的软件包了。 如果您的服务器上尚未安装,您将需要它来阅读本月的文章(www.imagemagick.org)。
图像尺寸函数 figuresize() 的首次尝试依赖于 file 命令来确定图像尺寸。 这适用于 GIF 和 PNG 图像,但事实证明 file 命令无法确定 JPEG 图像的图像尺寸,唉。 因此,我们需要使用 ImageMagick identify 脚本来重写它。 这是一个示例(已修剪)输出
$ identify teamgeist.jpg hentai-manga-example.gif archos-av700.png teamgeist.jpg JPEG 350x350 350x350+0+0 DirectClass 8-bit 62.7734kb hentai-manga-example.gif GIF 358x313 358x313+0+0 PseudoClass 256c ↪8-bit 86.4551kb archos-av700.png PNG 567x294 567x294+0+0 DirectClass ↪8-bit 341.498kb
请注意,在所有三种情况下,图像尺寸都显示为第三个字段,格式为宽度 x 高度(例如,archos-av700.png 宽 567 像素,高 294 像素)。
这意味着我们可以使用 cut 来仅获取这些值,并再次使用 cut 来去除第一个和第二个字段,就像这样
width="$(identify $1|cut -d\ -f3|cut -dx -f1)" height="$(identify $1|cut -d\ -f3|cut -dx -f2)"
如果我们添加一个 echo,我们就有了一个基本的图像尺寸 shell 脚本。 完成之后,让我们用 file 命令无法处理的 Archos PNG 文件和 Teamgeist 图像对其进行测试
$ sh myidentify.sh archos-av700.png archos-av700.png: height=294 and width=567 $ sh myidentify.sh teamgeist.jpg teamgeist.jpg: height=350 and width=350
完美。 figuresize() shell 函数接收一个图像文件名并设置全局变量 height 和 width,因此很容易重写它以与 identify 一起使用
figuresize() { width="$(identify $1|cut -d\ -f3|cut -dx -f1)" height="$(identify $1|cut -d\ -f3|cut -dx -f2)" }
这更小巧,效率更高,并且也适用于 JPEG 图像——可谓是全面胜利!
我们脚本开发的最后一步是让一行显示多个图像,因为我们现在可以根据需要缩小缩略图,无论它们是宽还是高。 在这里,我将其编写为并排显示三个图像,但如果您的屏幕更大,您可以对其进行调整。
为了在一个宽度不超过 700 像素的窗口中显示三个图像(以便轻松适应 800x600 屏幕),我们希望缩略图图像的宽度不超过 200 像素。 这意味着我们要调用 figuresize(),然后进行一些数学运算,以找出达到该最大值的最佳缩小尺寸。
挑战在于 shell 实际上不允许您使用浮点(非整数)数字,因此我们需要欺骗 bc 来为我们完成这项工作。 如果高度是较大尺寸,则如下所示
factor="$(echo "scale=4;$maxsize/$height"|bc)" newwidth="$(echo "$factor*$width"|bc|cut -d. -f1)"
为了弄清楚如何按比例缩放较小的尺寸,我们用 MAXSIZE/实际高度相除,这将是一个小于 1.0 的值,然后将其用作另一个尺寸的乘数。
例如,假设我有一张 313x358 的图像,但想按比例将其缩小到不大于 200x200; 因子可以计算为 200/358(或 0.558),然后将较小的尺寸乘以 0.558(即 313*0.558)以产生 174。 然后,按比例缩放的图像为 174x200。
在脚本形式中,这是我编写的内容
if [ $height -gt $maxsize -o $width -gt $maxsize ] ; then if [ $height -gt $width ] ; then # we'll want to constrain height factor="$(echo "scale=4;$maxsize/$height"|bc)" nh=$maxsize nw="$(echo "$factor*$width"|bc|cut -d. -f1)" else factor="$(echo "scale=4;$maxsize/$width"|bc)" nw=$maxsize nh="$(echo "$factor*$height"|bc|cut -d. -f1)" fi echo "Given $width x $height, scaled to " echo "$nw x $nh" width=$nw height=$nh fi
酷。 现在,如果图像太大,我们可以自动缩放它并根据需要调整高度和宽度参数。 如果它足够小,则不会发生任何变化。 测试运行
Given 161x230, scaled to 139x200.
Given 268x202, scaled to 200x150.
Given 567x294, scaled to 200x103.
Given 358x313, scaled to 200x174.
Given 350x350, scaled to 200x199.
将所有这些都放入脚本后,我们可以使用骨架表来整齐地组织事物。 粗略形式,它看起来像这样
<table border="0"><tr> <td align="center">image</td> <td align="center">image</td> <td align="center">image</td> </tr></table>
将其放入脚本中,既显示缩放后的图像,又跟踪何时需要在表中生成新行的关键代码块是
if [ $linecount -eq $maxperline ] ; then # new row of table echo "</tr><tr>" linecount=0 fi echo "<td align='center' valign='bottom'>" echo "<a href=$name><img src=$name border=0" echo " alt=$name height=$height width=$width />" echo "<br>$name</a><br>($height x $width)</td>" linecount=$(( $linecount + 1 ))
现在,因为我想编写一个高度可读的脚本,所以值得强调的是,顶部部分允许您对此进行彻底配置
maxsize=150 # max thumbnail size, in pixels maxperline=3 # max images per table row
这两个常量都可以根据需要进行调整。 结果? 请参见图 1。 太棒了!
完整的脚本非常酷。 如果您想获得它的副本,请访问我的网站:www.intuitive.com/wicked/imagedir.txt。 将其另存为 Web 服务器上图像目录中的 index.cgi。
Dave Taylor 是一位拥有 26 年 UNIX 经验的资深人士,The Elm Mail System 的创建者,以及最近畅销书 Wicked Cool Shell Scripts 和 Teach Yourself Unix in 24 Hours 的作者,这是他的 16 本技术书籍中的两本。 他的主要网站是 www.intuitive.com,他还提供技术支持,网址为 AskDaveTaylor.com。