2009-07-07 4 views
1

D'accord, j'ai piraté avec GD Image pendant quelques mois, et une tâche que je voulais accomplir avec était de créer un script qui prend une image existante, puis crée une réflexion qui s'efface pour devenir translucide en dessous.
Le guide suivant montre comment le faire avec une couleur opaque: TalkPHP Forums Link

Dans ce forum, Rendair décrit un moyen de superposer un gradient dessiné dynamiquement en utilisant une couleur, avec le code PHP suivant:Réflexion d'image translucide en PHP GD

// Next we draw a GD line into our gradient_line 
imageline ($gradient_line, 0, 0, $imgName_w, 0, $gdGradientColor); 


$i = 0; 
$transparency = 30; //from 0 - 100 

    while ($i < $gradientHeight) //create line by line changing as we go 
    { 
     imagecopymerge ($background, $gradient_line, 0,$gradient_y_startpoint, 0, 0, $imgName_w, 1, $transparency); 

     ++$i; 
     ++$gradient_y_startpoint; 

       if ($transparency == 100) { 

        $transparency = 100; 

       } 
       else 
       { 
     // this will determing the height of the 
     //reflection. The higher the number, the smaller the reflection. 
     //1 being the lowest(highest reflection) 
        $transparency = $transparency + 1; 

       } 

    } 

Ce que j'essaye d'accomplir est un effet où nous avons uniformisé chaque ligne à une ombre plus translucide en utilisant la fonction alpha, mais il semble que j'ai du mal à l'appliquer une ligne à la fois. Jusqu'à présent, je ne peux que faire une petite tranche de l'image (une ligne de large) et ensuite superposer avec de la translucidité, je ne peux pas sembler fondre chaque ligne un peu plus. Donc, mon résultat devrait être l'image initiale, puis une copie réfléchie qui passe à 100% alpha transparent, mais je ne peux pas sembler accomplir cela.
Tous les gens de PHP là-bas qui ont des idées de génie?
Mise à jour: cette question m'a valu l'insigne tumbleweed.

+0

C'est une idée très cool et je _think_ j'ai une solution pour elle ... Je vais tester du code et revenir. – shadowhand

+0

Oh, j'aurais dû demander ... voulez-vous doubler la hauteur de l'image (image standard ci-dessus, réflexion flipped et fané ci-dessous)? – shadowhand

+0

L'un ou l'autre irait bien. Peut-être la compresser à la moitié de la taille, tout ce qui est plus facile. Je n'arrive pas à comprendre comment appliquer un masque, ou si vous devez le restituer une ligne à la fois et baisser l'opacité à chaque fois ou utiliser une fonction logarithmique pour le faire en douceur ou quelque chose, mais mon problème est que je Je ne peux jamais sembler le faire passer la ligne, je dois écrire quelque chose de telle sorte que c'est seulement interperer une copie. – NateDSaint

Répondre

1

Très bien, c'était intense. Pour garder une longue histoire courte, imagecopymerge ne gère pas correctement les canaux alpha. Au lieu de cela, vous devez utiliser imagefilter avec le filtre IMG_FILTER_COLORIZE pour réduire l'opacité de chaque ligne. Ce code fait maintenant partie de Image_GD (licence BSD). J'ai essayé de rendre le code aussi clair que possible, mais laissez-moi savoir si vous avez des questions.

Utilisation en utilisant la bibliothèque d'images Kohana fonctionne comme ceci:

// Makes a 20px tall reflection with a starting opacity of 100% 
// and overwrites the original image with the new one 
Image::factory($image_file)->reflection(20, 100)->save(); 

Les bits sont vraiment importantes lignes 265-287, qui gère la création de gradient ligne par ligne réelle. Toutes les instances de $this->width peuvent se traduire par imagesx($image) (et imagesy par $this->height). $this->_image fait référence à une ressource GD créée à partir d'une image existante.

Oh, et assurez-vous rendre l'image au format PNG ou l'alpha dégradé ne fonctionne pas correctement ... :)

+0

Génial! Je suis en train d'upvoter ceci pour le moment, mais je l'accepterai une fois que je l'aurai vérifié et que je l'aurai mis au travail. – NateDSaint

+0

En fait, avez-vous eu un échantillon de code, via "J'ai essayé de rendre le code aussi clair que possible", je n'en ai vu aucun dans cette réponse. – NateDSaint

+0

Mise à jour de ma réponse avec un exemple ... Si nécessaire, j'ai pu extraire la méthode de la classe en une seule fonction. – shadowhand

Questions connexes