obtener - resize php image
Super rĂ¡pido getimagesize en php (3)
Estaba buscando una mejor manera de manejar esta situación, así que utilicé algunas funciones diferentes encontradas en Internet.
En general, cuando funcionó, el más rápido tendió a ser la función getjpegsize
que James Relyea publicó en la página de PHP para getimagesize
, superando la función de ranger
proporcionada por Dejan arriba. http://php.net/manual/en/function.getimagesize.php#88793
Image #1 (787KB JPG on external older server)
getimagesize: 0.47042 to 0.47627 - 1700x2340 [SLOWEST]
getjpegsize: 0.11988 to 0.14854 - 1700x2340 [FASTEST]
ranger: 0.1917 to 0.22869 - 1700x2340
Image #2 (3MB PNG)
getimagesize: 0.01436 to 0.01451 - 1508x1780 [FASTEST]
getjpegsize: - failed
ranger: - failed
Image #3 (2.7MB JPG)
getimagesize: 0.00855 to 0.04806 - 3264x2448 [FASTEST]
getjpegsize: - failed
ranger: 0.06222 to 0.06297 - 3264x2448 * [SLOWEST]
Image #4 (1MB JPG)
getimagesize: 0.00245 to 0.00261 - 2031x1434
getjpegsize: 0.00135 to 0.00142 - 2031x1434 [FASTEST]
ranger: 0.0168 to 0.01702 - 2031x1434 [SLOWEST]
Image #5 (316KB JPG)
getimagesize: 0.00152 to 0.00162 - 1280x720
getjpegsize: 0.00092 to 0.00106 - 1280x720 [FASTEST]
ranger: 0.00651 to 0.00674 - 1280x720 [SLOWEST]
-
ranger
falló al capturar 32768 bytes en la imagen n. ° 3, por lo que la aumento a 65536 y funcionó para capturar el tamaño con éxito.
Sin embargo, hay problemas, ya que tanto el ranger
como el getjpegsize
están limitados en formas que no lo hacen suficientemente estable. Ambos fallaron cuando se trataba de una imagen JPG grande de alrededor de 3MB, pero el ranger
funcionará después de cambiar la cantidad de bytes que capta. Además, estas alternativas solo se ocupan de las imágenes JPG, lo que significa que se debería usar un condicional solo para usarlas en JPG y obtener getimagesize
en los otros formatos de imagen.
Además, tenga en cuenta que la primera imagen estaba en un servidor anterior que ejecutaba una versión anterior de PHP 5.3.2, mientras que las otras 4 imágenes provenían de un servidor moderno (cPanel basado en la nube con MultiPHP marcado nuevamente a 5.4.45 para compatibilidad).
Vale la pena señalar que el servidor basado en la nube hizo mucho mejor con getimagesize
que venció al ranger
, de hecho para las 4 pruebas en el servidor de la nube, el ranger
fue el más lento. Esos 4 también estaban sacando las imágenes del mismo servidor que el código se estaba ejecutando, aunque diferentes cuentas.
Esto me hace preguntarme si el núcleo de PHP mejoró en 5.4 o si la versión de Apache entra en acción. Además, podría deberse a la disponibilidad del servidor y la carga del servidor. No olvidemos que las redes cada vez son más y más rápidas cada año, por lo que quizás el problema de la velocidad sea cada vez menos preocupante.
Entonces, el resultado final y mi respuesta es que para obtener soporte completo para todos los formatos de imagen web, y aún así lograr un tamaño de imagen getimagesize
, podría ser mejor succionarlo y usar getimagesize
y luego almacenar en caché los tamaños de imagen (si estas imágenes ser revisado más de una vez) en una tabla de base de datos. En ese escenario, solo el primer cheque tendrá un costo mayor, pero las solicitudes posteriores serán mínimas y más rápidas que cualquier función que lea los encabezados de las imágenes.
Al igual que con cualquier almacenamiento en caché, solo funciona bien si el contenido no cambia y hay una manera de verificar si ha habido algún cambio. Por lo tanto, una posible solución es verificar solo los encabezados de una URL de imagen al verificar la caché, y si es diferente, volcar la versión en caché y volver a getimagesize
con getimagesize
.
Estoy tratando de obtener el tamaño de la imagen (dimensiones de la imagen, ancho y alto) de cientos de imágenes remotas y getimagesize
es demasiado lento.
He hecho algunas lecturas y descubrí que la manera más rápida sería usar file_get_contents
para leer una cierta cantidad de bytes de las imágenes y examinar el tamaño dentro de los datos binarios.
¿Alguien intentó esto antes? ¿Cómo examinaría diferentes formatos? ¿Alguien ha visto alguna biblioteca para esto?
He creado una biblioteca PHP para exactamente este escenario, funciona descargando el mínimo absoluto del archivo remoto necesario para determinar el tamaño del archivo. Esto es diferente para cada imagen y, en particular, para JPEG depende de cuántas miniaturas incrustadas hay en el archivo.
Está disponible en GitHub aquí: https://github.com/tommoor/fastimage
Ejemplo de uso:
$image = new FastImage($uri);
list($width, $height) = $image->getSize();
echo "dimensions: " . $width . "x" . $height;
function ranger($url){
$headers = array(
"Range: bytes=0-32768"
);
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($curl);
curl_close($curl);
return $data;
}
$start = microtime(true);
$url = "http://news.softpedia.com/images/news2/Debian-Turns-15-2.jpeg";
$raw = ranger($url);
$im = imagecreatefromstring($raw);
$width = imagesx($im);
$height = imagesy($im);
$stop = round(microtime(true) - $start, 5);
echo $width." x ".$height." ({$stop}s)";
prueba...
640 x 480 (0.20859s)
Cargando 32kb de datos funcionó para mí.