2010-10-26 4 views
7

Je redimensionne des images avec php gd. Le résultat est des ressources d'image que je veux télécharger sur Amazon S3. Cela fonctionne très bien si je stocke les images sur le disque d'abord mais je voudrais les télécharger directement de la mémoire. C'est possible si je connais juste le bytesize de l'image.Comment obtenir la taille de la ressource image en octets avec PHP et GD?

Existe-t-il un moyen d'obtenir la taille (en octets) d'une ressource d'image gd?

+0

Vous ne pouvez pas télécharger de ressources. –

Répondre

12

Vous pouvez utiliser le memory i/o stream de PHP pour enregistrer l'image et obtenir ensuite la taille en octets.

Ce que vous faites est:

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

Maintenant, vous devez connaître la taille

Je ne connais pas de méthode (gd) pour obtenir la taille d'une ressource d'image.

+1

Le problème est que les fonctions 'gd' attendent un chemin, pas une ressource de fichier, pour écrire. Cela devrait fonctionner avec [tampon de sortie] (http://php.net/manual/en/function.ob-start.php) à la place cependant. – deceze

+0

@deceze: Vous devriez être capable de fournir un chemin comme: 'php: // memory/resource = img.jpeg' –

+0

Excellent, bonne explication. – deceze

-1

Enregistrez le fichier image dans le format souhaité dans un répertoire tmp, puis utilisez filesize() http://php.net/manual/de/function.filesize.php avant de le télécharger vers S3 à partir du disque.

+0

Voici la version anglaise: http://www.php.net/manual/fr/function.filesize.php :) – infinity

+0

L'enregistrement d'un fichier temporaire sur le disque est exactement ce que j'essaie d'éviter ici. – Martin

+0

Pourquoi? Ce n'est pas tellement un problème de performance et économise beaucoup de RAM. – joni

0

Vous pouvez consulter la réponse suivante pour obtenir de l'aide. Cela fonctionne pour les changements de mémoire génériques en php. Bien que les frais généraux pourraient être impliqués, il pourrait s'agir davantage d'une estimation.

Getting size of PHP objects

9

Je ne peux pas écrire sur php: // mémoire avec imagepng, donc j'utiliser ob_start(), ob_get_content() fin 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

Pourquoi ne pas utiliser 'ob_get_length' comme suggéré par @JonathanWren? – Wilt

5

Cela fonctionne aussi:

$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 

Et maintenant, $size aura votre taille en octets.

+0

Merci. Cela m'a aidé parce que j'avais besoin d'un moyen de déterminer la taille du fichier sans le télécharger. – Benjamin

Questions connexes