Page 1 sur 1

Diminuer le poids d'une image à l'upload

Posté : 10 nov. 2006, 12:35
par stomper98
Bonjour,

Je cherche un moyen de diminuer la taille des photos uploader vers mon site, car actuellement les photos sont trop importantes et l'upload fonctionne mal du coup. Ca donne ceci comme message :

Code : Tout sélectionner

Fatal error: Allowed memory size of 12582912 bytes exhausted (tried to allocate 11392 bytes) in photo.php on line 30
La photo est de 800 ko je souhaiterais qu'elle soit environ à 100 ko (voir moins).Il s'agit de photos pour des véhicules (3 photos par véhicule) sachant qu'il y a un stock de 700 voitures, vous imaginez la place que ça prendrait.

Vu que je ne peux pas diminuer la résolution avec l'appareil photo, je cherche un moyen de diminuer l'image avant l'upload.

Voici mon code de l'upload pour le moment :

function thumbail($rep, $file, $maxWidth, $maxHeight){//Créé une image à partir de $file


    $img = ImageCreateFromJpeg($rep.$file);   ------->ligne 30<-------


    //Dimensions de l'image


    $imgWidth = imagesx($img);


    $imgHeight = imagesy($img);


    //Facteur largeur/hauteur des dimensions max


    $whFact = $maxWidth/$maxHeight;


    //Facteur largeur/hauteur de l'original


    $imgWhFact = $imgWidth/$imgHeight;


    //fixe les dimensions du thumb


    if($whFact < $imgWhFact){//Si largeur déterminante


        $thumbWidth  = $maxWidth;


        $thumbHeight = $thumbWidth/$imgWhFact;


    } else { //Si hauteur déterminante


        $thumbHeight = $maxHeight;


        $thumbWidth = $thumbHeight*$imgWhFact;


    }


    //Crée le thumb (image réduite)


    $imgThumb = ImageCreateTruecolor($thumbWidth, $thumbHeight);


    //Insère l'image de base redimensionnée


    ImageCopyResized($imgThumb, $img, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $imgWidth, $imgHeight);


    //Nom du fichier thumb


    //$nom_file = basename($path);


    $imgThumbName = "v".$file;


    //Crée le fichier thumb


    $fp = fopen($rep.$imgThumbName, "w");


    fclose($fp);


    //Renvoie le thumb créé


    ImageJpeg($imgThumb, $rep.$imgThumbName);


    return $rep.$imgThumbName;


}



....

//Upload de la nouvelle image

       $nomFichier    = $_FILES["fichier_choisi"]["name"] ;

       //nom temporaire sur le serveur:
       $nomTemporaire = $_FILES["fichier_choisi"]["tmp_name"] ;

       //type du fichier choisi:
       $typeFichier   = $_FILES["fichier_choisi"]["type"] ;

       //poids en octets du fichier choisit:
       $poidsFichier  = $_FILES["fichier_choisi"]["size"] ;

       //code de l'erreur si jamais il y en a une:
       $codeErreur    = $_FILES["fichier_choisi"]["error"] ;


       //chemin qui mène au dossier qui va contenir les fichiers uplaod:
       $chemin = "images/vehicule/" ;


       move_uploaded_file($nomTemporaire, $chemin.$nomFichier);


       if ($nomFichier != "")

	   	chmod ($chemin.$nomFichier, 0644);


       $extension = substr ( strrchr ( $nomFichier, '.' ) , 1 );

       $tmpNom = "images/vehicule/".time().".".$extension;

       rename($chemin.$nomFichier, $tmpNom);

       if ($nomFichier != "")
   	     chmod ($tmpNom, 0644);
      


       $resNom = thumbail("images/vehicule/", basename($tmpNom), 200, 160);

       if ($tmpNom != "")
	   	chmod ($resNom, 0644);

Posté : 10 nov. 2006, 12:43
par zeus
Tu ne peut réduire la taille de l'image AVANT l'upload pour la simple raison que PHP ne gère l'image qu'APRES l'upload :?

En effet, PHP est un langage serveur, qui s'exécute donc sur le serveur, et l'upload est l'action de transférer un document d'un poste client vers le serveur 8-[

Posté : 10 nov. 2006, 12:46
par Ryle
Tu ne peux pas modifier le fichier depuis le serveur avant l'upload. PHP ne peut travailler que sur le serveur et nécessite donc d'avoir le fichier à disposition... Au mieux, tu peux uploader le fichier, et le réduire une fois sur le serveur pour économiser de la place, mais tu ne peux pas le faire avant d'avoir reçu le fichier...

La seule solution c'est de retoucher ton image avec un logiciel de dessin pour en diminuer la taille ou la qualité (en la compressant) et donc le poids.
Certains sites te permettent de faire ça en ligne, mais le problème est le même pour eux : tu dois uploader ta photo pour qu'ils puissent la retailler et te permettre d'enregistrer l'image une fois modifiée...

Posté : 10 nov. 2006, 12:51
par stomper98
Merci de vos réponses.

Code : Tout sélectionner

Fatal error: Allowed memory size of 12582912 bytes exhausted (tried to allocate 11392 bytes) in photo.php on line 30


Cette erreur vient donc de mon hébergeur qui a limiter l'upload ?
Parceque concrètement je ne peux même pas upload les photos là :?

Posté : 10 nov. 2006, 12:56
par fred9999
salut
l'upload de fichier est généralement fixé à 2Mo par le php.ini
pour l'augmenter il faut en parler a ton héberguer qui généralement...
"refuse" .... voila voila

Posté : 10 nov. 2006, 13:03
par Ryle
Bah non à priori, si tu avais une erreur lors de l'upload du fichier tu aurais eu un autre message d'erreur avant celui-ci. Si la ligne 30 correspond au ImageCreateFromJpeg(), cela intervient lorsque tu essayes de modifier le fichier.. il a donc à première vue été correctement uploadé et copié...

Le problème serait plus une question de mémoire allouée pour ce que tu veux faire ou d'un problème dans ce que tu fais.. j'ai nottament un peu de mal à comprendre ton bazar sur le nom du fichier : pourquoi ne pas le nommer directement comme tu le souhaite lors du move ? ça serait pas plus simple ??
	$chemin = "images/vehicule/" ; 

	$extension = substr ( strrchr ( $nomFichier, '.' ) , 1 ); 
	$nouveauNom = time().".".$extension; 

	if (move_uploaded_file($nomTemporaire, $chemin.$nouveauNom))
		chmod ($chemin.$nouveauNom, 0644); // est-ce vraiment utile ?
		$resNom = thumbail($chemin, $nouveauNom, 200, 160); 
	}
	else {
		// erreur de récupération du fichier 
	}

Posté : 10 nov. 2006, 15:33
par Invité
Je viens de continuer mes recherches un peu sur google, en fait ce n'est pas le poids de mon image qui dérange mais sa résolution. Actuellement l'appareil donne des photo d'une résolution de : 2848x2136 (ce qui est énorme). Au dela d'une certaine résolution : ImageCreateFromJpeg donne l'erreur :

Code : Tout sélectionner

Fatal error: Allowed memory size of XXXX bytes exhausted (tried to allocate XXX bytes)
Je peux par exemple les diminuer à la volée avec un logiciel comme : Visualizer Photo.

Néanmoins si je pouvais solutionner ce problème par le code ça serait plus simple.

Posté : 10 nov. 2006, 15:45
par stomper98
edit : je n'étais pas connecté mais c'est bien mon message

Posté : 13 nov. 2006, 11:20
par stomper98
Je viens d'en parler à mon hébergeur voila ce qu'il me conseille :
La seule solution possible est d'opter pour un serveur virtuelle ou memory_limit est personnalisable.
vous en pensez quoi ?