2015-01-26 69 views
0

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

我的问题是当我需要脚本来生成图像名称,它停止获取图像的尺寸。如果我对图像进行了严格编码,它可以正常工作并告诉我尺寸。

这是我有什么(我知道这可能是粗糙...)

#!/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

创建一个新的空目录,并调用'它readdir'。结果你可能会感到惊讶。 'mkdir foo && perl -wE'opendir my $ dh,“foo”或者死亡$!说readdir $ dh''输出'..'和'.'你可能不想把它们当作图像。 – ThisSuitIsBlackNot 2015-01-26 20:21:55

+0

另外,你应该添加'use strict;使用警告;'到您编写的每个Perl脚本的顶部,因为它可以帮助捕获很多常见错误(尽管在这种情况下它不会有所帮助)。 – ThisSuitIsBlackNot 2015-01-26 20:27:41

+0

对不起,perl,不是PERL。我知道它输出..和。但我想我以后可以解决这个问题。 – Squalle 2015-01-26 21:37:07

回答

3

你的主要问题是单引号字符串不能插入变量。您正在查找文件名为$image的图像,但未使用变量$image的值。而不是'


此外

使用",你没有做任何事情来检查文件名实际上代表图像或URL编码的名称,当你把它变成了HTML的URL。

+0

感谢您的回复。 @Quentin 好了,''''''''有点工作,现在它显示了高度和宽度,但它只显示了第一个图像的高度和宽度,所以如果1.jpg是100x100和2。 jpg是300x200,它现在显示100x100两个图像 – Squalle 2015-01-26 21:53:33

+0

@Squalle当你在相同的'Image :: Magick'对象上多次调用'Read'时,你会将图像读入一个图像序列,要访问序列中的其他图像,你需要通过它们的索引来访问它们,也就是说,'$ image - > [1] - > Get('width')'会给出序列中第二个图像的宽度。内存,它可以吃掉大量的RAM。考虑为每个图像创建一个新对象,并在完成后按照[文档的概述部分](http://www.imagemagick.org/script/perl-magick.php#overview)中所述进行销毁。 – ThisSuitIsBlackNot 2015-01-26 22:52:15

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}; 
} 
+1

@Squalle请注意这个示例脚本顶部的'use autodie;',如果'opendir'失败,将导致脚本死掉。你应该检查'opendir'是否成功在你的脚本中,无论是手动操作(例如'opendir my $ dh,'foo'或者死掉'Failed to opendir:$!''')还是'autodie'。 – ThisSuitIsBlackNot 2015-01-26 22:30:00