Ressource PHP : Redimensionner une image

Travailler sur une image n'est pas une chose facile avec PHP, il faut utiliser la librairie GD et essayer de bien calculer les dimensions pour ne pas déformer l'image. Je vous propose aujourd'hui la fonction que j'utilise pour la plupart de mes projets.

Utilisation

    Image::resize($monImage,$maMiniature,$largeur,) // Cropera l'image exactement
    Image::resize($monImage,$maMiniature,$largeur) // Gardera le ratio mais avec la largeur indiquée

La classe Image



class Image{

	public static $useGD = true; // On utilise la librairie GD ?
    public static $quality = 90; 
	
	/**
	* Permet de redimensionner/cropper une image
	* @param $img String Chemin absolu de l'image d'origine
	* @param $dest String Chemin absolu de l'image générée (.jpg)
	* @param $largeur Int Largeur de l'image générée, si 0 cette valeur sera calculé en fonction de la hauteur
	* @param $hauteur Int Hauteur de l'image générée, si 0 cette valeur sera calculé en fonction de la largeur
	* Si largeur et hauteur = 0 l'image gardera son format d'origine mais sera convertie en JPG
	**/
	public static function resize($img,$dest,$largeur=0,$hauteur=0){
		// On récupère les dimensions de l'image
		$dimension=getimagesize($img);
		$ratio = $dimension[0] / $dimension[1];	// Et son ratio
		
		// On trouve les dimension finale 
		// (si on a passé 0 en paramètre c'est que l'on veut que le paramètre s'adapte pour conserver le ratio)
		if($largeur==0 && $hauteur==0){ $largeur = $dimension[0]; $hauteur = $dimension[1]; }
		else if($hauteur==0){ $hauteur = round($largeur / $ratio); }
		else if($largeur==0){ $largeur = round($hauteur * $ratio); }
		
		// Si on doit "cropper" l'image on cherche de cb de px on doit décaler l'image miniatures pour la centrer
		if($dimension[0]>($largeur/$hauteur)*$dimension[1] ){ $dimY=$hauteur; $dimX=round($hauteur*$dimension[0]/$dimension[1]); $decalX=($dimX-$largeur)/2; $decalY=0;}
		if($dimension[0]<($largeur/$hauteur)*$dimension[1]){ $dimX=$largeur; $dimY=round($largeur*$dimension[1]/$dimension[0]); $decalY=($dimY-$hauteur)/2; $decalX=0;}
		if($dimension[0]==($largeur/$hauteur)*$dimension[1]){ $dimX=$largeur; $dimY=$hauteur; $decalX=0; $decalY=0;}
		
		// On crée l'image avec la librairie GD
		if(self::$useGD){
			$miniature =imagecreatetruecolor ($largeur,$hauteur);
			if(substr($img,-4)==".jpg" || substr($img,-4)==".JPG"){$image = imagecreatefromjpeg($img); }
			if(substr($img,-4)==".png" || substr($img,-4)==".PNG"){$image = imagecreatefrompng($img); }
			if(substr($img,-4)==".gif" || substr($img,-4)==".GIF"){$image = imagecreatefromgif($img); }

			imagecopyresampled($miniature,$image,-$decalX,-$decalY,0,0,$dimX,$dimY,$dimension[0],$dimension[1]);
			imagejpeg($miniature,$dest,self::$quality);
			
			return true;
			
		// Ou on utilise imagemagick
		}else{
			$cmd = '/usr/bin/convert -resize '.$dimX.'x'.$dimY.' "'.$img.'" "'.$dest.'"';
			shell_exec($cmd);

			$cmd = '/usr/bin/convert -gravity Center -quality '.self::$quality.' -crop '.$largeur.'x'.$hauteur.'+0+0 -page '.$largeur.'x'.$hauteur.' "'.$dest.'" "'.$dest.'"';
			shell_exec($cmd);
		}
         return true;
	}
}

Après avoir appris sur Internet quoi de plus normal que de partager à son tour ? Passionné par le web depuis un peu plus de 5 ans maintenant j'aime partager mes compétences et mes découvertes avec les personnes qui ont cette même passion pour le web : Vous.

Vous aimerez aussi

Cropper une image

Voici une petite fonction PHP utile qui vous permet de cropper une...

Quelques tableaux utiles

Quel développeur ne s'est pas déja retrouvé à devoir lister l'ensemble...

14 commentaires
Ajouter un commentaire

juniorb Il y a 5 mois Répondre

Est-il possible de redimensionner les images avec une hauteur définie et non la largeur ?

GOGOPHOTO Il y a 9 mois Répondre

Peut-on prendre le plus grand carré possible dans l'image ?

Neolone Il y a 10 mois Répondre

Vraiment sympa cette classe ! Et très utile !
Mais je rencontre un problème...
Tout marche impec sauf quand j'upload une image au format portrait.
J'ai bien un redimensionnement mais ensuite l'image se met en format paysage...
Les proportions sont bien les mêmes mais l'image est tournée...

Une idée de ce que ça pourrait être ? Et comment régler le problème ?

miRkaStruk Il y a 10 mois Répondre

Bonne librairie, mais j'ai un souci de taille d'allocation de mémoire sur certaine images jpeg. J'ai tenté d'augmenter dans le php.ini memory_limit de 8M à 128M mais ça ne marche pas ! J'ai aussi, par l'occasion, rajouté dans le code de la classe image à la ligne 39, la fonction imagedestroy($miniature); ...

Ekozan Il y a 11 mois Répondre

J'ai fait une petite modif a ton code qui ne prend pas en compte les fichiers .jpeg

ligne 33
[code]if(substr($img,-4)==".jpg" || substr($img,-4)==".JPG" || substr($img,-5)==".jpeg" || substr($img,-5)==".JPEG" )[/code]

Extenz Il y a 1 an Répondre

Merci pour cette class .
Juste un détail, les png avec transparence sont redimensionnés sur fond noir.
J'ai modifié vite fait la classe, je le met ici au cas où.



// On crée l'image avec la librairie GD
if(self::$useGD){
$miniature =imagecreatetruecolor ($largeur,$hauteur);
if(substr($img,-4)==".jpg" || substr($img,-4)==".JPG")
{
$image = imagecreatefromjpeg($img);
$miniature =imagecreatetruecolor ($largeur,$hauteur);
imagecopyresampled($miniature,$image,-$decalX,-$decalY,0,0,$dimX,$dimY,$dimension[0],$dimension[1]);
imagejpeg($miniature,$dest,self::$quality);
}
if(substr($img,-4)==".png" || substr($img,-4)==".PNG")
{
$image = imagecreatefrompng($img);
$miniature =imagecreatetruecolor ($largeur,$hauteur);
imagealphablending($miniature,FALSE);
imagesavealpha($miniature,TRUE);
imagecopyresampled($miniature,$image,-$decalX,-$decalY,0,0,$dimX,$dimY,$dimension[0],$dimension[1]);
imagepng($miniature,$dest,9);
}
if(substr($img,-4)==".gif" || substr($img,-4)==".GIF")
{
$image = imagecreatefromgif($img);
$miniature =imagecreatetruecolor ($largeur,$hauteur);
imagecopyresampled($miniature,$image,-$decalX,-$decalY,0,0,$dimX,$dimY,$dimension[0],$dimension[1]);
imagegif($miniature,$dest,self::$quality);
}
return true;
// Ou on utilise imagemagick

Encore une fois, merci pour tous les tutoriels, je pense que je vais vite passer premium en guise de remerciement.

Extenz Il y a 1 an

Ah oui, à la ligne :
imagepng($miniature,$dest,9) j'ai enlevé l'appel à variable static $quality car la qualité d'image en png va de 0 à 9, et non 0 à 100 comme en jpg.

robin850 Il y a 11 mois - Répondre

Merci pour cette le code que tu as fourni d'une part Grafikart, ta classe marche nickel et aussi Extenz. Ça marche nickel aussi au niveau de la transparence.

nisstal Il y a 1 an Répondre

Salut,
rajoute le point virgule:
Image::resize($monImage,$maMiniature,$largeur);

jeanprudent Il y a 1 an Répondre

Je crois qu'il y a une petite correction à faire au niveau de la première utilisation! ça ne serait pas plutôt :
Image::resize($monImage,$maMiniature,$largeur,$longueur)

Tiorte Il y a 1 an Répondre

Marche impec!

Ph madoz Il y a 1 an Répondre

Bonjour j'ai un problème j'ai copié collé le code mais il me sort

- Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in ???

chikamuge Il y a 1 an Répondre

bonjour, je voudrais savoir comment vous arrivez à colorer votre code ?

j'ai fait quelque recherches, sur une page php, on peut utiliser un truc comme geshi, par contre si le code en question est sur une bdd, je sèche :s, pouvez vous m'éclérer s'il vous plais

tottosche Il y a 1 an - Répondre

Synthax Highlighter permet une belle presenatation de son code (et c'est celui utilisé sur ce site):
http://alexgorbatchev.com/SyntaxHighlighter/

musicalitymaker Il y a 1 an Répondre

Merci beaucoup!

darkavatars Il y a 1 an Répondre

Merci Super génial :D

x Ap0cALyPsE zZ Il y a 1 an Répondre

Mici bien

Laisser un commentaire

Si vous avez une question il est conseillé d'utiliser le forum si vous voulez une réponse sûre.