IV. Comment… ? (howto)▲
IV-1. Mettre une légende sous une image▲
Avoir une image, c'est bien, mais parfois, on aime bien avoir des légendes sous ces images. Pour cela, nous avons besoin de connaître les dimensions et le poids de l'image et la largeur des caractères utilisés. Nous allons prendre pour exemple les vignettes produites par www.imageshack.us. Un exemple ci-dessous :
Étapes de programmation :
- Récupération du poids de l'image ;
- Récupération des dimensions ;
- Calcul des dimensions de l'image à créer ;
- Création du contour noir ;
- Création de la légende ;
- Ouverture du fichier ;
- Réduction et copie de l'image originale ;
- Destruction de l'image en mémoire.
Vous avez tout ce qu'il faut pour mener à bien ce miniprojet.
<?
/***************************************************/
/* première étape : récupération du poids de l'image*/
/***************************************************/
$file_name
=
'tux.jpg'
;
$file_size
=
filesize($file_name
);
//récupération de la taille en octets
$file_size
=
round($file_size
/
1024
);
//conversion en ko
/***************************************************/
/* seconde étape : calcul des dimensions de la */
/* nouvelle image comprenant contour + légende */
/***************************************************/
list
($largeur
,
$hauteur
) =
getimagesize($file_name
);
//dimensions de l'image originale
/***************************************************/
/* on veut une image réduite de 150px de large */
/* sans compter les contours */
/* on doit donc diviser la largeur par 150 */
/* on passe à l'inverse, car on multiplie par la */
/* suite : cela évite un agrandissement */
/***************************************************/
$ratio
=
150
/
$largeur
;
//ratio pour réduire à une taille voulue
$vignette_largeur
=
$largeur
*
$ratio
+
2
;
//on ajoute 2px à cause du contour
/* on ajoute 3px à cause du contour+légende */
/* imagefontheight retourne la hauteur en pixels */
/* d'une police sélectionnée : cela permet de */
/* calculer la hauteur de la légende */
$vignette_hauteur
=
$hauteur
*
$ratio
+
3
+
imagefontheight(3
);
$n_image_largeur
=
$largeur
*
$ratio
;
//largeur de l'image réduite
$n_image_hauteur
=
$hauteur
*
$ratio
;
//hauteur de l'image réduite
/***************************************************/
/* création de la vignette : on n'attribue aucune */
/* couleur pour laisser un cadre noir */
/***************************************************/
$image
=
imagecreatetruecolor($vignette_largeur
,
$vignette_hauteur
);
/***************************************************/
/* création de la légende : texte en blanc */
/***************************************************/
$blanc
=
imagecolorallocate($image
,
255
,
255
,
255
);
//couleur blanche
$string
=
$largeur
.
"x"
.
$hauteur
.
" "
.
$file_size
.
"ko"
;
//création du texte de légende
/* on doit déterminer l'endroit pour commencer */
/* à écrire. On centre le texte d'où la */
/* formulation plus complexe */
$write_h
=
$vignette_hauteur
-
imagefontheight(3
) -
1
;
//hauteur
/* centrage -> on récupère $n_largeur la largeur */
/* de la vignette, on lui retire la largeur de la */
/* police multipliée par le nombre de caractères */
/* puis on divise le résultat par 2 pour centrer */
$write_w
=
($vignette_largeur
-
strlen($string
) *
imagefontwidth(3
))/
2
;
imagestring($image
,
3
,
$write_w
,
$write_h
,
$string
,
$blanc
);
//on écrit la légende
/***************************************************/
/* ouverture du fichier */
/***************************************************/
$source
=
imagecreatefromjpeg($file_name
);
/***************************************************/
/* réduction, rééchantillonnage et copie de l'image */
/* originale */
/* on recopie l'image à partir du point de */
/* coordonnées 1,1 pour laisser un cadre noir */
/***************************************************/
imagecopyresampled($image
,
$source
,
1
,
1
,
0
,
0
,
$n_image_largeur
,
$n_image_hauteur
,
$largeur
,
$hauteur
);
/***************************************************/
/* envoi de l'image et destruction */
/***************************************************/
header('Content-type: image/png'
);
imagepng($image
);
imagedestroy($image
);
/***************************************************/
/* c'est la fin ! un petit café ? */
/***************************************************/
?>
Vous devriez obtenir ceci
IV-2. Mettre une couleur sur toute l'image▲
C'est simple, il suffit d'utiliser imagefill ou imagefilledrectangle.
ATTENTION ! imagefill ne gère plus la transparence depuis gd 2.0.15
<?
//ouverture de l'image
$image
=
imagecreatefromjpeg('first_open.jpg'
);
//création d'un rouge transparent
$couleur
=
imagecolorallocatealpha($image
,
255
,
0
,
0
,
50
);
//création d'un rectangle rempli de $couleur de la taille de l'image
imagefilledrectangle($image
,
0
,
0
,
imagesx($image
),
imagesy($image
),
$couleur
);
//envoi des informations au navigateur
header('content-type: image/jpeg'
);
imagepng($image
);
imagedestroy($image
);
?>
Vous devriez obtenir ceci