2008-09-18 6 views
5

Actualmente estoy usando ImageMagick para determinar el tamaño de las imágenes cargadas en el sitio web. Al llamar a la "identificación" de ImageMagick en la línea de comandos, se necesitan aproximadamente 0,42 segundos para determinar las dimensiones de 1MB de JPEG junto con el hecho de que es un archivo JPEG. Encuentro eso un poco lento.¿La forma más rápida de determinar la resolución de la imagen y el tipo de archivo en la línea de comandos de PHP o Unix?

El uso de la biblioteca Imagick PHP es aún más lento ya que intenta cargar todo el 1MB en memoria antes de realizar ningún tratamiento a la imagen (en este caso, simplemente determinando su tamaño y tipo).

¿Existen soluciones para acelerar este proceso de determinar qué tipo de archivo y qué dimensiones tiene un archivo de imagen arbitrario? Puedo vivir solo soportando JPEG y PNG. Es importante para mí que el tipo de archivo se determine mirando los encabezados del archivo y no simplemente la extensión.

Editar: La solución puede ser una herramienta de línea de comandos de UNIX llamada por PHP, al igual que la forma en que estoy usando ImageMagick en el momento

Respuesta

3

Lo siento, no puedo agregar esto como un comentario a una respuesta anterior, pero no tengo el representante. Haciendo algunas pruebas rápidas y sucias, también encontré que exec ("identificación -ping ... es aproximadamente 20 veces más rápido que sin -ping. Pero getimagesize() parece ser 200 veces más rápido aún.

Así que lo haría decir getimagesize() es el método más rápido. yo sólo probamos en jpg y no en png.

la prueba es sólo

$files = array('2819547919_db7466149b_o_d.jpg', 'GP1-green2.jpg', 'aegeri-lake-switzerland.JPG'); 
foreach($files as $file){ 
    $size2 = array(); 
    $size3 = array(); 
    $time1 = microtime(); 
    $size = getimagesize($file); 
    $time1 = microtime() - $time1; 
    print "$time1 \n"; 
    $time2 = microtime(); 
    exec("identify -ping $file", $size2); 
    $time2 = microtime() - $time2; 
    print $time2/$time1 . "\n"; 
    $time2 = microtime(); 
    exec("identify $file", $size3); 
    $time2 = microtime() - $time2; 
    print $time2/$time1 . "\n"; 
    print_r($size); 
    print_r($size2); 
    print_r($size3); 
} 
+0

Pero, ¿proporciona GD una forma de determinar un tipo de archivo de acuerdo con su contenido (y no su extensión asignada)? También debe medir el tiempo que lleva cargar la imagen en GD también, ya que no estoy haciendo ningún otro proceso que no sea determinar el tamaño del archivo. – Gilles

+0

He agregado la prueba a mi respuesta. No sé si GD carga el archivo de imagen completamente en la memoria o no, ya que no estoy mirando la memoria. Pero estoy atrapando el tiempo completo que tarda el comando en ejecutarse. También getimagesize() también devuelve el tipo de mimo. –

+0

Gracias por todos los esfuerzos, lo he probado en vivo y es de hecho 250 veces más rápido que la solución de enganche. Así que alrededor de 5000 veces más rápido que el método original que estaba usando, no está mal :) – Gilles

7

Si está usando PHP con soporte GD, se puede intente getimagesize().

+0

GD probablemente sufrirá el mismo problema de velocidad, ya que cargará la imagen en la memoria ... – Gilles

+0

Es cierto. No sé otra cosa que no sea escribirlo usted mismo y almacenar solo parte de la imagen en la memoria a la vez, pero esto dependería del tipo de imagen. –

2

Es importante para mí que el tipo de archivo se determine mirando los encabezados del archivo y no simplemente la extensión.

Para eso puede usar el comando 'file' unix (o una función php que implementa la misma funcionalidad).

/tmp$ file stackoverflow-logo-250.png
stackoverflow-logo-250.png: PNG image data, 250 x 70, 8-bit colormap, non-interlaced

+0

Acabo de probar esto rápidamente en la línea de comandos y parece bastante lento también, tomó un buen segundo para determinar el tipo de archivo del JPG. Parece que almacena el resultado en caché, pero eso es de poco interés, ya que probaré la imagen solo una vez. – Gilles

+0

Parte de esto es probablemente el tiempo que se tarda en analizar el archivo mágico. Puede ejecutar archivos en un montón de imágenes a la vez. O puede crear un archivo mágico más pequeño con solo los tipos de archivos de imágenes comunes. – palm3D

4

Ha intentado

identify -ping filename.png 

?

+0

Buena llamada, es aproximadamente 20 veces más rápido :) La descripción de esa opción me hace preguntarme por qué no es el comportamiento predeterminado de la identificación. De todos modos, problema resuelto y muchas gracias. – Gilles

2

En realidad, para usar getimagesize(), que hace NO necesidad de contar con GD compilado.

También puede utilizar mime_content_type() para obtener el tipo MIME.

1

exif_imagetype() es más rápido que getimagesize().

$ filename = "somefile";
$ data = exif_imagetype ($ filename);
echo "<PRE>";
print_r ($ data);
echo "</PRE >";

de salida:

 
Array (
     [FileName] => somefile 
     [FileDateTime] => 1234895396 
     [FileSize] => 15427 
     [FileType] => 2 
     [MimeType] => image/jpeg 
     [SectionsFound] => 
     [COMPUTED] => Array 
      (
       [html] => width="229" height="300" 
       [Height] => 300 
       [Width] => 229 
       [IsColor] => 1 
     ) 
) 

0

Si está usando PHP me gustaría sugerir el uso de la biblioteca Imagick en lugar de llamar exec(). La característica que está buscando es Imagick::pingImage().

Cuestiones relacionadas