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

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

json_encode avec une seule variable

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