source: spip-zone/_plugins_/filtres_images_vectorise/trunk/lib/geometrize/src/ImageRunner.php @ 116199

Last change on this file since 116199 was 116199, checked in by cedric@…, 21 months ago

Un plugin pour vectoriser en SVG des images bitmap, qui propose 4 nouveaux filtres

  • extraire_palette_couleurs permet d'extraire une palette de couleur d'une image (par defaut les 3 couleurs les plus representees) en utilisant un calcul des couleurs dominantes par partitionnement en k-moyennes

`
<BOUCLE_palette(POUR){tableau #FICHIER|extraire_palette_couleurs{3}}>
<div style="display: inline-block;width: 30px;height: 15px;background-color: #VALEUR;"></div>
</BOUCLE_palette>
`

  • image_geometrize permet de creer une image SVG approchante de l'image d'origine en utilisant le lib GeometrizePHP https://github.com/Cerdic/geometrize-php/ (attention methode gourmande en temps de calcul)
  • image_potrace permet de generer un trace SVG depuis l'image d'origine, a l'aide de Potracio PHP qui est un portage PHP de PotRace? https://seenthis.net/messages/645575
  • image_geopotrize combine les 2 techniques : un background geometrize qui n'a pas besoin d'un grand nombre de shapes et un trace potrace superpose/mixe

Les 3 filtres ont tout un tas d'option pour qui veut jouer avec, mais les reglages par defaut permettent d'avoir immediatement un joli resultat exploitable
A noter que pour image_geometrize, le temps de calcul peut depasser les 30s pour generer le nombre de shapes demandees, selon les reglages utilises.
Dans ce cas le calcul est arrete au bout de 20s, on stocke et on renvoie l'image provisoire incomplete, et on stocke l'etat du calcul qui reprendra au prochain calcul de la page.

(J'evite les screenshots dans le message de commit mais le coeur y est)

File size: 3.4 KB
Line 
1<?php
2
3namespace Cerdic\Geometrize;
4
5use \Cerdic\Geometrize\Model;
6use \Cerdic\Geometrize\Exporter\SvgExporter;
7use \Cerdic\Geometrize\Shape\Rectangle;
8
9class ImageRunner {
10
11        /**
12         * @var \Cerdic\Geometrize\Model
13         */
14        protected $model;
15
16        /**
17         * Geometrization steps : score, color, shape
18         * @var array
19         */
20        protected $geometrizationSteps = [];
21
22
23        /**
24         * ImageRunner constructor.
25         * @param \Cerdic\Geometrize\Bitmap $inputImage
26         * @param int|bool $backgroundColor
27         *   32bits encoded color or true for automatic $backgroundColor or false for no background (transparent)
28         * @throws \Exception
29         */
30        public function __construct($inputImage, $backgroundColor = true){
31                $this->model = new Model($inputImage, $backgroundColor);
32                $this->geometrizationSteps = [];
33        }
34
35        /**
36         * @param array $options
37         * @param int $nb_steps
38         * @return float
39         * @throws \Exception
40         */
41        public function steps($options, $nb_steps = 1){
42                for ($i=0;$i<$nb_steps;$i++) {
43                        $this->geometrizationSteps[] = $this->model->step($options['shapeTypes'], $options['alpha'], $options['candidateShapesPerStep'], $options['shapeMutationsPerStep']);
44                }
45                return $this->getScore();
46        }
47
48        /**
49         * @param \Cerdic\Geometrize\Bitmap $rescaledImage
50         * @throws \Exception
51         * @return float
52         */
53        public function reScale($rescaledImage) {
54
55                $previousSteps = $this->geometrizationSteps;
56                $backgroundColor = $this->model->getBackgroundColor();
57                $this->model = new Model($rescaledImage, $backgroundColor);
58                $this->geometrizationSteps = [];
59
60                if (count($previousSteps)){
61                        $w = $rescaledImage->width;
62                        $h = $rescaledImage->height;
63                        foreach ($previousSteps as $step) {
64                                $alpha = $step['shape']->color & 255;
65                                // rescale the shape on new bounds
66                                $step['shape']->rescale($w, $h);
67                                $this->geometrizationSteps[] = $this->model->addShape($step['shape'], $alpha);
68                        }
69                }
70
71                return $this->getScore();
72        }
73
74        /**
75         * Export the result as a SVG
76         * @param int $imageWidth
77         * @param int $imageHeight
78         * @return string
79         */
80        public function exportToSVG($imageWidth=0, $imageHeight=0) {
81
82                $shapes = array_column($this->geometrizationSteps, 'shape');
83
84                // add background shape if necessary
85                $backgroundColor = $this->model->getBackgroundColor();
86                // 0 or false are transparents, nothing needed
87                if ($backgroundColor) {
88                        $backgroundShape = new Rectangle($this->model->getWidth(), $this->model->getHeight(), 1, true);
89                        $backgroundShape->color = $backgroundColor;
90                        array_unshift($shapes, $backgroundShape);
91                }
92
93                $svg_image = SvgExporter::export($shapes, $this->model->getWidth(), $this->model->getHeight(), $imageWidth, $imageHeight);
94                return $svg_image;
95
96        }
97
98        /**
99         * Get the current Score (ie score of the last step)
100         * @return float
101         */
102        public function getScore() {
103
104                if (!count($this->geometrizationSteps)) {
105                        return 1.0;
106                }
107                $last = end($this->geometrizationSteps);
108                return $last['score'];
109        }
110
111
112        /**
113         * Get the current number of steps
114         * @return int
115         */
116        public function getNbSteps() {
117                return count($this->geometrizationSteps);
118        }
119
120
121        /**
122         * Get the results
123         * @return array
124         */
125        public function getResults() {
126                return $this->geometrizationSteps;
127        }
128
129        /**
130         * @return \Cerdic\Geometrize\Bitmap
131         * @throws \Exception
132         */
133        public function getImageData(){
134                if (!($this->model!==null)){
135                        throw new \Exception("FAIL: model != null");
136                }
137                return $this->model->getCurrent();
138        }
139
140        /**
141         * @return \Cerdic\Geometrize\Model
142         */
143        public function getModel() {
144                return $this->model;
145        }
146
147}
Note: See TracBrowser for help on using the repository browser.