2012-06-18 79 views
5

爲了設置一些變量,我需要信息,如果我的服務器上的給定文件是圖像。我不知道任何關於文件的位置和名稱。如何檢測文件是否是perl中的圖像

有沒有辦法檢測文件是否是圖像而不看文件擴展名?

+0

我想你可以檢測一些格式的圖像(.jpg,.png,.gif),但不是所有的現有格式。 )它會足夠嗎? – raina77ow

+0

我的問題是不考慮文件擴展名而找出解決方案 – Thariama

+1

是什麼讓你覺得我談論的是文件擴展名,而不是文件格式? – raina77ow

回答

10

一個簡單的方法是通過PerlMagickCPAN模塊將工作委託給ImageMagick。 IdentifyPing方法是爲此目的而設計的。

use strict; 
use Image::Magick; 

my $im = Image::Magick->new(); 

my ($width, $height, $size, $format) = $im->Ping('/path/to/my/image.jpg'); 

執行這個小程序之後,$format變量將包含與所述圖像的所識別的格式的字符串(在本例中:「JPEG」)在出錯的情況下,或undef(非現有的文件,無法識別的格式等)。

編輯: ...並完全回答你的問題:它可能是安全的假設,一個給定的文件是一個形象,如果Ping返回一個格式字符串,如果它的一部分,取其子集你決定白色 - 來自ImageMagick的list of supported formats(其中還包括非圖像格式)。

+0

+1正在解決我的問題 - 非常感謝 – Thariama

8

JRFerguson在附帶問題的評論中提到了命令file。它帶有一個C庫對手部分,libmagic。 Perl綁定被稱爲File::LibMagic

use File::LibMagic qw(); 
my $detect = File::LibMagic->new; 
$detect->checktype_filename("first_success.jpg") =~ /^image/ 

表達式對圖像類型返回true。

+0

+1感謝這個其他方法 – Thariama

+0

+1爲啓發我! – JRFerguson

+0

我使用的另一個可比較的模塊是['File :: MimeInfo :: Magic'](https://metacpan.org/module/File::MimeInfo::Magic) –

1

你已經有了兩個很好的答案。在這些情況下還有另外一種工具可以有價值。這將比libmagic解決方案慢,但它有時更適用於附加信息和實用程序。我不知道哪個工具更全面或者可能會在邊緣案例中失敗。 Image::ExifTool

use Image::ExifTool "ImageInfo"; 

my $info = ImageInfo(shift || die "Give an image file!\n"); 

print "This is a ", $info->{FileType}, "\n"; 

use Data::Dump "pp"; 
print "Here's more...\n"; 
pp $info; 
+0

+1 thx這個額外的工作方法 – Thariama

2

命令file,首先由@JRFerguson提到的,具有相對於File::LibMagicImage::Magick,或Image::ExifTool限制。

但是,當您無法安裝或使用這些模塊時,file非常棒。至於示例代碼,你可以去這樣的事情:

my $file = "/dir/images/image.jpg"; 
my $type = `file $file`; 

unless ($type =~ /JPEG/i 
    || $type =~ /PNG/i) { 
print "The file is not a valid JPEG or PNG."; 
} 

這個想法是隻針對已知圖像格式的正則表達式。

1

這是我做到這一點的方法之一。使用CPAN「Image-Size-3.300> Image :: Size」的perl模塊。它也有文件屬性圖像「類型」。然後,您可以使用這些變量並使用這些信息來處理應用程序的代碼。

#!/usr/bin/perl 

use Image::Size; 

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

my ($image_width, $image_height, $image_type) = imgsize("path/image.jpg"); 

unless ($image_type =~ /JPG/i 
|| $image_type =~ /PNG/i) { 
print "The file is not a valid JPG or PNG."; 
} 

#To see the results printed to the web browser 
print "<br>(image.jpg) $image_width - $image_height - $image_type<br>\n"; 

exit(0); 
相關問題