Redimensionner proportionnellement une image avec imagecopyresampled

Développeur PHP à Vendôme (41100) > Redimensionner proportionnellement une image

Le cas d'école par excellence, celui par lequel nombre d'entre-nous ont découvert GD à leurs débuts: redimensionner proportionnellement une image avec PHP.

Classique oblige, on ne compte même plus le nombre de fois que le sujet a été traité sur la toile, même si aujourd'hui la demande est beaucoup moins forte qu'avant, la plupart des sites fonctionnant désormais avec des systèmes comme Wordpress ou Drupal qui gèrent ça par défaut. Cela dit, comme il subsiste quelques valeureux partisans du système maison parmi les développeurs en herbe, une fois de plus ne pourra pas faire de mal.

imagecopyresampled

Avant toute chose, un petit point rapide s'impose sur imagecopyresampled, la fonction PHP qui permet de redimensionner.

Concrètement, imagecopyresampled est une fonction dont le mode opératoire est de fusionner deux images. Il lui faut donc une image maîtresse et une image à insérer (tout ou partie) dans l'image maîtresse, l'insertion se faisant aux coordonnées spécifiées. Si l'espace disponible est trop restreint pour accueillir l'image à insérer, imagecopyresampled la rétrécit pour qu'elle puisse s'intégrer.

Pour fonctionner imagecopyresampled a donc besoin de 10 arguments (dans l'ordre):

  • Image maîtresse
  • Image à insérer
  • Point de départ horizontal d'insertion sur l'image maîtresse
  • Point de départ vertical d'insertion sur l'image maîtresse
  • Point de départ horizontal du prélèvement à effectuer sur l'image à insérer
  • Point de départ vertical du prélèvement à effectuer sur l'image à insérer
  • Largeur de l'image maîtresse
  • Hauteur de l'image maîtresse
  • Largeur de l'mage à insérer
  • Hauteur de l'mage à insérer

Redimensionner proportionnellement

Pour redimensionner proportionnellement une image, il suffit donc de calculer ses nouvelles dimensions et de créer une image maîtresse vide selon les dimensions calculées, il ne restera ensuite qu'à fusionner les deux images avec imagecopyresampled.

Voyons comment tout ceci prend forme dans une fonction avec quatre arguments:

  • Chemin vers l'image à redimensionner
  • Largeur maximale de l'image redimensionnée
  • Hauteur maximale de l'image redimensionnée
  • Chemin vers l'image redimensionnée


<?php

function redimensionner($source,$largeur_max,$hauteur_max,$destination){

$format = mime_content_type($source);

if($format == 'image/jpeg' || $format == 'image/gif' || $format == 'image/png'){

//dim pour les dimensions de l'image source
//dim_ pour les dimensions de l'image redimensionnée

$dim = getimagesize($source);

//si la hauteur est supérieure à la hauteur max
if($dim[1] > $hauteur_max){

//la hauteur devient la hauteur max
//la largeur est réduite proportionnellement
$dim_ = array($dim[0] / ($dim[1] / $hauteur_max),$hauteur_max);

} else {

$dim_ = array($dim[0],$dim[1]);

}

//si la largeur est supérieure à la largeur max
if($dim_[0] > $largeur_max){

//la largeur devient la largeur max
//la hauteur est réduite proportionnellement
$dim_ = array($largeur_max,$dim_[1] / ($dim_[0] / $largeur_max));

}

if($format == 'image/jpeg'){

//récupération de l'image à redimensionner
$source = imagecreatefromjpeg($source);

//création d'une image vide selon les dimensions de dim_
$source_ = imagecreatetruecolor($dim_[0],$dim_[1]);

//intégration d'img dans img_
imagecopyresampled($source_,$source,0,0,0,0,$dim_[0],$dim_[1],$dim[0],$dim[1]);

//enregistrement
return imagejpeg($source_,$destination);

} else if($format == 'image/gif'){

$source = imagecreatefromgif($source);
$source_ = imagecreatetruecolor($dim_[0],$dim_[1]);
imagecopyresampled($source_,$source,0,0,0,0,$dim_[0],$dim_[1],$dim[0],$dim[1]);

return imagegif($source_,$destination);

} else if($format == 'image/png'){

$source = imagecreatefrompng($source);
$source_ = imagecreatetruecolor($dim_[0],$dim_[1]);
imagecopyresampled($source_,$source,0,0,0,0,$dim_[0],$dim_[1],$dim[0],$dim[1]);

return imagepng($source_,$destination);

}

imagedestroy($source);
imagedestroy($source_);

} else {

return false;

}

}

?>


<?php

$source = 'chemin/vers/image-a-redimensionner.gif/jpg/png';
$largeur_max = 1000;
$hauteur_max = 700;
$destination = 'chemin/vers/image-redimensionnee.gif/jpg/png';

if(redimensionner($source,$largeur_max,$hauteur_max,$destination) !== false){

//réussite

} else {

//échec

}

?>

Par , publié sur feu-sacre.net le 14-03-2019

Commentaires des internautes

Cliquer ici pour publier un commentaire (aucune inscription requise).