我正在尝试构建图片库。我使用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次,但它能够显示宽度和高度。任何想法为什么会这样?我想我只是错过了一些东西,但我一整天都在努力。
谢谢。
答案 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};
}