Perl图像库问题

Perl图像库问题,perl,Perl,我正试图建立一个图像库。我正在使用Perl获取目录中的图像列表并显示它们。图像的高度和宽度都不同。该脚本将获取图像名称,找到每个图像的宽度和高度,并在页面上显示它们,以及页面的其余HTML。我的图片是1.jpg,2.jpg,3.jpg。。。最多15个(目前,以后将添加更多) 我的问题是,当我需要脚本生成图像名称时,它会停止获取图像的尺寸。如果我硬编码的图像,它的工作,并告诉我的尺寸 这是我所拥有的(我知道这可能很艰难…) #/usr/bin/perl 使用Image::Magick; my$ma

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

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

这是我所拥有的(我知道这可能很艰难…)

#/usr/bin/perl
使用Image::Magick;
my$magick=Image::magick->new;
opendir(DIR,“/图像/”);
@images=readdir(DIR);
关闭(DIR);
打印“内容类型:text/html\n\n”;
foreach$文件(@images){
$magick->Read('./images/$file');
my$width=$magick->Get('width');
我的$height=$magick->Get('height');
打印“\n”;
}
如果我更改
$magick->Read('./images/$file')
$magick->Read('./images/1.jpg')它可以工作。当然,它会显示1.jpg 15次,但它能够显示宽度和高度。你知道为什么吗?我想我错过了什么,但我已经为此工作了一整天


谢谢。

您的主要问题是单引号字符串不会插入变量。您正在查找文件名为
$image
且未使用变量
$image
的图像

使用
而不是



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

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

使用
而不是



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

正如前面所解释的,
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};
}
#/usr/bin/perl
严格使用;
使用警告;
使用5.010;
使用自动模具;
使用File::Spec::Functions qw/catfile/;
使用Image::Magick;
my$dir='images';
打印“内容类型:text/html\n\n”;
opendir my($dh),$dir;
while(my$node=readdir$dh){
my$file=catfile($dir$node);
下一个除非-f$文件;
my$magick=Image::magick->new;
$magick->Read($file);
my$width=$magick->Get('width');
我的$height=$magick->Get('height');
打印qq{\n};
}

如前所述,
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};
}
#/usr/bin/perl
严格使用;
使用警告;
使用5.010;
使用自动模具;
使用File::Spec::Functions qw/catfile/;
使用Image::Magick;
my$dir='images';
打印“内容类型:text/html\n\n”;
opendir my($dh),$dir;
while(my$node=readdir$dh){
my$file=catfile($dir$node);
下一个除非-f$文件;
my$magick=Image::magick->new;
$magick->Read($file);
my$width=$magick->Get('width');
我的$height=$magick->Get('height');
打印qq{\n};
}

创建一个新的空目录,并对其调用
readdir
。你可能会对结果感到惊讶<代码>mkdir foo&&perl-我们是opendir my$dh,“foo”或die$!;例如,对于readdir$dh'
输出
您可能不想将它们视为图像。此外,您应该添加
使用strict;使用警告到您编写的每个Perl脚本的顶部,因为它可以帮助捕获许多常见错误(尽管在这种情况下它没有帮助)。我知道它会输出。。和。但是我想我以后可以解决这个问题。创建一个新的空目录,并在上面调用
readdir
。你可能会对结果感到惊讶<代码>mkdir foo&&perl-我们是opendir my$dh,“foo”或die$!;例如,对于readdir$dh'
输出
您可能不想将它们视为图像。此外,您应该添加
使用strict;使用警告到您编写的每个Perl脚本的顶部,因为它可以帮助捕获许多常见错误(尽管在这种情况下它没有帮助)。我知道它会输出。。和。但我想我可以晚些时候再谈。谢谢你的回复@昆汀:好的,
有些效果。现在它显示了高度和宽度,但它只显示第一个图像的高度和宽度。因此,如果1.jpg是100x100,2.jpg是300x200,它现在将显示两个图像100x100。@Squalle在同一个
Image::Magick
对象上多次调用
Read
时,将图像读入图像序列。要访问序列中的其他图像,您需要通过它们的索引访问它们,即
$image->[1]->Get('width')
将给出序列中第二个图像的宽度。请注意,序列中的每个图像都存储在内存中,这会占用相当大的内存块。康西