php - sintaxis - dar permisos a un usuario sobre una carpeta linux
¿La forma más rápida de determinar la resolución de imagen y el tipo de archivo en PHP o en la línea de comandos de Unix? (7)
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.
El uso de la biblioteca Imagick PHP es aún más lento ya que intenta cargar todo el 1MB en la memoria antes de realizar cualquier tratamiento a la imagen (en este caso, simplemente determinando su tamaño y tipo).
¿Hay alguna solución 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 llamada por PHP, al igual que la forma en que estoy usando ImageMagick en este momento
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 alguna función php que implemente la misma funcionalidad).
/tmp$ file -logo-250.png
-logo-250.png: PNG image data, 250 x 70, 8-bit colormap, non-interlaced
En realidad, para usar getimagesize (), NO es necesario tener compilado GD.
También puede usar mime_content_type () para obtener el tipo MIME.
Has probado
identify -ping filename.png
?
Lo siento, no puedo agregar esto como un comentario a una respuesta anterior, pero no tengo el representante. Al hacer algunas pruebas rápidas y sucias también encontré que el ejecutor ("identificación -ping ... es aproximadamente 20 veces más rápido que sin -ping. Pero getimagesize () parece ser unas 200 veces más rápido aún.
Así que 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);
}
exif_imagetype () es más rápido que getimagesize ().
$ filename = "somefile";
$ data = exif_imagetype ($ nombre de archivo);
echo "<PRE>";
print_r ($ data);
echo "</ PRE>";
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 ) )
Si está usando PHP, le sugiero usar la biblioteca Imagick en lugar de llamar a exec()
. La característica que estás buscando es Imagick :: pingImage () .
Si está utilizando PHP con compatibilidad GD, puede intentar obtener imágenes de archivo () .