7

为了设置一些变量,如果我的服务器上的给定文件是图像,我需要这些信息。我对文件的位置和名称一无所知。

有没有办法在不查看文件扩展名的情况下检测文件是否为图像?

4

5 回答 5

11

一个简单的方法是通过PerlMagick CPAN 模块将工作委托给 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在错误的情况下(不存在的文件、无法识别的格式等)。

编辑: ...并完全回答您的问题:如果返回格式字符串,并且如果它是您决定从 ImageMagick支持的列表中Ping列入白名单的任何子集的一部分,则可以安全地假设给定文件是图像格式(也包括非图像格式)。

于 2012-06-18T12:53:55.213 回答
7

JRFergusonfile在附加到问题的评论中提到了该命令。它带有一个 C 库对应部分,libmagic. Perl 绑定称为File::LibMagic

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

对于图像类型,表达式返回 true。

于 2012-06-18T13:34:21.770 回答
3

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.";
}

这个想法只是针对已知的图像格式进行正则表达式。

于 2013-12-06T20:42:55.283 回答
1

你已经得到了两个很好的答案。在这些情况下,还有一种工具可能很有价值。它会比 libmagic 解决方案慢,但有时它更适合额外的信息和实用程序。我不知道哪种工具更全面或在边缘情况下可能会失败。图片::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;
于 2012-06-19T19:34:37.633 回答
1

这是我做到这一点的方法之一。使用 perl 模块形式的 CPAN "Image-Size-3.300 > Image::Size"。它还具有文件属性图像“类型”。然后,您可以获取这些变量并使用这些信息来处理您的应用程序的代码。

#!/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);
于 2017-01-08T04:44:21.220 回答