2012-06-18 47 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); 
相关问题