2015-01-26 64 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