¿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?
-
01-07-2019 - |
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.
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().