2012-06-18 16 views
5

Per impostare alcuni parametri ho bisogno delle informazioni se un determinato file sul mio server è un'immagine. Non so nulla del file escluso per la sua posizione e il suo nome.Come rilevare se il file è un'immagine in perl

C'è un modo per rilevare se un file è un'immagine SENZA guardare l'estensione del file?

+0

Suppongo che sia possibile rilevare alcuni formati di immagine (.jpg, .png, .gif), ma non tutti i formati esistenti.) Sarebbe sufficiente? – raina77ow

+0

la mia domanda mirava a una soluzione SENZA guardare le estensioni di file – Thariama

+1

Cosa ti ha fatto pensare di aver parlato delle estensioni di file, non dei formati di file? – raina77ow

risposta

10

Un modo semplice per eseguire questa operazione è delegare il lavoro a ImageMagick tramite il modulo CPAN PerlMagick. I metodi Identify e Ping sono progettati per questo scopo.

use strict; 
use Image::Magick; 

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

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

Dopo l'esecuzione di questo piccolo programma, la variabile $format conterrà una stringa con il formato identificato dell'immagine (in questo esempio: "JPEG"), oppure undef in caso di errore (file inesistente, non riconosciuta formato, ecc.).

Edit: ... e per rispondere completamente alla tua domanda: probabilmente è lecito ritenere che un dato file è un'immagine se Ping restituisce una stringa di formato, e se è parte di qualsiasi sottoinsieme decide di bianco -list da ImageMagick's list of supported formats (che include anche i formati non immagine).

+0

+1 che sta risolvendo il mio problema - grazie mille – Thariama

8

JRFerguson menziona il comando file in un commento allegato alla domanda. Viene fornito con una contro-parte della libreria C, libmagic. Il binding Perl è chiamato File::LibMagic.

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

L'espressione restituisce true per i tipi di immagine.

+0

+1 grazie per questo altro approccio – Thariama

+0

+1 per illuminarmi! – JRFerguson

+0

Un altro modulo analogo che ho usato è ['File :: MimeInfo :: Magic'] (https://metacpan.org/module/File::MimeInfo::Magic) –

1

Hai già due buone risposte. C'è uno strumento in più che può essere utile in questi casi. Sarà più lento delle soluzioni libagiche ma a volte è preferibile per le informazioni e l'utilità aggiuntive. Non so quale strumento sia più completo o che possa fallire nei casi limite. 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 per questo approccio di lavoro aggiuntivo – Thariama

2

Il comando file, come prima menzionato da @JRFerguson, ha limitazioni rispetto File::LibMagic, Image::Magick o Image::ExifTool.

Ma file è ottimo quando non è possibile installare o utilizzare quei moduli. Per quanto riguarda il codice di esempio, si potrebbe andare con qualcosa di simile:

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

L'idea è solo quello di regex contro i formati di immagine conosciuti.

1

Ecco uno dei modi in cui l'ho fatto. Utilizzando il modulo perl, CPAN "Image-Size-3.300> Image :: Size". ha anche attributi di file "tipo" immagine. È quindi possibile prendere queste variabili e utilizzare le informazioni per elaborare il codice per la propria applicazione.

#!/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); 
Problemi correlati