Page 1 sur 1

Optimiser les images

Posté : 26 juin 2016, 10:22
par yoann38
Salut à tous.
J'ai un bout de code qui me permet de redimenssioner mes photos et de les enregistré dans un repertoire.
Ceci dit j'aimerais également optimiser les images
<?php
	// Retouche d'image pour qu'elle soit parfaite
	function imageParfaite($width, $height, $originalFileName, $destinationFileName=NULL, $fullsize=0) {
		
		$message = NULL;
		$destinationFileName = !empty($destinationFileName) ? $destinationFileName : $originalFileName;
		
		// Verification des côtes
		list($gWidth, $gHeight) = getimagesize($originalFileName);
		if(($gWidth != $width) || ($gHeight != $height)) {
			
			// On verifie que l'image est pas trop petite
			if(($gWidth > $width) && ($gHeight > $height)) {
				
				// On la met en full size ou non
				if($fullsize == 1) {
					
					$finalWidth = $gWidth*($height/$gHeight);
					$finalHeight = $gHeight*($width/$gWidth);
				
					// Si l'image est plus large
					if($width > $height) {
						
						// Si on veut une image en largeur
						if(($gWidth > $gHeight)) {		
							// Si la largeur finale est inférieur à la largeur que l'on veut
							($finalWidth > $width) ? createMiniature($originalFileName, $destinationFileName, NULL, $height) : createMiniature($originalFileName, $destinationFileName, $width);
						} else {
							($finalHeight > $height) ? createMiniature($originalFileName, $destinationFileName, $width) : createMiniature($originalFileName, $destinationFileName, NULL, $height);
						}
						
					} else {
						
						// Si on veut une image en hauteur
						if(($gWidth < $gHeight)) {		
							// Si la largeur finale est inférieur à la largeur que l'on veut
							($finalWidth > $width) ? createMiniature($originalFileName, $destinationFileName, NULL, $height) : createMiniature($originalFileName, $destinationFileName, $width);
						} else {
							($finalHeight > $height) ? createMiniature($originalFileName, $destinationFileName, $width) : createMiniature($originalFileName, $destinationFileName, NULL, $height);
						}
						
						
					}
					
				} else {
					
					// On redimensionne l'image avec la taille la plus petite
					$message .= ($gWidth > $gHeight) ? createMiniature($originalFileName, $destinationFileName, $width) : createMiniature($originalFileName, $destinationFileName, NULL, $height);
					
				}
				
				// On crée l'image parfaite
				$message .= makeSample($destinationFileName, $destinationFileName, $width, $height);
				
				
			} else {
				
				$message .= ($gWidth > $gHeight) ? createMiniature($originalFileName, $destinationFileName, $width) : createMiniature($originalFileName, $destinationFileName, $width, NULL, $height);
							
				// L'image etait plus petite, on l'habille					
				$message .= makeSample($destinationFileName, $destinationFileName, $width, $height);
				
			}
			
		} else {
			
			// Si l'image est different de la destination alors on copie la même image ailleurs
			if($originalFileName != $destinationFileName) {
				copy($originalFileName, $destinationFileName);
				$return .= "<br />L'image <strong>".$fichier."</strong> n'avait pas besoin d'être miniaturisée. Elle a juste été dupliquée vers la nouvelle destination.";
			} 
			
		}
		
		return $message;
	}
		
?>
Et on enregistre les photos dans ma page du formulaire:
// Upload des fichier
		$namefile = '';
			
			if(!empty($_FILES)) {
				
				if(!empty($_FILES['photo']['tmp_name'])) {
								
					$path = 'img/img-big-format/';									
					$namefile = filename($_FILES['photo']['name'], $_POST['titre']);
			
					$return = upload($_FILES['photo'], $namefile, $path, array('image/jpg', 'image/jpeg'));
					$message = $return[0];
					$erreur = $return[1];
					
					if($erreur <= 1) {			
						imageparfaite(600, 400, $path.$namefile, $path.$namefile, 1);
					} else {
						$erreurs['image'] = $message;
					}			
										
				} 
			}

Re: Optimiser les images

Posté : 26 juin 2016, 10:44
par @rthur
Bonjour,

Regarde du côté du paramètre $quality de la fonction imagejpeg() qui permet de définir le niveau de qualité souhaité :
http://php.net/manual/fr/function.imagejpeg.php

Re: Optimiser les images

Posté : 26 juin 2016, 10:58
par yoann38
Merci pour la doc ;)
J'ai rajouter l'indice de qualité, je peut poster la photo pas de problème
Mais rien en terme d'optimisation
Les images font le même poids

Ou est le problème svp:
// Upload des fichier
		$namefile = '';
			
			if(!empty($_FILES)) {
				
				if(!empty($_FILES['photo']['tmp_name'])) {
								
					$path = 'img/img-big-format/';	
          // quality
					imagejpeg($path, $namefile, 50); 								
					$namefile = filename($_FILES['photo']['name'], $_POST['titre']);
			
					$return = upload($_FILES['photo'], $namefile, $path, array('image/jpg', 'image/jpeg'));
					
					$message = $return[0];
					$erreur = $return[1];
					
					if($erreur <= 1) {			
						imageparfaite(600, 400, $path.$namefile, $path.$namefile, 1);
					} else {
						$erreurs['image'] = $message;
					}			
										
				} 
			}

Re: Optimiser les images

Posté : 26 juin 2016, 11:54
par @rthur
Tu l'a mal placé à mon avis.
Tu dois l'utiliser dans ta fonction imageparfaite je pense

Re: Optimiser les images

Posté : 26 juin 2016, 12:14
par yoann38
Apparament reste à trouver ou ?
;)

Re: Optimiser les images

Posté : 26 juin 2016, 12:47
par Ryle
Là où imageparfaite() fait appel à imagejpeg() ? :-P
Peut-être dans les createminiature ou autre ?

Re: Optimiser les images

Posté : 26 juin 2016, 20:04
par yoann38
j'ai ma premiere fonction createMiniature avec $quality mais même si je change 75 par 50 par exemple, je ne gagne rien du tout en poids
et ensuite ma deuxième fonction
dessous
// Creation d'une miniature
	function createMiniature($originalFileName, $destinationFileName, $finalWidth=NULL, $finalHeight=NULL, $quality=75){ 
			
		// Si l'image existe déjà, on la supprime	
		if(file_exists($destinationFileName) && ($originalFileName != $destinationFileName)) unlink($destinationFileName);
		
		// Variable
		$fichier = pathinfo($destinationFileName, PATHINFO_BASENAME);
		$content_dir = pathinfo($destinationFileName, PATHINFO_DIRNAME);
		$extension = pathinfo($originalFileName, PATHINFO_EXTENSION); 		
		$return = NULL;
		
		// Si le dossier n'existe pas, on le créé
		createDir($content_dir);
					
		if (preg_match("/^jpe?g$/i", $extension)){ 
		 $sourceImage = imagecreatefromjpeg($originalFileName); 
		 $jpeg = TRUE; 
		} 
		if (preg_match("/^png$/i", $extension)){ 
		 $sourceImage = imagecreatefrompng($originalFileName); 
		 $png = TRUE; 
		}
		if (preg_match("/^gif$/i", $extension)){ 
		 $sourceImage = imagecreatefromgif($originalFileName); 
		 $gif = TRUE; 
		} 			  			
					
		// On recupere les tailles de l'image de base		
		$imgWidth = imagesx($sourceImage); 
		$imgHeight = imagesy($sourceImage);
		
		// Hack pour que l'image reste proportionnel si les deux cotés sont renseigné		
		$finalWidth = ($finalWidth == $finalHeight) && ($imgHeight >= $imgWidth) ? NULL : $finalWidth;
		$finalHeight = ($finalWidth == $finalHeight) && ($imgHeight <= $imgWidth) ? NULL : $finalHeight;
	
		// En cas d'informations que sur un coté
		if(empty($finalWidth) && empty($finalHeight)) {		
			$finalWidth = $imgWidth;
			$finalHeight = $imgHeight;			
		} elseif(empty($finalWidth) && !empty($finalHeight)) {
			$finalWidth = $imgWidth*($finalHeight/$imgHeight);			
		} elseif(empty($finalHeight) && !empty($finalWidth)) {
			$finalHeight = $imgHeight*($finalWidth/$imgWidth);			
		} 
		
		// Si ca ne miniature pas, on annule
		if(($finalHeight >= $imgHeight) || ($finalWidth >= $imgWidth)) {
		
			// Si l'image est different de la destination alors on copie la même image ailleurs
			if($originalFileName != $destinationFileName) {
				copy($originalFileName, $destinationFileName);
				$return .= "<br />L'image <strong>".$fichier."</strong> n'avait pas besoin d'être miniaturisée. Elle a juste été dupliquée vers la nouvelle destination.";
			} 
			
			
		} else {
		
			// Création de la miniature
			$newImage = imagecreatetruecolor($finalWidth, $finalHeight); 
			$color_bg = imagecolorallocate($newImage, 252, 252, 252);  
			imagefill($newImage, 0, 0, $color_bg);
			$imagecopyresampled = imagecopyresampled($newImage, $sourceImage, 0, 0, 0, 0, $finalWidth, $finalHeight, $imgWidth, $imgHeight); 
			!empty($jpeg) ? imagejpeg($newImage, $destinationFileName, $quality) : false; 
			!empty($png) ? imagepng($newImage, $destinationFileName, $quality) : false; 
			!empty($gif) ? imagegif($newImage, $destinationFileName, $quality) : false; 
			imagedestroy($newImage);
			
			$return .= "<br />Le fichier <strong>".$fichier."</strong> à bien été miniaturisé au format ".round($finalWidth)."x".round($finalHeight);
			
		}
		
	return $return;		
		
	}
Deuxième fonction:
// Creation d'une image coupé
	function makeSample($originalFileName, $destinationFileName=NULL, $finalWidth=NULL, $finalHeight=NULL, $random=0, $quality=75) { 
	
		// Variable
		$destinationFileName = !empty($destinationFileName) ? $destinationFileName : $originalFileName;
		$fichier = pathinfo($destinationFileName, PATHINFO_BASENAME);
		$content_dir = pathinfo($destinationFileName, PATHINFO_DIRNAME);
		$extension = pathinfo($originalFileName, PATHINFO_EXTENSION); 
		$return = NULL;		
		
		// Si le dossier n'existe pas, on le créé
		createDir($content_dir);

		if (preg_match("/^jpe?g$/i", $extension)){ 
		 $sourceImage = imagecreatefromjpeg($originalFileName); 
		 $jpeg = TRUE; 
		} 
		if (preg_match("/^png$/i", $extension)){ 
		 $sourceImage = imagecreatefrompng($originalFileName); 
		 $png = TRUE; 
		}
		if (preg_match("/^gif$/i", $extension)){ 
		 $sourceImage = imagecreatefromgif($originalFileName); 
		 $gif = TRUE; 
		} 
					
					
		// On recuperere les tailles de l'image	
		$imgWidth = imagesx($sourceImage); 
		$imgHeight = imagesy($sourceImage);
		
		if(($imgWidth == $finalWidth) && ($imgHeight == $finalHeight)) {
			
			$return .= "<br />L'image ".$fichier." n'avait pas besoin d'être recadrée";
			
		} else {
		
			// Recadrage minimal
			$min = ($imgWidth < $imgHeight) ? $imgWidth : $imgHeight;
			$finalWidth = !empty($finalWidth) ? $finalWidth : $min;
			$finalHeight = !empty($finalHeight) ? $finalHeight : $min;
							
			// On recadre l'image en coupant les parties en dehors du carré
			if($random == 1) {
				$cropX = ($imgWidth <= $finalWidth) ? 0 : rand(0, $imgWidth-$finalWidth);
				$cropY = ($imgHeight <= $finalHeight) ? 0 : rand(0, $imgHeight-$finalHeight);
				$debutWidth = ($imgWidth < $finalWidth) ? ($finalWidth-$imgWidth)/2 : 0;
				$debutHeight = ($imgHeight < $finalHeight) ? ($finalHeight-$imgHeight)/2 : 0;
			} else {
				$cropX = ($imgWidth <= $finalWidth) ? 0 : ($imgWidth-$finalWidth)/2;
				$cropY = ($imgHeight <= $finalHeight) ? 0 : ($imgHeight-$finalHeight)/2;
				$debutWidth = ($imgWidth < $finalWidth) ? ($finalWidth-$imgWidth)/2 : 0;
				$debutHeight = ($imgHeight < $finalHeight) ? ($finalHeight-$imgHeight)/2 : 0;
			}
						
			// Création de la miniature
			$newImage = imagecreatetruecolor($finalWidth, $finalHeight); 
			$color_bg = imagecolorallocate($newImage, 255, 255, 255);  
			imagefill($newImage, 0, 0, $color_bg);
			$imagecopyresampled = imagecopyresampled($newImage, $sourceImage, $debutWidth, $debutHeight, $cropX, $cropY, $imgWidth, $imgHeight, $imgWidth, $imgHeight); 
			!empty($jpeg) ? imagejpeg($newImage, $destinationFileName, $quality) : false; 
			!empty($png) ? imagepng($newImage, $destinationFileName, $quality) : false; 
			!empty($gif) ? imagegif($newImage, $destinationFileName, $quality) : false; 
			imagedestroy($newImage);
			
			$return .= "<br />Le fichier <strong>".$fichier."</strong> a bien été recadré avec la taille ".round($finalWidth)."x".round($finalHeight);
			
		}
		
	return $return;
	
	}