[PHP] Redimensionner des images automatiquement

Wallpaper PHP - Code while awake
Ce matin c’est un snippet PHP que je vous propose : une petite fonction qui permet de jouer avec les dimensions d’une image. Cette fonction bien pratique me sert beaucoup dans l’un de mes projets, voici ce qu’elle sait faire :

  • Redimensionnement d’images en conservant les proportions (calcul de la largeur en fonction de la hauteur ou de la hauteur en fonction de la largeur),
  • Renommage et déplacement de l’image où vous voulez,
  • Formats acceptés : JPEG, GIF et PNG,
  • Utilisation au choix de la librairie GD ou d’ImageMagick,
  • Conversion automatique en JPEG,
  • Enfin, si aucun redimensionnement n’est demandé, la fonction permet aussi de convertir une image GIF ou PNG en JPEG.

Dans mon projet, cette fonction s’appelle darkroom(), en rapport avec les vieilles chambres noires où nos photographes développaient jadis nos photos (vous savez, celles prises avec les appareils dont il fallait « rembobiner » la pellicule !).

/**
* La fonction darkroom() renomme et redimensionne les photos envoyées lors de l'ajout d'un objet.
* @param $img String Chemin absolu de l'image d'origine.
* @param $to String Chemin absolu de l'image générée (.jpg).
* @param $width Int Largeur de l'image générée. Si 0, valeur calculée en fonction de $height.
* @param $height Int Hauteur de l'image génétée. Si 0, valeur calculée en fonction de $width.
* Si $height = 0 et $width = 0, dimensions conservées mais conversion en .jpg
*/
function darkroom($img, $to, $width = 0, $height = 0, $useGD = TRUE){
 
	$dimensions = getimagesize($img);
	$ratio      = $dimensions[0] / $dimensions[1];
 
	// Calcul des dimensions si 0 passé en paramètre
	if($width == 0 && $height == 0){
		$width = $dimensions[0];
		$height = $dimensions[1];
	}elseif($height == 0){
		$height = round($width / $ratio);
	}elseif ($width == 0){
		$width = round($height * $ratio);
	}
 
	if($dimensions[0] > ($width / $height) * $dimensions[1]){
		$dimY = $height;
		$dimX = round($height * $dimensions[0] / $dimensions[1]);
		$decalX = ($dimX - $width) / 2;
		$decalY = 0;
	}
	if($dimensions[0] < ($width / $height) * $dimensions[1]){
		$dimX = $width;
		$dimY = round($width * $dimensions[1] / $dimensions[0]);
		$decalY = ($dimY - $height) / 2;
		$decalX = 0;
	}
	if($dimensions[0] == ($width / $height) * $dimensions[1]){
		$dimX = $width;
		$dimY = $height;
		$decalX = 0;
		$decalY = 0;
	}
 
	// Création de l'image avec la librairie GD
	if($useGD){
		$pattern = imagecreatetruecolor($width, $height);
		$type = mime_content_type($img);
		switch (substr($type, 6)) {
			case 'jpeg':
				$image = imagecreatefromjpeg($img);
				break;
			case 'gif':
				$image = imagecreatefromgif($img);
				break;
			case 'png':
				$image = imagecreatefrompng($img);
				break;
		}
		imagecopyresampled($pattern, $image, 0, 0, 0, 0, $dimX, $dimY, $dimensions[0], $dimensions[1]);
		imagedestroy($image);
		imagejpeg($pattern, $to, 100);
 
		return TRUE;
 
        // Création de l'image avec 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;
}

Je vous passe les détails des explications, je pense que le code est suffisamment clair. Néanmoins si vous souhaitez plus d’informations sur les librairies utilisées, vous pouvez aller vous renseigner sur la documentation PHP de la libraire GD, ou sur ImageMagick.com.

Sources : Merci Thomas pour le snippet | Image

Cet article vous a plu ? Partagez-le sur les réseaux sociaux !

Twitter Facebook Google Plus email