GOGOPHOTO Il y a 9 mois Répondre
Peut-on prendre le plus grand carré possible dans l'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.
Image::resize($monImage,$maMiniature,$largeur,) // Cropera l'image exactement
Image::resize($monImage,$maMiniature,$largeur) // Gardera le ratio mais avec la largeur indiquée
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.
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
juniorb Il y a 5 mois Répondre
Est-il possible de redimensionner les images avec une hauteur définie et non la largeur ?