¿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 PHP o Unix?

StackOverflow https://stackoverflow.com/questions/90758

Pregunta

Actualmente estoy usando ImageMagick para determinar el tamaño de las imágenes cargadas en el sitio web.Al llamar a "identificar" de ImageMagick en la línea de comando, se necesitan aproximadamente 0,42 segundos para determinar las dimensiones de un JPEG de 1 MB junto con el hecho de que es un JPEG.Eso me parece un poco lento.

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

¿Existe alguna solución para acelerar este proceso de determinar qué tipo de archivo y qué dimensiones tiene un archivo de imagen arbitrario?Puedo vivir con que solo admita JPEG y PNG.Para mí es importante 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 UNIX llamada por PHP, muy parecida a la forma en que estoy usando ImageMagick en este momento.

¿Fue útil?

Solución

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

Entonces yo diría que getimagesize() es el método más rápido.Solo probé en jpg y no en png.

la prueba es solo

$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);
}

Otros consejos

Si estás usando PHP con soporte GD, puedes probar obtener tamaño de imagen().

Has probado

identify -ping filename.png

?

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

Para eso, puede usar el comando Unix 'archivo' (o alguna función PHP que implemente la misma funcionalidad).

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

En realidad, para usar getimagesize(), debes NO Es necesario tener GD compilado.

También puedes usar mime_content_type() para obtener el tipo MIME.

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

$nombre de archivo = "algún archivo";
$datos = exif_imagetype($nombre de archivo);
eco "<PRE>";
print_r($datos);
eco "</PRE>";

producción:

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
        )
)

Si estás usando PHP te sugiero usar la biblioteca Imagick en lugar de llamar exec().La característica que estás buscando es Imagen::pingImage().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top