Perl图片库问题

时间:2015-01-26 20:17:43

标签: perl

我正在尝试构建图片库。我使用Perl来获取目录中的图像列表并显示它们。图像都是不同的高度和宽度。该脚本将获取图像名称,找到每个图像的名称的宽度和高度,并在页面上显示它们以及页面的其余HTML。我的图像是1.jpg,2.jpg,3.jpg ......最多15个(现在,还会有更多的图像在以后添加)。

我的问题是,当我需要脚本生成图像名称时,它会停止获取图像的尺寸。如果我对图像进行硬编码,它就可以工作并告诉我尺寸。

这里有我所拥有的(我知道这可能很粗糙......)

#!/usr/bin/perl

use Image::Magick;
my $magick = Image::Magick->new;

opendir(DIR, "./images/");
@images = readdir(DIR);
close(DIR);

print "Content-type: text/html\n\n";

foreach $file (@images) {
    $magick->Read( './images/$file' );
    my $width  = $magick->Get('width');
    my $height = $magick->Get('height');
    print "<img src=\"images/$file\" width=\"$width\" height=\"$height\">\n";
}

如果我将$magick->Read( './images/$file' );更改为$magick->Read( './images/1.jpg' );则可行。当然,它然后显示1.jpg 15次,但它能够显示宽度和高度。任何想法为什么会这样?我想我只是错过了一些东西,但我一整天都在努力。

谢谢。

2 个答案:

答案 0 :(得分:3)

您的主要问题是单引号字符串不会插入变量。您正在寻找文件名为$image的图片,而不是使用变量$image的值。

使用"代替'


此外,当您将这些名称转换为HTML的URL时,您没有做任何事情来检查文件名是否实际代表图像或url编码名称。

答案 1 :(得分:1)

如前所述,readdir将返回文件名和目录名,以及伪目录...。将文件名附加到目录名称时也会出现问题。

最好使用File::Spec来操作文件路径,以避免此类错误,并且应使用-f文件测试来丢弃所有目录名称。

这是一个例子

#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use autodie;

use File::Spec::Functions qw/ catfile /;
use Image::Magick;

my $dir = 'images';

print "Content-type: text/html\n\n";

opendir my ($dh), $dir;

while (my $node = readdir $dh) {

    my $file = catfile($dir, $node);
    next unless -f $file;

    my $magick = Image::Magick->new;
    $magick->Read($file);
    my $width  = $magick->Get('width');
    my $height = $magick->Get('height');

    print qq{<img src="$file" width="$width" height="$height">\n};
}