2010-10-26 40 views
7

Estoy cambiando el tamaño de las imágenes con php gd. El resultado son los recursos de imagen que quiero subir a Amazon S3. Funciona muy bien si guardo las imágenes en el disco primero, pero me gustaría cargarlas directamente desde la memoria. Eso es posible si solo sé el tamaño de bytes de la imagen.¿Cómo obtener el tamaño del recurso de imagen en bytes con PHP y GD?

¿Hay alguna manera de obtener el tamaño (en bytes) de un recurso de imagen gd?

+0

No puede cargar recursos. –

Respuesta

12

Puede usar PHP memory i/o stream para guardar la imagen y, posteriormente, obtener el tamaño en bytes.

Lo que se hace es:

$img = imagecreatetruecolor(100,100); 
// do your processing here 
// now save file to memory 
imagejpeg($img, 'php://memory/temp.jpeg'); 
$size = filesize('php://memory/temp.jpeg'); 

Ahora usted debe saber el tamaño

No conozco ningún método (gd) para obtener el tamaño de un recurso de imagen.

+1

El problema es que las funciones 'gd' esperan una ruta, no un recurso de archivo, para escribir. Sin embargo, esto debería funcionar con [buffering de salida] (http://php.net/manual/en/function.ob-start.php). – deceze

+0

@deceze: Debería poder proporcionar una ruta como: 'php: // memory/resource = img.jpeg' –

+0

Excelente, buena explicación. – deceze

-1

Guarde el archivo de imagen en el formato deseado en un dir de tmp, y luego use filesize() http://php.net/manual/de/function.filesize.php antes de cargarlo en S3 desde el disco.

+0

Aquí está la versión en inglés: http://www.php.net/manual/en/function.filesize.php :) – infinity

+0

Guardar aquí un archivo temporal en el disco es exactamente lo que trato de evitar. – Martin

+0

¿Por qué? No es tanto un problema de rendimiento y ahorra mucha RAM. – joni

0

Puede que vea la siguiente respuesta para obtener ayuda. Funciona para cambios de memoria genéricos en php. Aunque como la sobrecarga podría estar involucrada, podría ser más una estimación.

Getting size of PHP objects

9

no puedo escribir en php: // memoria con imagepng, así que usar ob_start(), ob_get_content() terminar ob_end_clean()

$image = imagecreatefrompng('./image.png'); //load image 
// do your processing here 
//... 
//... 
//... 
ob_start(); //Turn on output buffering 
imagejpeg($image); //Generate your image 

$output = ob_get_contents(); // get the image as a string in a variable 

ob_end_clean(); //Turn off output buffering and clean it 
echo strlen($output); //size in bytes 
+1

¿Por qué no utilizar 'ob_get_length' como se sugirió @JonathanWren? – Wilt

5

Esto también funciona:

$img = imagecreatetruecolor(100,100); 

// ... processing 

ob_start();    // start the buffer 
imagejpeg($img);   // output image to buffer 
$size = ob_get_length(); // get size of buffer (in bytes) 
ob_end_clean();   // trash the buffer 

Y ahora $size tendrá su tamaño en bytes.

+0

Gracias. Esto me ayudó porque necesitaba una forma de determinar el tamaño del archivo sin subirlo. – Benjamin

Cuestiones relacionadas