source: spip-zone/_plugins_/centre_image/trunk/centre_image_fonctions.php @ 106921

Last change on this file since 106921 was 106921, checked in by tofulm@…, 3 years ago

pour utiliser centre image dans une mutu, il faut considerer si on est dans l'espace prive ou public.
test_espace_prive() ne fonctionne pas dans la fonction centre_image de centre_image_fonctions.php
on fait un test sur l'url en js, pour determiner la présence de la chaine : ecrire/?exec

File size: 8.0 KB
Line 
1<?php
2/**
3 * Fonctions utiles au plugin Centre image
4 *
5 * @plugin     Centre image
6 * @copyright  2015
7 * @author     ARNO*
8 * @licence    GNU/GPL
9 * @package    SPIP\Centre_image\Fonctions
10 */
11
12if (!defined('_ECRIRE_INC_VERSION')) return;
13
14/**
15 * Retourne les coordonnées du point d'intérêt de l'image transmise
16 *
17 * Retourne les coordonnées `[0.5, 0.5]` par défaut (si le calcul échoue par exemple).
18 *
19 * @uses centre_image_visage() Si la constante `_SPIP_CENTRE_IMAGE` définie à `visage`
20 * @uses centre_image_densite() sinon
21 *
22 * @param string $fichier
23 *     Chemin du fichier ou balise `<img>`
24 * @param string $prive
25 *     test si on est dans l'espace prive
26 * @return float[]
27 *     Tableau (x, y) des coordonnées du point d'intéret ;
28 *     - x entre 0 (à gauche) et 1 (à droite)
29 *     - y entre 0 (en haut) et 1 (en bas)
30**/
31function centre_image($fichier, $prive = false) {
32        // Gérer le plugin mutualisation si on est pas dans le prive
33        if (!$prive and defined('_DIR_SITE')){
34                $fichier = _DIR_SITE.$fichier;
35        }
36
37        if (defined('_SPIP_CENTRE_IMAGE') AND _SPIP_CENTRE_IMAGE == "visage") {
38                return centre_image_visage($fichier);
39        } else {
40                return centre_image_densite($fichier);
41        }
42}
43
44/**
45 * Calcule le chemin correct théorique du fichier
46 *
47 * - extrait l'URL d'une éventuel attribut 'src' d'une balise
48 * - passe en url relative si c'était en absolu
49 * - enlève un timestamp ou un token éventuel (accès restreint)
50 *
51 * @param string $fichier
52 * return string
53 */
54function centre_image_preparer_fichier($fichier) {
55        // nettoyer le fichier (qui peut être dans un <img>)
56        if (preg_match("/src\=/", $fichier)) {
57                $fichier = extraire_attribut($fichier, "src");
58        }
59
60        // Enlever timestamp ou token
61        $fichier = explode('?', $fichier, 2);
62        $fichier = array_shift($fichier);
63
64        // si URL absolue de l'image, on passe en relatif
65        if (tester_url_absolue($fichier)) {
66                $url_site = url_de_base();
67                if (strpos($fichier, $url_site) === 0) {
68                        $fichier = substr($fichier, strlen($url_site));
69                }
70        }
71
72        return $fichier;
73}
74
75/**
76 * Retourne les coordonnées du point d'intérêt de l'image transmise
77 *
78 * Retourne les coordonnées `[0.5, 0.5]` par défaut (si le calcul échoue par exemple).
79 *
80 * @param string $fichier
81 *     Chemin du fichier ou balise `<img>`
82 * @return float[]
83 *     Tableau (x, y) des coordonnées du point d'intéret ;
84 *     - x entre 0 (à gauche) et 1 (à droite)
85 *     - y entre 0 (en haut) et 1 (en bas)
86**/
87function centre_image_densite($fichier) {
88        static $spip_centre_image = array();
89
90        $fichier = centre_image_preparer_fichier($fichier);
91
92        // on mémorise le résultat -> don
93        if (isset($spip_centre_image[$fichier])) {
94                return $spip_centre_image[$fichier];
95        }
96
97        if (file_exists($fichier)) {
98
99                $md5 = $fichier;
100                if (test_espace_prive()) {
101                        $md5 = preg_replace(",^\.\.\/,", "", $md5);
102                }
103                $md5 = md5($md5);
104                $l1 = substr($md5, 0, 1 );
105                $l2 = substr($md5, 1, 1);
106
107                $cache = sous_repertoire(_DIR_VAR, "cache-centre-image");
108                $cache = sous_repertoire($cache, $l1);
109                $cache = sous_repertoire($cache, $l2);
110
111                $forcer = sous_repertoire(_DIR_IMG, "cache-centre-image");
112
113                $fichier_json = "$cache$md5.json";
114                $fichier_forcer = "$forcer$md5.json";
115
116                // éviter plusieurs accès successifs
117                $mtime_source = filemtime($fichier);
118
119                if (file_exists($fichier_forcer) and filemtime($fichier_forcer) >= $mtime_source) {
120                        $res = json_decode(file_get_contents($fichier_forcer), TRUE);
121                } elseif (file_exists($fichier_json) and filemtime($fichier_json) > $mtime_source) {
122                        $res = json_decode(file_get_contents($fichier_json), TRUE);
123                } else {
124                        if (function_exists("imagefilter")) {
125                                if (preg_match(",\.(gif|jpe?g|png)($|[?]),i", $fichier, $regs)) {
126                                        include_spip('inc/centre_image_lib');
127                                        include_spip('inc/filtres_images_lib_mini');
128                                        $terminaison = strtolower($regs[1]);
129                                        $terminaison = str_replace("jpg", "jpeg", $terminaison);
130                                        $fonction_imagecreatefrom = "_imagecreatefrom".$terminaison;
131
132                                        $img     = $fonction_imagecreatefrom($fichier);
133                                        $cropper = new _centre_image($img);
134                                        $res = $cropper->find_focus();
135                                        imagedestroy($img);
136                                }
137                        } else {
138                                $res = array("x" => 0.5, "y" => 0.5);
139                        }
140
141                        file_put_contents($fichier_json, json_encode($res, TRUE));
142                }
143        } else {
144                $res = array("x" => 0.5, "y" => 0.5);
145        }
146
147        $spip_centre_image["$fichier"] = $res;
148        return $res;
149}
150
151/**
152 * Retourne la coordonnée x du point d'intérêt de l'image transmise
153 *
154 * @uses centre_image()
155 * @param string $fichier
156 *     Chemin du fichier ou balise `<img>`
157 * @return float
158 *     Coordonnée x du point d'intéret, entre 0 (à gauche) et 1 (à droite)
159**/
160function centre_image_x($fichier) {
161        $res = centre_image($fichier);
162        return $res["x"];
163}
164
165/**
166 * Retourne la coordonnée y du point d'intérêt de l'image transmise
167 *
168 * @uses centre_image()
169 * @param string $fichier
170 *     Chemin du fichier ou balise `<img>`
171 * @return float
172 *     Coordonnée y du point d'intéret, entre 0 (en haut) et 1 (en bas)
173**/
174function centre_image_y($fichier) {
175        $res = centre_image($fichier);
176        return $res["y"];
177}
178
179
180/**
181 * Détection du visage (attention: super-lourd)
182 *
183 * Retourne les coordonnées du point d'intérêt de l'image transmise
184 * en s'appuyant sur une (lourde) fonction de détection de visage
185 *
186 * Retourne les coordonnées `[0.5, 0.5]` par défaut (si le calcul échoue par exemple).
187 *
188 * @param string $fichier
189 *     Chemin du fichier ou balise `<img>`
190 * @return float[]
191 *     Tableau (x, y) des coordonnées du point d'intéret ;
192 *     - x entre 0 (à gauche) et 1 (à droite)
193 *     - y entre 0 (en haut) et 1 (en bas)
194**/
195function centre_image_visage($fichier) {
196        static $spip_centre_image_visage = array();
197
198        $fichier = centre_image_preparer_fichier($fichier);
199
200        // on mémorise le résultat -> don
201        if (isset($spip_centre_image_visage["$fichier"]) AND $spip_centre_image_visage["$fichier"]) {
202                return $spip_centre_image_visage["$fichier"];
203        }
204
205        if (file_exists($fichier)) {
206
207                $md5 = $fichier;
208                if (_DIR_RACINE == "../") {
209                        $md5 = preg_replace(",^\.\.\/,", "", $md5);
210                }
211                $md5 = md5($md5);
212                $l1 = substr($md5, 0, 1 );
213                $l2 = substr($md5, 1, 1);
214
215                $cache = sous_repertoire(_DIR_VAR, "cache-centre-image-visage");
216                $cache = sous_repertoire($cache, $l1);
217                $cache = sous_repertoire($cache, $l2);
218                $forcer = sous_repertoire(_DIR_IMG, "cache-centre-image");
219
220                $fichier_json = "$cache$md5.json";
221                $fichier_forcer = "$forcer$md5.json";
222
223                // éviter plusieurs accès successifs
224                $mtime_source = filemtime($fichier);
225
226                if (file_exists($fichier_forcer) and filemtime($fichier_forcer) >= $mtime_source) {
227                        $res = json_decode(file_get_contents($fichier_forcer), TRUE);
228                } elseif (file_exists($fichier_json) and filemtime($fichier_json) > $mtime_source) {
229                        $res = json_decode(file_get_contents($fichier_json), TRUE);
230                } else {
231                        include_spip ("inc/FaceDetector");
232                        $detector = new svay\FaceDetector('detection.dat');
233                        $detector->faceDetect($fichier);
234                        $face = $detector->getFace();
235
236                        if ($face) {
237                                $l = largeur($fichier);
238                                $h = hauteur($fichier);
239
240                                $x = ($face["x"] + ($face["w"] / 2)) / $l ;
241                                $y = ($face["y"] + ($face["w"] / 2)) / $h;
242
243                                $res = array("x" => $x, "y" => $y);
244                        } else {
245                                $res = array("x" => 0.5, "y" => 0.33);
246                        }
247
248                        file_put_contents($fichier_json, json_encode($res, TRUE));
249                }
250        } else {
251                $res = array("x" => 0.5, "y" => 0.5);
252        }
253
254        $spip_centre_image_visage["$fichier"] = $res;
255        return $res;
256}
257
258
259/**
260 * Ajoute les scripts nécessaires dans l'espace privé
261 *
262 * @pipeline header_prive
263 * @param string $flux Texte dans le head HTML
264 * @return string
265**/
266function centre_image_header_prive($flux) {
267        $flux .= "\n<script type='text/javascript' src='".find_in_path("centre_image_gestion.js")."'></script>\n";
268        $flux .= "\n<script>var croix = '".find_in_path("imgs/croix-centre-image.png")."'</script>";
269        return $flux;
270}
271
272/**
273 * Ajoute les plugins jquery ui nécessaires dans l'espace privé
274 *
275 * @pipeline jqueryui_plugins
276 * @param string[] $plugins
277 * @return string[]
278**/
279function centre_image_jqueryui_plugins($plugins) {
280        if (test_espace_prive()) {
281                $plugins[] = "jquery.ui.core";
282                $plugins[] = "jquery.ui.draggable";
283        }
284        return $plugins;
285}
Note: See TracBrowser for help on using the repository browser.