2012-06-18 2 views
5

내 서버의 파일이 이미지 인 경우 일부 정보를 설정하려면 정보가 필요합니다. 그 파일의 위치와 이름을 제외한 파일에 대해서는 아무 것도 모른다.파일이 perl의 이미지인지 확인하는 방법

파일이 파일 확장명을 보지 않고 이미지인지 여부를 감지하는 방법이 있습니까?

+0

일부 형식의 이미지 (.jpg, .png, .gif)는 감지 할 수 있지만 모든 기존 형식은 감지하지 못한다고 가정합니다.) 충분하겠습니까? – raina77ow

+0

제 질문은 파일 확장자를 보지 않고 해결책을 찾고있었습니다 – Thariama

+1

파일 형식이 아닌 파일 확장명에 대해 어떻게 생각하니? – raina77ow

답변

10

쉽게 할 수있는 방법은 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을 (파일이 존재하지 않는, 인식 형식 등). ... 완전히 귀하의 질문에 대답하기 :

편집 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 – Thariama

2

같은 제 @JRFerguson 언급 명령 fileFile::LibMagic, Image::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

내가 한 방법 중 하나입니다. perl 모듈 양식 CPAN "Image-Size-3.300> Image :: Size"를 사용하십시오. 그것은 또한 파일 속성 image "type"을가집니다. 그런 다음이 변수를 사용하여 정보를 사용하여 응용 프로그램의 코드를 처리 할 수 ​​있습니다.

#!/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); 
관련 문제