/* * Fichier expl_1.c * * Pour les explications de base, * se reporter à l'article sur gd. */ #include #include #include // Deux macros qui simplifient la vie #define brect_largeur (brect[4]-brect[0]) #define brect_hauteur (brect[1]-brect[5]) int main(void) { gdImagePtr image; FILE *image_png; char *err; int rouge, blanc, jaune, noir; char *chaine = "santé"; // La chaîne à écrire char *font = "/home/xavier/Docs/contribs_lea/c4/comic.ttf"; // Le chemin relatif ou absolu vers la police double taille = 20; // La taille de la police int brect[8]; // Les coordonnées du rectangle entourant le texte entier. /* brect[0] X bas gauche * brect[1] Y bas gauche * brect[2] X bas droit * brect[3] Y bas droit * brect[4] X haut droit * brect[5] Y haut droit * brect[6] X haut gauche * brect[7] Y haut gauche */ image = gdImageCreate(100, 100); blanc = gdImageColorAllocate(image, 255, 255, 255); rouge = gdImageColorAllocate(image, 255, 0, 0); jaune = gdImageColorAllocate(image, 255, 255, 0); noir = gdImageColorAllocate(image, 0, 0, 0); gdImageFilledRectangle(image, 20, 40, 80, 60, rouge); gdImageFilledRectangle(image, 40, 20, 60, 80, rouge); /* Les nouveautés commencent ici */ /* On a droit à 60x20 pour placer notre chaîne * soit brect[4]-brect[0]<60 ET brect[1]-brect[5]<20 * --> Pour récupérer brect sans écrire le texte, on place im à NULL * Si on a un dépassement on réduit la taille de la police et on recommence */ do { err = gdImageStringFT (NULL, brect, jaune, font, taille--, 0, 0, 0, chaine); if (err) fprintf(stderr, "%s\n", err); fprintf (stderr, "Essai taille : %.0f\n", taille+1); fprintf (stderr, "* bas gauche ( %d, %d ), haut droite ( %d, %d )\n", brect[0], brect[1], brect[4], brect[5]); fprintf (stderr, "* largeur x hauteur : %dx%d\n", brect_largeur, brect_hauteur); } while ( ( brect_hauteur >= 20 ) || ( brect_largeur >= 60 ) ); /* Une fois ici on a la bonne taille moins un * On cherche les coordonnées pour centrer le texte, * sachant que le centre de l'image est à (50,50) */ /* gdImageRectangle (image, 50-brect_largeur/2, 50-brect_hauteur/2, 50+brect_largeur/2, 50+brect_hauteur/2, noir); */ /* Le milieu de l'image la moitié de la largeur nous donne le x gauche * Le milieu de l'image + la moitié de la hauteur nous donne le y bas * on retracnche la moitié des brect[0] et brect[1] * car on a vu qu'il ne valaient pas nécéessairement 0 */ err = gdImageStringFT (image, brect, jaune, font, ++taille, 0, 50-(brect_largeur-brect[0])/2, 50+(brect_hauteur-brect[1])/2, chaine); if (err) fprintf(stderr, "%s\n", err); /* Les nouveautés s'arrêtent ici */ image_png = fopen("expl1.png", "w"); gdImagePng(image, image_png); fclose(image_png); gdImageDestroy(image); exit (0); }