2012-06-18 32 views
5

Để đặt một số biến thể, tôi cần thông tin nếu một tệp nhất định trên máy chủ của tôi là hình ảnh. Tôi không biết bất cứ điều gì về tập tin exept cho vị trí và tên của nó.Cách phát hiện xem tệp có phải là hình ảnh trong perl

Có cách nào để phát hiện xem tệp có phải là hình ảnh KHÔNG nhìn vào đuôi tệp không?

+0

Tôi cho rằng bạn có thể phát hiện một số định dạng hình ảnh (.jpg, .png, .gif), nhưng không phải tất cả các định dạng hiện có.) Nó có đủ không? – raina77ow

+0

câu hỏi của tôi là hướng tới một giải pháp KHÔNG nhìn vào các phần mở rộng tập tin – Thariama

+1

Điều gì làm bạn nghĩ rằng tôi đã nói về các phần mở rộng tập tin, không phải là định dạng tập tin? – raina77ow

Trả lời

10

Cách dễ dàng để thực hiện việc này là giao công việc cho ImageMagick thông qua mô-đun CPAN PerlMagick. Các phương pháp IdentifyPing được thiết kế cho mục đích đó.

use strict; 
use Image::Magick; 

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

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

Sau khi thực hiện chương trình này ít, biến $format sẽ chứa một chuỗi với định dạng xác định của hình ảnh (trong ví dụ này: "JPEG"), hoặc undef trong trường hợp lỗi (file không tồn tại, không được công nhận định dạng, v.v.)

Chỉnh sửa: ... và hoàn toàn trả lời câu hỏi của bạn: có thể giả định rằng tệp được cho là hình ảnh nếu Ping trả về một chuỗi định dạng và nếu đó là một phần của bất kỳ tập hợp con nào bạn quyết định trắng -list từ list of supported formats của ImageMagick (cũng bao gồm các định dạng không phải hình ảnh).

+0

+1 giải quyết vấn đề của tôi - cảm ơn rất nhiều – Thariama

8

JRFerguson đề cập đến lệnh file trong nhận xét được đính kèm với câu hỏi. Nó đi kèm với một bộ phận thư viện C, libmagic. Ràng buộc Perl được gọi là File::LibMagic.

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

Biểu thức trả về đúng cho loại hình ảnh.

+0

+1 cảm ơn vì cách tiếp cận khác này – Thariama

+0

+1 để làm sáng tỏ tôi! – JRFerguson

+0

Một mô-đun có thể so sánh khác mà tôi đã sử dụng là ['File :: MimeInfo :: Magic'] (https://metacpan.org/module/File::MimeInfo::Magic) –

1

Bạn đã có hai câu trả lời hay. Có thêm một công cụ có thể có giá trị trong những trường hợp này. Nó sẽ chậm hơn so với các giải pháp libmagic nhưng đôi khi nó thích hợp hơn cho các thông tin bổ sung và tiện ích. Tôi không biết công cụ nào là toàn diện hơn hoặc có khả năng thất bại trong các trường hợp cạnh. 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 cho phương pháp tiếp cận làm việc bổ sung này – Thariama

2

Lệnh file, như lần đầu tiên được đề cập bởi @JRFerguson, có những hạn chế so với File::LibMagic, Image::Magick, hoặc Image::ExifTool.

Nhưng file thật tuyệt vời khi bạn không thể cài đặt hoặc sử dụng các mô-đun đó. Đối với mã mẫu, bạn có thể đi với một cái gì đó như thế này:

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

Ý tưởng chỉ là để chống lại các định dạng hình ảnh đã biết.

1

Đây là một trong những cách tôi đã làm. Sử dụng hình thức mô-đun perl CPAN "Image-Size-3.300> Image :: Size". nó cũng có tập tin thuộc tính hình ảnh "loại". Sau đó, bạn có thể thực hiện các biến này và sử dụng thông tin để xử lý mã cho ứng dụng của bạn.

#!/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); 
Các vấn đề liên quan