Création d'images miniatures carré avec la bibliothèque GD
Par Nico, mercredi 31 octobre 2007
Pour tous les feignants comme moi qui n'ont pas envie d'ouvrir photoshop pour créer manuellement une miniature, cette fonction va vous faire plaisir. Et petit bonus, l'image générée est en forme de carré pour servir d'icone.
Activer la bibliothèque
Tout d'abord si vous voulez tester cette fonction en local, vous devez activer la GD library. Donc lancez easyphp (sur les autres logiciels je sais pas comment ça marche). Faites un clique droit sur le "e" (l'icone d'easyphp) dans la barre de tache > Configuration > Extention PHP. Ensuite sélectionné le champ "php_gd2" puis "appliquer".En ligne, dans la grande majorité des cas elle est activé par défaut.
La fonction
Je vais décomposer la fonction en plusieurs partie pour mieux comprendre.
<?php function miniature($chemin_original, $chemin_tumb, $fichier_image, $largeur_tumb){
$info = getimagesize($chemin_original.$fichier_image);
Ceci permet de connaitre les informationn de l'image et notamment le type. En fait la fonction va renvoyer un tableau qui ressemble à ceci :
Array ( 0 => 278, 1 => 220, 2 => 2, 3 => 'width="278" height="220"', 'bits' => 8, 'channels' => 3 )
Ce qui nous interesse ici est la case 2 qui correspond au type. Ici nous avons plusieurs valeurs possibles :
1 = GIF, 2 = JPG, 3 = PNG, 6=bmp
Nous nous servirons aussi de la largeur et hauteur qui correspondent à la case 0 et 1.
if($info[2]==1) {
$image_origine = imagecreatefromgif("$chemin_original/$fichier_image");
}else{
if($info[2]==2){
$image_origine = imagecreatefromjpeg("$chemin_original/$fichier_image");
}else{
if($info[2]==3){
$image_origine = imagecreatefrompng("$chemin_original/$fichier_image");
}
}
}
Ici, pour simplifier, nous ouvrons le fichier (le nom est trompeur). Nous faisons donc du cas par cas en utilisant les infos que nous avons récolté précédemment.
$largeur_origine = $info[0];
$hauteur_origine = $info[1];
$image_finale = imagecreatetruecolor($largeur_tumb, $largeur_tumb);
//on veux que l'image tienne dans un carré
if($largeur_origine>$hauteur_origine){//image "paysage"
$x_copie = $y_copie = 0;
$w_copie = $h_copie = $hauteur_origine;
$x_colle = $y_colle = 0;
$w_colle = $h_colle = $largeur_tumb;
}else{//image "portrait"
$x_copie = $y_copie = 0;
$w_copie = $h_copie = $largeur_origine;
$x_colle = $y_colle = 0;
$w_colle = $h_colle =$largeur_tumb;
}
imagecopyresized($image_finale,$image_origine,$x_colle,$y_colle, $x_copie,$y_copie,$w_colle,$h_colle,$w_copie,$h_copie);
imagecreatetruecolor() est une fonction qui crée une image blanche aux dimensions spécifiées (image temporaire). Elle va nous servir de base pour "coller" l'image finale.Ensuite nous allons définir la zone (dans mon cas un carré) de l'image qui sera redimentionnée. Une image étant en général rectangulaire, il faut trouver le plus petit coté pour créer la zone. Un petit dessin vaut mieux qu'un long discours :

Enfin la fonction imagecopyresized copie donc la partie carré de l'image dans l'image blanche déjà créée (l'image temporaire).
if($info[2]==1) {
imagegif($image_finale, "$chemin_tumb/$fichier_image");
}else{
if($info[2]==2){
imagejpeg($image_finale, "$chemin_tumb/$fichier_image");
}else{
if($info[2]==3){
imagepng($image_finale, "$chemin_tumb/$fichier_image");
}
}
}
imagedestroy($image_finale);
return true;
}
?>
Ici nous copions l'image temporaire dans le répertoire de destination puis nous la supprimons. l'appel de la fonction
donc voici comme doit se faire l'appel :miniature($chemin_original, $chemin_tumb, $fichier_image, $taille);
$chemin_original : chemin pour la grande image$chemin_tumb : chemin de la miniature
$fichier_image : chemin du fichier d'origine
$taille : taille en px d'un coté de la miniature
Fichier source
Etant donné que ce billet est destiné aux fénéants, je vous mets directement la source pour vous evitez de faire des copier-coller :source :
gd.zip(1ko)Pour avoir une idée d'utilisation : aperçu

Commentaires
1. Le vendredi 9 novembre 2007 à 19:42, par Gekko
2. Le vendredi 9 novembre 2007 à 21:20, par SnorkY
3. Le samedi 10 novembre 2007 à 00:52, par etherealwtf
4. Le samedi 10 novembre 2007 à 13:16, par donc
5. Le samedi 10 novembre 2007 à 14:47, par tibo
Réponse de Nico le samedi 10 novembre 2007 à 15:53
6. Le samedi 10 novembre 2007 à 17:14, par Nico
7. Le vendredi 6 février 2009 à 11:37, par rapeuse41
8. Le mardi 10 février 2009 à 06:07, par sarah154
Ajouter un commentaire