Script de redimensionnement d'image

Eléphant du PHP | 186 Messages

25 juin 2007, 12:44

Bonjour à tous,

Je viens vers vous car j'ai un soucis concernant un script permettant de redimensionner une image selon une taille prédéfinie.

Pour le principe, un internaute choisi une image qu'il souhaite mettre sur son espace en faisant parcourir et quand il fait 'générer la vignette", un script php s'enclenche. Il redimensionne l'image avec une taille de 267px par 200px et la colle dans un répertoire de destination.

Ce script fonctionne très bien mais seulement lorsque les images choisie ont une taille inférieur à 1600 X 1200. Lorsque la taille est supérieur, il colle l'image dans le bon répertoire mais sans la retailler et il me met le message d'erreur suivant:

Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 12288 bytes) in page.php on line 48

J'héberge mon site sur Infomaniak et voici les données fournies par le php info:
- memory_limit: 16M
- post_max_size: 48M
- upload_max_filesize: 48M

Et pour ce qui est de mons script php:
unset($erreur);  
$extensions_ok = array('JPG', 'jpg', 'jpeg');

$date = date("d-m-Y");

if ((isset($_FILES['photo1'])) && (in_array( substr(strrchr($_FILES['photo1']['name'], '.'), 1), $extensions_ok ))) {

	$dest_dossier = "Images/".$row_rs_fiche_etab['type_etab']."/";
	$_FILES['photo1']['name'] = $row_rs_fiche_etab['etab_id']."-".$row_rs_fiche_etab['type_etab']."-01.jpg";
	$dest_fichier = basename($_FILES['photo1']['name']);
	// copie du fichier
	move_uploaded_file($_FILES['photo1']['tmp_name'], $dest_dossier . $dest_fichier);
	
	$image1 = $dest_dossier . $dest_fichier; // le chemin

	// prend la taille de l'image
	$dimension=getimagesize($image1);
	// superieur à 500 dans l'exemple
		if($dimension[1]>195){

			$max=200; //taille a redimensionensionner

			$reduc=$max/$dimension[1];
			if (($dimension[0]*$reduc) <= 267) {
			$coef_l=$dimension[0]*$reduc;
			} else {
			$coef_l= 267;
			}
			$coef_h=$max;
			$chemin = imagecreatefromjpeg($image1);
			$nouvelle =imagecreatetruecolor ($coef_l, $coef_h);
			imagecopyresampled($nouvelle,$chemin,0,0,0,0,$coef_l,$coef_h,$dimension[0],$dimension[1]);
			imagejpeg($nouvelle,$image1);
			imagedestroy ($chemin);
		}
	
}
Merci par avance pour toute aide que vous m'apporterez afin que je comprenne d'où vient l'erreur en espérant que ce ne soit pas infomaniak qui bride le système sans quoi je ne pourrais rien faire.

Eléphant du PHP | 332 Messages

25 juin 2007, 13:07

sauf erreur de ma part une image 1600 x 1200 en 16 millions de couleurs (chaque composant RVB d'un pixel sur un octet) fait
(1600 x 1200 x 8 x 3) / (1024*1024) = 44 Mo en mémoire

lorsque ton image est téléchargée, c'est un fichier jpeg compressé. par contre, dès que tu fais du traitement dessus (style redimensionnement), tu travailles sur l'image décompressée en mémoire qui est utilisée et elle a une taille fixe, quelque soit le taux de compression ou la taille du fichier jpeg.

et ton hébergeur ne t'autoriserais que 16 Mo de mémoire dispo.

pour valider tout ça, scinde le problème : évacue le téléchargement. Transfère une grosse image par ftp et fais des essais de transformations dessus. Si ça marche, alors ce que je dis est faux et c'est un pb de téléchargement.

Eléphant du PHP | 186 Messages

25 juin 2007, 14:33

J'ai viré le move_upload_file et j'ai le même problème ou à une différence près. Voici le message d'erreur:
Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 3072 bytes) in page.php on line 52

Donc il semblerait bien que le problème vienne du module de redimensionnement et non au téléchargement de l'image.

Y-a-t'il une solution ou pas alors?

Eléphant du PHP | 332 Messages

26 juin 2007, 19:11

Si ton image fait 44 Mo et que tu n'as le droit qu'à 16 Mo de mémoire, je ne vois pas trop ce que tu peux faire à part interdire les images de grandes dimensions.

800x600, tu es à 11 Mo. 960x720, tu es à 15,8 Mo

Mammouth du PHP | 693 Messages

26 juin 2007, 22:27

Je suis en local, et j'aimerai augmenter la taille maximum de mémoir aloué. Je suis aller dans PHP.ini et j'ai remplacé la taille (8M) par 20M mais après avoir redermarer le serveur, j'ai toujours dans le PHPinfo 8M de mémoire aloué. Comment faire pour le modifier ?

Eléphant du PHP | 332 Messages

27 juin 2007, 10:29

c'est bizarre que tu vois ça dans le phpinfo. je ne vois nulle part le paramètre memory_limit dans les différents phpinfo auxquels j'ai accès.

Mammouth du PHP | 693 Messages

27 juin 2007, 18:56

Pour info, j'utilise WAMP.

Eléphant du PHP | 186 Messages

30 juin 2007, 09:27

Si ton image fait 44 Mo et que tu n'as le droit qu'à 16 Mo de mémoire, je ne vois pas trop ce que tu peux faire à part interdire les images de grandes dimensions.

800x600, tu es à 11 Mo. 960x720, tu es à 15,8 Mo
Désolé pour ma réponse tardive.

Sauf erreur de ma part, le script fonctionne pourtant avec des images de 1600 X 1200. Es-tu sûr alors que la limite de 16Mo en mémoire est prise en compte dans le traitement du redimensionnement si tu me dis qu'une image d'une telle taille fait 44Mo?

ViPHP
ViPHP | 5924 Messages

30 juin 2007, 14:06

Sauf erreur de ma part, le script fonctionne pourtant avec des images de 1600 X 1200. Es-tu sûr alors que la limite de 16Mo en mémoire est prise en compte dans le traitement du redimensionnement si tu me dis qu'une image d'une telle taille fait 44Mo?
Dans l'expective que le programme qui traite l'image est une librairie (ici, on la traite par la librairie GD), et non un programme externe, l'image est traitée avec la RAM allouée à php, donc la taille de l'image entre dans le quota de RAM...