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

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

On gere le plugin mutualisation si l'option url_img_courtes => true

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