Changeset 115844 in spip-zone


Ignore:
Timestamp:
Jul 2, 2019, 10:09:06 AM (3 weeks ago)
Author:
cedric@…
Message:

Experimental mais fonctionnel : le calcul d'une preview svg a base de geometrize
On alloue un budget de 75 triangles, ce qui donne un SVG de 4ko, soit environ 2ko en base64encode+gzip
Comme le temps de calcul est potentiellement trop lon pour le calcul complet, on alloue egalement un budget temps de 5s de calcul, et si on a pas fini en renvoie le SVG avec tout ce qu'on a pu calculer et on stocke l'etat du calcul dans un fichier. Au calcul suivant de la page l'image sera completee et ainsi de suite, en 3 ou 4 iterations

Location:
_plugins_/adaptive_images/trunk
Files:
2 edited

Legend:

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

    r115817 r115844  
    114114        // Experimental : generer des thumbnails svg a base de Potrace
    115115        //$AdaptiveImages->thumbnailGeneratorCallback = "adaptive_images_preview_potrace";
     116        // Experimental : generer des thumbnails svg a base de Geometrize PHP
     117        //$AdaptiveImages->thumbnailGeneratorCallback = "adaptive_images_preview_geometrize";
    116118}
    117119
  • _plugins_/adaptive_images/trunk/preview/image_geometrize.php

    r115817 r115844  
    2828        $geometrize_options = [
    2929                "shapeTypes" => [geometrize_shape_ShapeTypes::$TRIANGLE],
    30                 "alpha" => 255,
    31                 "candidateShapesPerStep" => 50,
    32                 "shapeMutationsPerStep" => 50, // 100
    33                 "steps" => 20,
     30                "alpha" => 255, // beaucoup plus rapide qu'avec une transparence
     31                "candidateShapesPerStep" => 150,
     32                "shapeMutationsPerStep" => 100,
     33                "steps" => 75, // budget pour une taille acceptable de miniature (~4ko en texte, 2ko en Base 64+Gzip)
    3434        ];
     35        $time_budget = 5; // secondes par iteration
    3536
    3637        $cache = _image_valeurs_trans($img, "svg-thumb-geometrize-$width_thumb-".json_encode($geometrize_options), "svg");
     
    4243        $dest = $cache["fichier_dest"];
    4344
    44         if (true or $cache["creer"]) {
     45        if ($cache["creer"]) {
    4546                if (!@file_exists($fichier)) {
    4647                        return false;
    4748                }
    48                 $thumb = image_reduire($img,$width_thumb);
    49                 $source = extraire_attribut($thumb, 'src');
    50 
    51                 // TODO : bitmap from $source
    52                 list($w, $h) = getimagesize($source);
    53           $image = imagecreatefromstring(file_get_contents($source));
    54                 $bitmap = new geometrize_bitmap_Bitmap();
    55                 $bitmap->width = $w;
    56                 $bitmap->height = $h;
    57 
    58                 for ($x=0;$x<$w;$x++){
    59                         for ($y=0;$y<$h;$y++) {
    60                                 // get a color
    61                                 $color_index = imagecolorat($image, $x, $y);
    62                                 // make it human readable
    63                                 $c = imagecolorsforindex($image, $color_index);
    64                                 $bitmap->setPixel($x, $y, _couleur_to_geometrize($c));
    65                         }
    66                 }
    67 
     49
     50                $runner = false;
     51                $shapes = new _hx_array();
    6852                $couleur_bg = _image_couleur_moyenne($fichier);
    69                 $runner = new geometrize_runner_ImageRunner($bitmap, _couleur_to_geometrize($couleur_bg));
     53                //$couleur_bg = couleur_extraire($fichier);
     54
     55                if (file_exists("$dest.runner")) {
     56                        lire_fichier("$dest.runner", $r);
     57                        if ($r = unserialize($r)) {
     58                                list($runner,$shapes) = $r;
     59                                $w = $runner->model->width;
     60                                $h = $runner->model->height;
     61                        }
     62                        unset($r);
     63                }
     64
     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));
     84                }
    7085
    7186                $hx_options = new _hx_array();
     
    7691                $hx_options->steps = $geometrize_options['steps'];
    7792                //var_dump($hx_options);
    78                 $res = [];
    79                 $shapes = new _hx_array();
     93
     94                $start_time = time();
    8095                spip_timer('runner');
    81                 for ($i = 0; $i < $geometrize_options['steps'];$i++) {
     96                for ($i = $shapes->length; $i < $geometrize_options['steps'];$i++) {
    8297                        $r = $runner->step($hx_options);
    8398                        $shapes->push($r->get(0));
    84                 }
    85                 var_dump(spip_timer('runner'));
     99                        if (time()>$start_time + $time_budget) {
     100                                break;
     101                        }
     102                }
     103                $time_compute = spip_timer('runner');
    86104
    87105                //var_dump($r,'<hr/>',$shapes);
    88106
    89107
    90                 // TODO : export to SVG
    91108                $svg_image = trim(geometrize_exporter_SvgExporter::export($shapes, $w, $h));
    92109
     
    97114
    98115                $t = $svg_image[0] . '>';
    99                 $w = extraire_attribut($t, "width");
    100                 $h = extraire_attribut($t, "height");
    101 
    102                 $svg_image[0] = "<svg viewBox=\"0 0 $w $h\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"100%\" height=\"100%\" fill=\"#$couleur_bg\"/>";
     116                $w = extraire_attribut($t, "width") - 1;
     117                $h = extraire_attribut($t, "height") - 1;
     118
     119                $svg_image[0] = "<svg viewBox=\"0 0 $w $h\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"$w\" height=\"$h\" fill=\"#$couleur_bg\"/>";
    103120
    104121                // optimize the size :
     
    111128                $svg_image = $svg_image[0] . $svg_image[1];
    112129
    113                 var_dump(strlen($svg_image));
     130                #               var_dump(entites_html($svg_image));
     131                #var_dump(strlen($svg_image),strlen(base64_encode($svg_image)),strlen(gzdeflate(base64_encode($svg_image))));
     132
    114133
    115134                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');
     140                        //var_dump("STEPS:" . $nsteps);
     141                }
     142                else {
     143                        @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                }
    116147        }
    117148
Note: See TracChangeset for help on using the changeset viewer.