2012-06-18 14 views
5

Para establecer algunos varaibles, necesito la información si un archivo dado en mi servidor es una imagen. No sé nada sobre el archivo excepto por su ubicación y nombre.Cómo detectar si el archivo es una imagen en perl

¿Hay alguna manera de detectar si un archivo es una imagen SIN VER la extensión del archivo?

+0

Supongo que puede detectar algunos formatos de imagen (.jpg, .png, .gif), pero no todos los formatos existentes.) ¿Sería suficiente? – raina77ow

+0

mi pregunta apuntaba a una solución SIN mirar las extensiones de archivo – Thariama

+1

¿Qué le hizo pensar que hablé sobre las extensiones de archivo, no sobre los formatos de archivo? – raina77ow

Respuesta

10

Una forma fácil de hacerlo es delegar el trabajo a ImageMagick a través del módulo PerlMagick CPAN. Los métodos Identify y Ping están diseñados para ese propósito.

use strict; 
use Image::Magick; 

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

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

Después de ejecutar este pequeño programa, la variable $format contendrá una cadena con el formato identificado de la imagen (en este ejemplo: "JPEG"), o undef en caso de error (archivo no existente, no reconocido formato, etc.).

Editar: ... y para responder por completo a su pregunta: probablemente es seguro asumir que un determinado archivo es una imagen si Ping devuelve una cadena de formato, y si es parte de lo que subconjunto de decidirse a blanco -Lista de ImageMagick's list of supported formats (que también incluye formatos sin imágenes).

+0

+1 que está solucionando mi problema - muchas gracias – Thariama

8

JRFerguson menciona el comando file en un comentario adjunto a la pregunta. Viene con una contraparte de la biblioteca C, libmagic. El enlace Perl se llama File::LibMagic.

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

La expresión devuelve verdadera para los tipos de imagen.

+0

+1 gracias por este otro enfoque – Thariama

+0

+1 por aclararme! – JRFerguson

+0

Otro módulo comparable que he usado es ['File :: MimeInfo :: Magic'] (https://metacpan.org/module/File::MimeInfo::Magic) –

1

Ya tienes dos buenas respuestas. Hay una herramienta más que puede ser valiosa en estos casos. Va a ser más lento que las soluciones de libmagic, pero a veces es preferible para la información adicional y la utilidad. No sé qué herramienta es más completa o es probable que falle en casos extremos. 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 para este enfoque de trabajo adicional – Thariama

2

El comando file, como se mencionó por primera vez por @JRFerguson, tiene limitaciones en comparación con File::LibMagic, Image::Magick, o Image::ExifTool.

Pero file es genial cuando no puede instalar o usar esos módulos. En cuanto a código de ejemplo, usted podría ir con algo como esto:

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

La idea es sólo para regex en contra de los formatos de imagen conocidos.

1

Esta es una de las formas en que lo hice. Usando el módulo perl de CPAN "Image-Size-3.300> Image :: Size". también tiene atributos de archivo imagen "tipo". A continuación, puede tomar estas variables y usar la información para procesar el código de su aplicació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); 
Cuestiones relacionadas