Effet miroir d'un texte (avec GD library)

Eléphant du PHP | 80 Messages

09 avr. 2007, 23:12

Voilà un petit script qui réalise l'effet miroir d'un texte, en affichant l'image avec le texte donné. Utile pour les titres d'un site si ces titres doivent être facilement modifiables par l'administrateur :

Illustrations :

Image

Image


Code source :
<?php
$caption = $_GET['t']; // On peut passer dans le script le parametre 't' avec le texte a afficher.
// Exemple : <img src="imgs/dynamic/textout.php?t=Texte%20ici%20!" alt="Texte ici !" />
if (!$caption) $caption = "Text reflection";

$shadow_alpha = 20; // 0 : Transparent; 100 : Opaque
$fade_multiplier = 1.2; // Avec les valeurs plus grandes, l'ombre disparait plus rapidement vers le bas

header("Content-type: image/png");
$im = @imagecreatefrompng("textout.png"); // !!! - Mettre ici l'image de l'arriere plan (500x80)
$im2 = @imagecreate(500, 80); // Seconde image
$background_color = imagecolorallocate($im2, 255, 255, 255);
$green = imagecolorallocatealpha($im, 0, 0, 64, 0);
$green2 = imagecolorallocate($im2, 0, 0, 64);
imagecolortransparent($im2, $background_color);
$font = 'E:/FONTS/VENUSRIS.ttf'; // !!! - Mettre ici le nom de la police de caracteres a utiliser

imagettftext($im, 25, 0, 11, 51, $green, $font, $caption); // Ecrit le texte principal
imagettftext($im2, 25, 0, 11, 51, $green2, $font, $caption); // Ecrit le texte qui va servir de l'ombre sur l'image $im2

for ($i = 0; $i < 30; $i++) // Copie le texte de l'image $im2 a l'image $im, en inversant les lignes et en les decalant.
{
  imagecopymerge($im, $im2, $i/4, 51+$i, 0, 51-$i, 500, 1, max($shadow_alpha-$i*$fade_multiplier, 0));
}

imagepng($im);
imagedestroy($im);
?>
Peut être ça peut servir à quelqu'un, qui sait... :wink:

Exemple d'utilisation du script : <img src="imgs/dynamic/textout.php?t=Texte%20ici%20!" alt="Texte ici !" />, où textout.php est le nom du fichier du script.

Mammouth du PHP | 1511 Messages

10 avr. 2007, 10:16

Moi je dis chapeau ^^.
C'est du beau boulot :P

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

10 avr. 2007, 11:29

Très chouette, une petite explication mathématique ? ;)

Eléphant du PHP | 80 Messages

10 avr. 2007, 14:26

Très chouette, une petite explication mathématique ? ;)
Je croyais que le code source parle de lui même. :wink:

En fait, on crée tout d'abord deux images : la première est $im et la deuxième - $im2.

La première vient d'un fichier PNG qui contient l'arrière plan. C'est elle qui est affichée à la fin. Sur cette image on trace le texte normal, sans ombre.

La deuxième a un arrière plan blanc et nous sert de presse papiers pour faire l'ombre. On trace tout d'abord exactement le même texte. Puis on définit la couleur blanche comme étant la couleur de transparence.

Une fois les deux images créées, on copie le contenu de la deuxième image vers la première image :
for ($i = 0; $i < 30; $i++) // ...
{
  imagecopymerge($im, $im2, $i/4, 51+$i, 0, 51-$i, 500, 1, max($shadow_alpha-$i*$fade_multiplier, 0));
}
(Ici c'est la fonction bool imagecopymerge ( resource dst_im, resource src_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h, int pct ) qui est utilisée donc pour copier)

En fait, on la copie ligne par ligne (d'où le paramètre src_y est égal à 1), ce qui permet de l'inverser. En outre, on décale les lignes successives sur l'image source (voir le troisième paramètre : dst_x=$i/4). Et finalement, on rend les lignes successives de plus en plus transparentes (voir le dernier paramètre : pct=max($shadow_alpha-$i*$fade_multiplier, 0)).

Et voilà !