Changeset 32052 in spip-zone


Ignore:
Timestamp:
Oct 12, 2009, 6:00:48 PM (10 years ago)
Author:
prigent.yohann@…
Message:

la fonction pour réflechir l'image marche entierement, tiré de http://reflection.corephp.co.uk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/fonctions_images/fonctions_images_fonctions.php

    r32033 r32052  
    11891189}
    11901190
    1191 function image_reflechir($im, $hauteur=45){
     1191//
     1192// filtre tiré de http://reflection.corephp.co.uk
     1193// adapté par Yohann Prigent
     1194//
     1195function image_reflechir($im, $hauteur=0.5, $alphastart=80, $alphaend=0, $red=127, $green=127, $blue=127){
    11921196        include_spip("inc/filtres_images");
    1193         $image = image_valeurs_trans($im, "relechir-$hauteur");
     1197        $image = image_valeurs_trans($im, "relechir-$hauteur-$alphastart-$alphaend", "png");
    11941198        if (!$image) return("");
    1195     $x_i = $image["largeur"];
    1196     $y_i = $image["hauteur"];
     1199    $width = $image["largeur"];
     1200    $height = $image["hauteur"];
    11971201    $im = $image["fichier"];
    11981202    $dest = $image["fichier_dest"];
    11991203    $creer = $image["creer"];
     1204    $new_height = $height * $hauteur;
    12001205        if($creer) {
    1201                 if($hauteur > $y_i)
    1202                         $hauteur = $y_i;
    1203                 $im = $image["fonction_imagecreatefrom"]($im);
    1204                 $resultat = imagecreatetruecolor($x_i, $y_i + $hauteur);
    1205                 $gradientHeight = $hauteur;
    1206                 // Create new blank image with sizes.
    1207                 $background = imagecreatetruecolor($x_i, $gradientHeight);
    1208                 $gradientColor = "255 255 255"; //White
    1209                 $gradparts = explode(" ",$gradientColor); // get the parts of the  colour (RRR,GGG,BBB)
    1210                 $dividerHeight = 1;
    1211                 $gradient_y_startpoint = $dividerHeight;
    1212                 $gdGradientColor=ImageColorAllocate($background,$gradparts[0],$gradparts[1],$gradparts[2]);
    1213                 $newImage = imagecreatetruecolor($x_i, $y_i);
    1214                 for ($x = 0; $x < $x_i; $x++) {
    1215                 for ($y = 0; $y < $y_i; $y++) {
    1216                         imagecopy($newImage, $im, $x, $y_i - $y - 1, $x, $y, 1, 1);
    1217                 }
    1218                 }
    1219                 // Add it to the blank background image
    1220                 imagecopymerge ($background, $newImage, 0, 0, 0, 0, $x_i, $y_i, 100);
    1221                 //create from a the image so we can use fade out.
    1222                 $gradient_line = imagecreatetruecolor($x_i, 1);
    1223                 // Next we draw a GD line into our gradient_line
    1224                 imageline ($gradient_line, 0, 0, $x_i, 0, $gdGradientColor);
    1225                 $i = 0;
    1226                 $transparency = 30; //from 0 - 100
    1227                 while ($i < $gradientHeight) //create line by line changing as we go
    1228                 {
    1229                 imagecopymerge ($background, $gradient_line, 0,$gradient_y_startpoint, 0, 0, $x_i, 1, $transparency);
    1230                 ++$i;
    1231                 ++$gradient_y_startpoint;   
    1232                         if ($transparency == 100) {
    1233                                 $transparency = 100;
    1234                         }
    1235                         else {
    1236                                 // this will determing the height of the
    1237                                 //reflection. The higher the number, the smaller the reflection.
    1238                                 //1 being the lowest(highest reflection)
    1239                                 $transparency = $transparency + 1;
    1240                         }
    1241                 }
    1242                 // Set the thickness of the line we're about to draw
    1243                 imagesetthickness ($background, $dividerHeight);
    1244                 // Draw the line - me do not likey the liney
    1245                 imageline ($background, 0, 0, $imgName_w, 0, $gdGradientColor);
    1246                 imagecopymerge ($resultat, $im, 0, 0, 0, 0, $x_i, $y_i, 100);
    1247                 imagecopymerge ($resultat, $background, 0, $y_i, 0, 0, $x_i, $y_i, 100);
    1248                 imagedestroy($gradient_line);
    1249                 imagedestroy($newImage);
     1206                if($hauteur > $height)
     1207                        $hauteur = $height;
     1208                $source = $image["fonction_imagecreatefrom"]($im);
     1209                //      We'll store the final reflection in $output. $buffer is for internal use.
     1210                $resultat = imagecreatetruecolor($width, $new_height + $height);       
     1211                $output = imagecreatetruecolor($width, $new_height);
     1212                $buffer = imagecreatetruecolor($width, $new_height);
     1213        //  Save any alpha data that might have existed in the source image and disable blending
     1214        imagesavealpha($source, true);
     1215                // alpha for output
     1216                imagesavealpha($output, true);
     1217        imagealphablending($output, false);
     1218                // alpha for the buffer
     1219        imagesavealpha($buffer, true);
     1220        imagealphablending($buffer, false);
     1221        // and alpha for the final result
     1222                imagesavealpha($resultat, true);
     1223        imagealphablending($resultat, false);   
     1224                //      Copy the bottom-most part of the source image into the output
     1225                imagecopy($output, $source, 0, 0, 0, $height - $new_height, $width, $new_height);
     1226                //      Rotate and flip it (strip flip method)
     1227        for ($y = 0; $y < $new_height; $y++)
     1228        {
     1229           imagecopy($buffer, $output, 0, $y, 0, $new_height - $y - 1, $width, 1);
     1230        }
     1231                $output = $buffer;
     1232                $alpha_length = abs($alphastart - $alphaend);
     1233                imagelayereffect($output, IMG_EFFECT_OVERLAY);
     1234        for ($y = 0; $y <= $new_height; $y++)
     1235        {
     1236            //  Get % of reflection height
     1237            $pct = $y / $new_height;
     1238                //  Get % of alpha
     1239                if ($alphastart > $alphaend)
     1240                {
     1241                $alpha = (int) ($alphastart - ($pct * $alpha_length));
     1242                }
     1243                else
     1244                {
     1245                $alpha = (int) ($alphastart + ($pct * $alpha_length));
     1246                }
     1247                //  Rejig it because of the way in which the image effect overlay works
     1248                $final_alpha = 127 - $alpha;
     1249                imagefilledrectangle($output, 0, $y, $width, $y, imagecolorallocatealpha($output, $red, $green, $blue, $final_alpha));
     1250        }
     1251        // now, source with effect
     1252        imagecopy($resultat, $source, 0, 0, 0, 0, $width, $height);
     1253        imagecopy($resultat, $output, 0, $height,0, 0, $width, $height);
    12501254                $image["fonction_image"]($resultat, "$dest");
     1255                imagedestroy($buffer);
     1256                imagedestroy($resultat);
    12511257        }
    12521258        return "<img src='$dest'$tags />";
Note: See TracChangeset for help on using the changeset viewer.