Changeset 115861 in spip-zone


Ignore:
Timestamp:
Jul 4, 2019, 6:56:16 AM (3 weeks ago)
Author:
cedric@…
Message:

|adaptive_images_background peut prendre une couleur de background a appliquer sur le span qui remplira l'espace pendant le chargement de l'image

Location:
_plugins_/adaptive_images/trunk
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/adaptive_images/trunk/adaptive_images_options.php

    r115844 r115861  
    218218function adaptive_images_preview_geometrize($image, $options) {
    219219        $geometrize = charger_fonction("image_geometrize", "preview");
    220         //spip_timer('potrace');
     220        //spip_timer('geometrize');
    221221        if ($thumbnail = $geometrize($image, $options)) {
    222                 //var_dump($thumbnail,filesize($thumbnail),spip_timer('potrace'));
    223                 return array($thumbnail, 'potrace');
    224         }
    225         //spip_timer('potrace');
     222                //var_dump($thumbnail,filesize($thumbnail),spip_timer('geometrize'));
     223                return array($thumbnail, 'geometrize');
     224        }
     225        //spip_timer('geometrize');
    226226        return false;
    227227}
     
    248248 * @param null|int $max_width_1x
    249249 * @param string $class
     250 * @param string $bgcolor
    250251 * @return mixed
    251252 */
    252 function adaptive_images_background($texte, $max_width_1x=null, $class = ''){
     253function adaptive_images_background($texte, $max_width_1x=null, $class = '', $bgcolor=''){
    253254        $res = adaptive_images_base($texte, !empty($max_width_1x) ? $max_width_1x : null, true);
    254         if ($class) {
     255        if ($class or $bgcolor) {
    255256                // injecter la class sur les balises span.adapt-img-background
    256257                $spans = extraire_balises($res, 'span');
     
    261262                                $c = extraire_attribut($s, "class");
    262263                                if (strpos($c, 'adapt-img-background') !== false) {
    263                                         $c = rtrim($c) . ' '. $class;
    264                                         $s2 = inserer_attribut($s, 'class', $c);
    265                                         $res = str_replace($s, $s2, $res);
     264                                        $s2 = $s;
     265                                        if ($class) {
     266                                                $c = rtrim($c) . ' '. $class;
     267                                                $s2 = inserer_attribut($s2, 'class', $c);
     268                                        }
     269                                        if ($bgcolor) {
     270                                                $style = trim(extraire_attribut($s2, "style"));
     271                                                if ($style) {
     272                                                        $style = rtrim($style, ';') . ';';
     273                                                }
     274                                                $style .= "background-color:$bgcolor";
     275                                                $s2 = inserer_attribut($s2, 'style', $style);
     276                                        }
     277                                        if ($s2 !== $s) {
     278                                                $res = str_replace($s, $s2, $res);
     279                                        }
    266280                                }
    267281                        }
  • _plugins_/adaptive_images/trunk/lib/geometrize/geometrize/shape/Ellipse.class.php

    r115850 r115861  
    190190        }
    191191
    192         public function rescale($scale){
    193                 $this->x = intval(round($this->x*$scale));
    194                 $this->y = intval(round($this->y*$scale));
    195                 $this->rx = intval(round($this->rx*$scale));
    196                 $this->ry = intval(round($this->ry*$scale));
    197                 $this->xBound = intval(round($this->xBound*$scale));
    198                 $this->yBound = intval(round($this->yBound*$scale));
     192        public function rescale($xBound, $yBound){
     193                $xScale = ($xBound-1) / ($this->xBound-1);
     194                $yScale = ($yBound-1) / ($this->yBound-1);
     195                $this->xBound = $xBound;
     196                $this->yBound = $yBound;
     197                $this->x = intval(round($this->x*$xScale));
     198                $this->y = intval(round($this->y*$yScale));
     199                $this->rx = intval(round($this->rx*$xScale));
     200                $this->ry = intval(round($this->ry*$yScale));
    199201        }
    200202
  • _plugins_/adaptive_images/trunk/lib/geometrize/geometrize/shape/Line.class.php

    r115850 r115861  
    160160        }
    161161
    162         public function rescale($scale){
    163                 $this->x1 = intval(round($this->x1*$scale));
    164                 $this->y1 = intval(round($this->y1*$scale));
    165                 $this->x2 = intval(round($this->x2*$scale));
    166                 $this->y2 = intval(round($this->y2*$scale));
    167                 $this->xBound = intval(round($this->xBound*$scale));
    168                 $this->yBound = intval(round($this->yBound*$scale));
     162        public function rescale($xBound, $yBound){
     163                $xScale = ($xBound-1) / ($this->xBound-1);
     164                $yScale = ($yBound-1) / ($this->yBound-1);
     165                $this->xBound = $xBound;
     166                $this->yBound = $yBound;
     167                $this->x1 = intval(round($this->x1*$xScale));
     168                $this->y1 = intval(round($this->y1*$yScale));
     169                $this->x2 = intval(round($this->x2*$xScale));
     170                $this->y2 = intval(round($this->y2*$yScale));
    169171        }
    170172
  • _plugins_/adaptive_images/trunk/lib/geometrize/geometrize/shape/QuadraticBezier.class.php

    r115850 r115861  
    233233        }
    234234
    235         public function rescale($scale){
    236                 $this->cx = intval(round($this->cx*$scale));
    237                 $this->cy = intval(round($this->cy*$scale));
    238                 $this->x1 = intval(round($this->x1*$scale));
    239                 $this->y1 = intval(round($this->y1*$scale));
    240                 $this->x2 = intval(round($this->x2*$scale));
    241                 $this->y2 = intval(round($this->y2*$scale));
    242                 $this->xBound = intval(round($this->xBound*$scale));
    243                 $this->yBound = intval(round($this->yBound*$scale));
     235        public function rescale($xBound, $yBound){
     236                $xScale = ($xBound-1) / ($this->xBound-1);
     237                $yScale = ($yBound-1) / ($this->yBound-1);
     238                $this->xBound = $xBound;
     239                $this->yBound = $yBound;
     240                $this->cx = intval(round($this->cx*$xScale));
     241                $this->cy = intval(round($this->cy*$yScale));
     242                $this->x1 = intval(round($this->x1*$xScale));
     243                $this->y1 = intval(round($this->y1*$yScale));
     244                $this->x2 = intval(round($this->x2*$xScale));
     245                $this->y2 = intval(round($this->y2*$yScale));
    244246        }
    245247
  • _plugins_/adaptive_images/trunk/lib/geometrize/geometrize/shape/Rectangle.class.php

    r115850 r115861  
    181181        }
    182182
    183         public function rescale($scale){
    184                 $this->x1 = intval(round($this->x1*$scale));
    185                 $this->y1 = intval(round($this->y1*$scale));
    186                 $this->x2 = intval(round($this->x2*$scale));
    187                 $this->y2 = intval(round($this->y2*$scale));
    188                 $this->xBound = intval(round($this->xBound*$scale));
    189                 $this->yBound = intval(round($this->yBound*$scale));
     183        public function rescale($xBound, $yBound){
     184                $xScale = ($xBound-1) / ($this->xBound-1);
     185                $yScale = ($yBound-1) / ($this->yBound-1);
     186                $this->xBound = $xBound;
     187                $this->yBound = $yBound;
     188                $this->x1 = intval(round($this->x1*$xScale));
     189                $this->y1 = intval(round($this->y1*$yScale));
     190                $this->x2 = intval(round($this->x2*$xScale));
     191                $this->y2 = intval(round($this->y2*$yScale));
    190192        }
    191193
  • _plugins_/adaptive_images/trunk/lib/geometrize/geometrize/shape/RotatedEllipse.class.php

    r115850 r115861  
    171171        }
    172172
    173         public function rescale($scale){
    174                 $this->x = intval(round($this->x*$scale));
    175                 $this->y = intval(round($this->y*$scale));
    176                 $this->rx = intval(round($this->rx*$scale));
    177                 $this->ry = intval(round($this->ry*$scale));
    178                 $this->xBound = intval(round($this->xBound*$scale));
    179                 $this->yBound = intval(round($this->yBound*$scale));
     173        public function rescale($xBound, $yBound){
     174                $xScale = ($xBound-1) / ($this->xBound-1);
     175                $yScale = ($yBound-1) / ($this->yBound-1);
     176                $this->xBound = $xBound;
     177                $this->yBound = $yBound;
     178                $this->x = intval(round($this->x*$xScale));
     179                $this->y = intval(round($this->y*$yScale));
     180                $this->rx = intval(round($this->rx*$xScale));
     181                $this->ry = intval(round($this->ry*$yScale));
    180182        }
    181183
  • _plugins_/adaptive_images/trunk/lib/geometrize/geometrize/shape/RotatedRectangle.class.php

    r115850 r115861  
    227227        }
    228228
    229         public function rescale($scale){
    230                 $this->x1 = intval(round($this->x1*$scale));
    231                 $this->y1 = intval(round($this->y1*$scale));
    232                 $this->x2 = intval(round($this->x2*$scale));
    233                 $this->y2 = intval(round($this->y2*$scale));
    234                 $this->xBound = intval(round($this->xBound*$scale));
    235                 $this->yBound = intval(round($this->yBound*$scale));
     229        public function rescale($xBound, $yBound){
     230                $xScale = ($xBound-1) / ($this->xBound-1);
     231                $yScale = ($yBound-1) / ($this->yBound-1);
     232                $this->xBound = $xBound;
     233                $this->yBound = $yBound;
     234                $this->x1 = intval(round($this->x1*$xScale));
     235                $this->y1 = intval(round($this->y1*$yScale));
     236                $this->x2 = intval(round($this->x2*$xScale));
     237                $this->y2 = intval(round($this->y2*$yScale));
    236238        }
    237239
  • _plugins_/adaptive_images/trunk/lib/geometrize/geometrize/shape/Shape.interface.php

    r115850 r115861  
    77        function mutate();
    88
    9         function rescale($scale);
     9        function rescale($xBound, $yBound);
    1010
    1111        function hclone();
  • _plugins_/adaptive_images/trunk/lib/geometrize/geometrize/shape/Triangle.class.php

    r115850 r115861  
    184184        }
    185185
    186         public function rescale($scale){
    187                 $this->x1 = intval(round($this->x1*$scale));
    188                 $this->y1 = intval(round($this->y1*$scale));
    189                 $this->x2 = intval(round($this->x2*$scale));
    190                 $this->y2 = intval(round($this->y2*$scale));
    191                 $this->x3 = intval(round($this->x3*$scale));
    192                 $this->y3 = intval(round($this->y3*$scale));
    193                 $this->xBound = intval(round($this->xBound*$scale));
    194                 $this->yBound = intval(round($this->yBound*$scale));
     186        public function rescale($xBound, $yBound){
     187                $xScale = ($xBound-1) / ($this->xBound-1);
     188                $yScale = ($yBound-1) / ($this->yBound-1);
     189                $this->xBound = $xBound;
     190                $this->yBound = $yBound;
     191                $this->x1 = intval(round($this->x1*$xScale));
     192                $this->y1 = intval(round($this->y1*$yScale));
     193                $this->x2 = intval(round($this->x2*$xScale));
     194                $this->y2 = intval(round($this->y2*$yScale));
     195                $this->x3 = intval(round($this->x3*$xScale));
     196                $this->y3 = intval(round($this->y3*$yScale));
    195197        }
    196198
  • _plugins_/adaptive_images/trunk/preview/image_geometrize.php

    r115844 r115861  
    1818 * @return string
    1919 */
    20 function preview_image_geometrize_dist($img, $options) {
     20function preview_image_geometrize_dist($img, $options){
     21        static $deja = [];
     22
     23        // seulement un calcul par image par hit pour ne pas surcharger si la meme image apparait plusieurs fois dans la page
     24        if (isset($deja[$img])) {
     25                return $deja[$img];
     26        }
    2127
    2228        include_spip("inc/filtres_images_lib_mini");
     
    2531
    2632        // dimension de la miniature a vectoriser
    27         $width_thumb = 128;
    2833        $geometrize_options = [
    2934                "shapeTypes" => [geometrize_shape_ShapeTypes::$TRIANGLE],
     
    3540        $time_budget = 5; // secondes par iteration
    3641
    37         $cache = _image_valeurs_trans($img, "svg-thumb-geometrize-$width_thumb-".json_encode($geometrize_options), "svg");
    38         if (!$cache) {
     42        // le premieres iterations sont sur une petite miniature
     43        // et plus on veut de details plus on augmente la taille de l'image de travail
     44        // les sizes sont tricky pour avoir un x rescale = 2 = (129 - 1) / (65 - 1) car on rescale de 0 à 64px -> 0 à 128px
     45        $resize_strategy = [
     46                65 => 20,
     47                129 => 100,
     48                257 => 1000,
     49                513 => 5000,
     50        ];
     51
     52        $cache = _image_valeurs_trans($img, "svg-thumb-geometrize-" . json_encode($geometrize_options), "svg");
     53        if (!$cache){
    3954                return false;
    4055        }
     
    4358        $dest = $cache["fichier_dest"];
    4459
    45         if ($cache["creer"]) {
    46                 if (!@file_exists($fichier)) {
     60        if ($cache["creer"]){
     61                if (!@file_exists($fichier)){
    4762                        return false;
    4863                }
    4964
    5065                $runner = false;
    51                 $shapes = new _hx_array();
     66                $results = new _hx_array();
    5267                $couleur_bg = _image_couleur_moyenne($fichier);
    5368                //$couleur_bg = couleur_extraire($fichier);
    54 
    55                 if (file_exists("$dest.runner")) {
     69                $width_thumb = array_keys($resize_strategy);
     70                $width_thumb = reset($width_thumb);
     71
     72                if (file_exists("$dest.runner")){
    5673                        lire_fichier("$dest.runner", $r);
    57                         if ($r = unserialize($r)) {
    58                                 list($runner,$shapes) = $r;
     74                        if ($r = unserialize($r)){
     75                                list($runner, $results) = $r;
    5976                                $w = $runner->model->width;
    6077                                $h = $runner->model->height;
     78
     79                                foreach ($resize_strategy as $wt => $n){
     80                                        if ($wt<=$w){
     81                                                $width_thumb = $wt;
     82                                        }
     83                                }
    6184                        }
    6285                        unset($r);
    6386                }
    6487
    65                 if (! $runner) {
    66                         $thumb = image_reduire($img,$width_thumb);
    67                         $source = extraire_attribut($thumb, 'src');
    68                         list($w, $h) = getimagesize($source);
    69                   $image = imagecreatefromstring(file_get_contents($source));
    70                         $bitmap = new geometrize_bitmap_Bitmap();
    71                         $bitmap->width = $w;
    72                         $bitmap->height = $h;
    73 
    74                         for ($x=0;$x<$w;$x++){
    75                                 for ($y=0;$y<$h;$y++) {
    76                                         // get a color
    77                                         $color_index = imagecolorat($image, $x, $y);
    78                                         // make it human readable
    79                                         $c = imagecolorsforindex($image, $color_index);
    80                                         $bitmap->setPixel($x, $y, _couleur_to_geometrize($c));
    81                                 }
    82                         }
    83                         $runner = new geometrize_runner_ImageRunner($bitmap, _couleur_to_geometrize($couleur_bg));
     88                if (!$runner){
     89                        list($runner, $results) = _init_geometrize_runner($img, $width_thumb, $couleur_bg);
     90                        $w = $runner->model->width;
     91                        $h = $runner->model->height;
    8492                }
    8593
     
    9098                $hx_options->shapeMutationsPerStep = $geometrize_options['shapeMutationsPerStep'];
    9199                $hx_options->steps = $geometrize_options['steps'];
    92                 //var_dump($hx_options);
     100
     101                //var_dump("WIDTHUMB $width_thumb");
    93102
    94103                $start_time = time();
    95104                spip_timer('runner');
    96                 for ($i = $shapes->length; $i < $geometrize_options['steps'];$i++) {
     105                for ($i = $results->length; $i<$geometrize_options['steps']; $i++){
     106
     107                        // faut-il passer a une taille de vignette superieure ?
     108                        if ($i>$resize_strategy[$width_thumb]){
     109
     110                                foreach ($resize_strategy as $wt => $n){
     111                                        $width_thumb = $wt;
     112                                        if ($n>$i){
     113                                                break;
     114                                        }
     115                                }
     116
     117                                //var_dump("NEW WIDTHUMB $width_thumb");
     118                                if ($width_thumb>$runner->model->width){
     119                                        // reinit le modele et resizer les shapes au passage
     120                                        list($runner, $results) = _init_geometrize_runner($img, $width_thumb, $couleur_bg, $results);
     121                                        $w = $runner->model->width;
     122                                        $h = $runner->model->height;
     123                                }
     124                        }
     125
    97126                        $r = $runner->step($hx_options);
    98                         $shapes->push($r->get(0));
    99                         if (time()>$start_time + $time_budget) {
     127                        $results->push($r->get(0));
     128                        if (time()>$start_time+$time_budget){
    100129                                break;
    101130                        }
     
    103132                $time_compute = spip_timer('runner');
    104133
    105                 //var_dump($r,'<hr/>',$shapes);
    106 
    107 
    108                 $svg_image = trim(geometrize_exporter_SvgExporter::export($shapes, $w, $h));
     134                //var_dump($r,'<hr/>',$results);
     135
     136
     137                $svg_image = trim(geometrize_exporter_SvgExporter::export($results, $w, $h));
    109138
    110139                $svg_image = explode('>', $svg_image, 2);
    111                 if (strpos($svg_image[0], "<"."?xml") === 0) {
     140                if (strpos($svg_image[0], "<" . "?xml")===0){
    112141                        $svg_image = explode('>', trim($svg_image[1]), 2);
    113142                }
    114143
    115144                $t = $svg_image[0] . '>';
    116                 $w = extraire_attribut($t, "width") - 1;
    117                 $h = extraire_attribut($t, "height") - 1;
     145                $w = extraire_attribut($t, "width")-1;
     146                $h = extraire_attribut($t, "height")-1;
    118147
    119148                $svg_image[0] = "<svg viewBox=\"0 0 $w $h\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"$w\" height=\"$h\" fill=\"#$couleur_bg\"/>";
    120149
    121150                // optimize the size :
    122                 $svg_image[1] = str_replace(' fill-opacity="1"/>','/>', $svg_image[1]);
     151                $svg_image[1] = str_replace(' fill-opacity="1"/>', '/>', $svg_image[1]);
    123152                $svg_image[1] = preg_replace_callback("/rgb\((\d+),(\d+),(\d+)\)/ims", "svg_color_hexa", $svg_image[1]);
    124                 $svg_image[1] = str_replace(">\n",">", $svg_image[1]);
     153                $svg_image[1] = str_replace(">\n", ">", $svg_image[1]);
    125154
    126155
     
    133162
    134163                ecrire_fichier($dest, $svg_image);
    135                 $nsteps = $shapes->length;
    136                 if ($shapes->length < $geometrize_options['steps']) {
    137                         @touch($dest,1); // on antidate l'image pour revenir ici au prochain affichage
    138                         ecrire_fichier("$dest.runner", serialize([$runner,$shapes]));
    139                         spip_log("PROGRESS: $fichier t=$time_compute Steps:$nsteps length:".strlen($svg_image),'ai_geometrize');
     164                $nsteps = $results->length;
     165                if ($results->length<$geometrize_options['steps']){
     166                        @touch($dest, 1); // on antidate l'image pour revenir ici au prochain affichage
     167                        ecrire_fichier("$dest.runner", serialize([$runner, $results]));
     168                        spip_log("PROGRESS: $fichier t=$time_compute Steps:$nsteps length:" . strlen($svg_image), 'ai_geometrize');
    140169                        //var_dump("STEPS:" . $nsteps);
    141                 }
    142                 else {
     170                } else {
    143171                        @unlink("$dest.runner");
    144                         //var_dump("FINISHED:" . $shapes->length);
    145                         spip_log("FINISHED: $fichier t=$time_compute Steps:$nsteps length:".strlen($svg_image),'ai_geometrize');
    146                 }
    147         }
    148 
    149         if (!@file_exists($dest)) {
    150                 return false;
    151         }
    152 
    153         return $dest;
    154 }
    155 
    156 function svg_color_hexa($m) {
    157         $c = _couleur_dec_to_hex($m[1],$m[2],$m[3]);
     172                        //var_dump("FINISHED:" . $results->length);
     173                        spip_log("FINISHED: $fichier t=$time_compute Steps:$nsteps length:" . strlen($svg_image), 'ai_geometrize');
     174                }
     175        }
     176
     177        if (!@file_exists($dest)){
     178                return $deja[$img] = false;
     179        }
     180
     181        return $deja[$img] = $dest;
     182}
     183
     184function _init_geometrize_runner($img, $width_thumb, $couleur_bg, $results = null){
     185        $thumb = image_reduire($img, $width_thumb);
     186        $source = extraire_attribut($thumb, 'src');
     187        list($w, $h) = getimagesize($source);
     188        $image = imagecreatefromstring(file_get_contents($source));
     189        $bitmap = new geometrize_bitmap_Bitmap();
     190        $bitmap->width = $w;
     191        $bitmap->height = $h;
     192
     193        for ($x = 0; $x<$w; $x++){
     194                for ($y = 0; $y<$h; $y++){
     195                        // get a color
     196                        $color_index = imagecolorat($image, $x, $y);
     197                        // make it human readable
     198                        $c = imagecolorsforindex($image, $color_index);
     199                        $bitmap->setPixel($x, $y, _couleur_to_geometrize($c));
     200                }
     201        }
     202        $runner = new geometrize_runner_ImageRunner($bitmap, _couleur_to_geometrize($couleur_bg));
     203
     204        $new_results = new _hx_array();
     205        if ($results){
     206                for ($i = 0; $i<$results->length; $i++){
     207                        $alpha = $results[$i]->shape->color & 255;
     208                        $results[$i]->shape->rescale($w, $h); // rescale on new bounds
     209                        $new_results->push($runner->model->addShape($results[$i]->shape, $alpha));
     210                }
     211        }
     212        return [$runner, $new_results];
     213}
     214
     215function svg_color_hexa($m){
     216        $c = _couleur_dec_to_hex($m[1], $m[2], $m[3]);
    158217        return "#$c";
    159218}
    160219
    161 function _couleur_to_geometrize($c) {
    162         if (is_string($c)) {
     220function _couleur_to_geometrize($c){
     221        if (is_string($c)){
    163222                $c = _couleur_hex_to_dec($c);
    164223        }
    165         if (isset($c['alpha'])) {
     224        if (isset($c['alpha'])){
    166225                // alpha definition is the opposite (255 is opaque, 0 is transparent)
    167                 $c['alpha'] = round((127-$c['alpha']) * 255 / 127);
    168         }
    169         else {
     226                $c['alpha'] = round((127-$c['alpha'])*255/127);
     227        } else {
    170228                $c['alpha'] = 255;
    171229        }
    172         $couleur = ($c['red'] << 24) + ($c['green'] << 16) + ($c['blue'] << 8) + $c['alpha'];
     230        $couleur = ($c['red'] << 24)+($c['green'] << 16)+($c['blue'] << 8)+$c['alpha'];
    173231        return $couleur;
    174232}
    175233
    176234
    177 if (!function_exists('_image_couleur_moyenne')) {
     235if (!function_exists('_image_couleur_moyenne')){
    178236
    179237// A partir d'une image,
    180238// calcule la couleur moyenne sur une version reduire de l'image
    181 function _image_couleur_moyenne($img, $w = 20, $h = 20) {
    182         static $couleur_moyenne = array();
    183 
    184         if (isset($couleur_moyenne["$img-$w-$h"])) {
    185                 return $couleur_moyenne["$img-$w-$h"];
    186         }
    187 
    188         // valeur par defaut si l'image ne peut etre lue
    189         $defaut = "F26C4E";
    190 
    191         $cache = _image_valeurs_trans($img, "coul-moyenne-$w-$h", "txt");
    192         if (!$cache) {
    193                 return $couleur_moyenne["$img-$w-$h"] = $defaut;
    194         }
    195 
    196 
    197         $fichier = $cache["fichier"];
    198         $dest = $cache["fichier_dest"];
    199 
    200         if (isset($couleur_moyenne["$fichier-$w-$h"])) {
    201                 return $couleur_moyenne["$fichier-$w-$h"];
    202         }
    203 
    204         $creer = $cache["creer"];
    205 
    206         if ($creer) {
    207                 if (@file_exists($fichier)) {
    208                         $width = $cache["largeur"];
    209                         $height = $cache["hauteur"];
    210 
    211                         $newwidth = $w;
    212                         $newheight = $h;
    213 
    214                         $thumb = imagecreate($newwidth, $newheight);
    215 
    216                         $source = $cache["fonction_imagecreatefrom"]($fichier);
    217 
    218                         imagepalettetotruecolor($source);
    219 
    220                         imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
    221 
    222                         $moyenne = null;
    223                         $nb_points = 0;
    224                         for ($x=0;$x<$w;$x++) {
    225                                 for ($y=0;$y<$h;$y++) {
    226                                         // get a color
    227                                         $color_index = imagecolorat($thumb, $x, $y);
    228                                         // make it human readable
    229                                         $color_tran = imagecolorsforindex($thumb, $color_index);
    230                                         if ($color_tran['alpha'] != 127) {
    231                                                 if (is_null($moyenne)) {
    232                                                         $moyenne = $color_tran;
     239        function _image_couleur_moyenne($img, $w = 20, $h = 20){
     240                static $couleur_moyenne = array();
     241
     242                if (isset($couleur_moyenne["$img-$w-$h"])){
     243                        return $couleur_moyenne["$img-$w-$h"];
     244                }
     245
     246                // valeur par defaut si l'image ne peut etre lue
     247                $defaut = "F26C4E";
     248
     249                $cache = _image_valeurs_trans($img, "coul-moyenne-$w-$h", "txt");
     250                if (!$cache){
     251                        return $couleur_moyenne["$img-$w-$h"] = $defaut;
     252                }
     253
     254
     255                $fichier = $cache["fichier"];
     256                $dest = $cache["fichier_dest"];
     257
     258                if (isset($couleur_moyenne["$fichier-$w-$h"])){
     259                        return $couleur_moyenne["$fichier-$w-$h"];
     260                }
     261
     262                $creer = $cache["creer"];
     263
     264                if ($creer){
     265                        if (@file_exists($fichier)){
     266                                $width = $cache["largeur"];
     267                                $height = $cache["hauteur"];
     268
     269                                $newwidth = $w;
     270                                $newheight = $h;
     271
     272                                $thumb = imagecreate($newwidth, $newheight);
     273
     274                                $source = $cache["fonction_imagecreatefrom"]($fichier);
     275
     276                                imagepalettetotruecolor($source);
     277
     278                                imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
     279
     280                                $moyenne = null;
     281                                $nb_points = 0;
     282                                for ($x = 0; $x<$w; $x++){
     283                                        for ($y = 0; $y<$h; $y++){
     284                                                // get a color
     285                                                $color_index = imagecolorat($thumb, $x, $y);
     286                                                // make it human readable
     287                                                $color_tran = imagecolorsforindex($thumb, $color_index);
     288                                                if ($color_tran['alpha']!=127){
     289                                                        if (is_null($moyenne)){
     290                                                                $moyenne = $color_tran;
     291                                                        } else {
     292                                                                $moyenne['red'] += $color_tran['red'];
     293                                                                $moyenne['green'] += $color_tran['green'];
     294                                                                $moyenne['blue'] += $color_tran['blue'];
     295                                                        }
     296                                                        $nb_points++;
    233297                                                }
    234                                                 else {
    235                                                         $moyenne['red'] += $color_tran['red'];
    236                                                         $moyenne['green'] += $color_tran['green'];
    237                                                         $moyenne['blue'] += $color_tran['blue'];
    238                                                 }
    239                                                 $nb_points++;
    240298                                        }
    241299                                }
    242                         }
    243                         if (is_null($moyenne)) {
     300                                if (is_null($moyenne)){
     301                                        $couleur = $defaut;
     302                                } else {
     303                                        if ($nb_points>1){
     304                                                $moyenne['red'] = round($moyenne['red']/$nb_points);
     305                                                $moyenne['green'] = round($moyenne['green']/$nb_points);
     306                                                $moyenne['blue'] = round($moyenne['blue']/$nb_points);
     307                                        }
     308
     309                                        $couleur = _couleur_dec_to_hex($moyenne["red"], $moyenne["green"], $moyenne["blue"]);
     310                                }
     311                        } else {
    244312                                $couleur = $defaut;
    245313                        }
    246                         else {
    247                                 if ($nb_points > 1) {
    248                                         $moyenne['red'] = round($moyenne['red'] / $nb_points);
    249                                         $moyenne['green'] = round($moyenne['green'] / $nb_points);
    250                                         $moyenne['blue'] = round($moyenne['blue'] / $nb_points);
    251                                 }
    252 
    253                                 $couleur = _couleur_dec_to_hex($moyenne["red"], $moyenne["green"], $moyenne["blue"]);
    254                         }
     314
     315                        // Mettre en cache le resultat
     316                        $couleur_moyenne["$fichier-$w-$h"] = $couleur;
     317                        ecrire_fichier($dest, $couleur_moyenne["$fichier-$w-$h"]);
    255318                } else {
    256                         $couleur = $defaut;
    257                 }
    258 
    259                 // Mettre en cache le resultat
    260                 $couleur_moyenne["$fichier-$w-$h"] = $couleur;
    261                 ecrire_fichier($dest, $couleur_moyenne["$fichier-$w-$h"]);
    262         } else {
    263                 lire_fichier($dest, $couleur_moyenne["$fichier-$w-$h"]);
    264         }
    265 
    266         return $couleur_moyenne["$img-$w-$h"] = $couleur_moyenne["$fichier-$w-$h"];
    267 }
    268 }
     319                        lire_fichier($dest, $couleur_moyenne["$fichier-$w-$h"]);
     320                }
     321
     322                return $couleur_moyenne["$img-$w-$h"] = $couleur_moyenne["$fichier-$w-$h"];
     323        }
     324}
Note: See TracChangeset for help on using the changeset viewer.