source: spip-zone/_plugins_/metadonnees_photo/trunk/photo_infos_fonctions.php @ 94832

Last change on this file since 94832 was 94832, checked in by cedric@…, 4 years ago

Compat 3.1 meme si la base des appareils connus n'a pas ete mise a jour depuis 6 ans

File size: 10.3 KB
Line 
1<?php
2
3if (!defined("_ECRIRE_INC_VERSION")) return;
4
5/**
6 * Afficher les infos exif dans les differents endroits de l'interface
7 * @param string $flux
8 * @return string
9 */
10function photo_infos_afficher_metas_document($flux){
11        if ($id_document = $flux['args']['id_document']){
12                $flux["data"] .= recuperer_fond("prive/squelettes/inclure/image_pave_exif",array('id_document' => $id_document,'quoi'=>$flux['args']['quoi']));
13        }
14        return $flux;
15}
16
17
18// Lire aux:Lens, qui n'est pas du Exif standard
19function lire_aux_lens ($filename) {
20
21    ob_start();
22    readfile($filename);
23    $source = ob_get_contents();
24    ob_end_clean();
25   
26    $xmpdata_start = strpos($source,"<x:xmpmeta");
27    $xmpdata_end = strpos($source,"</x:xmpmeta>");
28    $xmplenght = $xmpdata_end-$xmpdata_start;
29    $xmpdata = substr($source,$xmpdata_start,$xmplenght+12);
30   
31    if (mb_eregi("aux:Lens=\"([^\"]*)\"", $xmpdata, $regs)) {
32                return $regs[1];
33    }
34    if (mb_eregi("<aux:Lens>([^<]*)<\/aux:Lens>", $xmpdata, $regs)) {
35                return $regs[1];
36    }
37}
38
39/**
40 * Lire toutes les exifs d'une image
41 * et les memoriser en static pour optimisation
42 *
43 * @param string $fichier
44 * @return array
45 */
46function extraire_exif($fichier) {
47        static $mem_exif;
48       
49        if (isset($mem_exif[$fichier]) AND $mem_exif[$fichier]) return $mem_exif[$fichier];
50
51        if (!file_exists($fichier))
52                return array();
53
54        $time = filemtime($fichier);
55
56        $fichier_exif = sous_repertoire(_DIR_VAR, 'cache-exif') . md5($fichier.$time).".php";
57
58        // Systeme de cache pour les variables exif
59        if (file_exists($fichier_exif)) {
60                lire_fichier($fichier_exif, $cache);
61                if ($mem_exif[$fichier] = unserialize($cache))
62                        return $mem_exif[$fichier];
63        }
64
65
66        include_spip("inc/exifReader");
67
68        $er = new phpExifReader($fichier);
69        $er->processFile();
70        $mem_exif[$fichier] = $er->getImageInfo();
71
72        // Essayer de trouver aux:Lens
73        $mem_exif[$fichier]["auxLens"] = str_replace(" mm", "&nbsp;", lire_aux_lens($fichier));
74
75
76
77        // Completer GPS
78        if (function_exists('exif_read_data')) {
79                $exif_direc = @exif_read_data($fichier);
80
81                // Si Latitude deja fixee, la traiter
82                // Si la ref n'est ni N ni S, c'est une erreur (j'en trouve sur Flickr)
83                if (!($exif_direc["GPSLatitudeRef"] == "N" || $exif_direc["GPSLatitudeRef"] == "S")) {
84                        unset($mem_exif[$fichier]["GPSLatitude"]);
85                }
86                if ($mem_exif[$fichier]["GPSLatitude"]) {
87                        $exif_direc["GPSLatitude"][0] = $mem_exif[$fichier]["GPSLatitude"]["Degrees"];
88                        $exif_direc["GPSLatitude"][1] = ($mem_exif[$fichier]["GPSLatitude"]["Minutes"] * 100 + round($mem_exif[$fichier]["GPSLatitude"]["Seconds"] / 60 * 100)) . "/100";
89
90                        $exif_direc["GPSLatitudeRef"] = $mem_exif[$fichier]["GPSLatitudeRef"];
91                }
92                // Traiter la Latitude
93                // Retourne GPSLatitude en degres, minutes, secondes
94                // Retour GPSLatitudeInt en valeur entiere pour Google
95                if (isset($exif_direc["GPSLatitude"])) {
96
97                        $deg = $exif_direc["GPSLatitude"][0];
98                        if ( strpos($deg, "/") > 0) {
99                                $deg = substr($deg, 0, strpos($deg, "/"));
100                        }
101
102                        $min = $exif_direc["GPSLatitude"][1];
103                        if ( strpos($min, "/") > 0) {
104                                $minutes = substr($min, 0, strpos($min, "/"));
105                                $rap = substr($min, strpos($min, "/")+1, 12);
106
107                                $minutes = $minutes / $rap;
108
109                                $secondes = ($minutes - floor($minutes)) * 60 ;
110                                $minutes = floor($minutes);
111                        }
112
113                        $N_S = $exif_direc["GPSLatitudeRef"];
114                        $mem_exif[$fichier]["GPSLatitude"] = $deg."°&nbsp;$minutes"."’"."&nbsp;$secondes"."”&nbsp;$N_S";
115
116                        // Retourne aussi une valeur entiere pour Google Maps
117                        $GPSLatitudeInt = $deg + ($min / 6000) ;
118                        if ($N_S == "S") $GPSLatitudeInt = -1 * $GPSLatitudeInt;
119                        $mem_exif[$fichier]["GPSLatitudeInt"] = $GPSLatitudeInt ;
120                }
121
122                // Verifier que la precedente ref est E/W, sinon ne pas traiter
123                if (!($exif_direc["GPSLongitudeRef"] == "E" || $exif_direc["GPSLongitudeRef"] == "W")) {
124                        unset($mem_exif[$fichier]["GPSLongitude"]);
125                }
126                if ($mem_exif[$fichier]["GPSLongitude"]) {
127                        $exif_direc["GPSLongitude"][0] = $mem_exif[$fichier]["GPSLongitude"]["Degrees"];
128                        $exif_direc["GPSLongitude"][1] = ($mem_exif[$fichier]["GPSLongitude"]["Minutes"] * 100 + round($mem_exif[$fichier]["GPSLongitude"]["Seconds"] / 60 * 100)) . "/100";
129
130                        $exif_direc["GPSLongitudeRef"] = $mem_exif[$fichier]["GPSLongitudeRef"];
131                }
132                // Traiter longitude
133                if (isset($exif_direc["GPSLongitude"])) {
134                        $deg = $exif_direc["GPSLongitude"][0];
135                        if ( strpos($deg, "/") > 0) {
136                                $deg = substr($deg, 0, strpos($deg, "/"));
137                        }
138
139                        $min = $exif_direc["GPSLongitude"][1];
140                        if ( strpos($min, "/") > 0) {
141                                $minutes = substr($min, 0, strpos($min, "/"));
142                                $rap = substr($min, strpos($min, "/")+1, 12);
143
144                                $minutes = $minutes / $rap;
145
146                                $secondes = ($minutes - floor($minutes)) * 60 ;
147                                $minutes = floor($minutes);
148                        }
149
150                        $W_E = $exif_direc["GPSLongitudeRef"];
151                        $mem_exif[$fichier]["GPSLongitude"] =  $deg."°&nbsp;$minutes"."’"."&nbsp;$secondes"."”&nbsp;$W_E";
152
153                        // Retourne aussi une valeur entiere pour Google Maps
154                        $GPSLongitudeInt = $deg + ($min / 6000) ;
155                        if ($W_E == "W") $GPSLongitudeInt = -1 * $GPSLongitudeInt;
156                        $mem_exif[$fichier]["GPSLongitudeInt"] = $GPSLongitudeInt ;
157                }
158
159
160        }
161       
162        ecrire_fichier($fichier_exif, serialize($mem_exif[$fichier]));
163        return $mem_exif[$fichier];
164}
165
166/**
167 * Lire une valeur exif d'une umage
168 * @param string $fichier
169 * @param string $type
170 * @return array
171 */
172function lire_exif($fichier, $type=null) {
173       
174        $exif = extraire_exif($fichier);
175
176        if (!$type)
177                return $exif;
178        else
179                return $exif["$type"];
180}
181
182
183function extraire_iptc($fichier) {
184        global $pb_iptc;
185       
186        if ($pb_iptc["$fichier"]) return $pb_iptc["$fichier"];
187
188
189        if (!file_exists($fichier)) return;
190       
191
192                $time = filemtime($fichier);
193
194                $fichier_iptc = sous_repertoire(_DIR_VAR, 'cache-iptc') . md5($fichier.$time).".php";
195
196                // Systeme de cache pour les variables iptc                                                             
197                if (file_exists($fichier_iptc)) {
198                        lire_fichier($fichier_iptc, $pb_ecrire);
199                        $pb_iptc["$fichier"] = unserialize($pb_ecrire);
200
201                        return $pb_iptc["$fichier"];
202                }
203       
204                include_spip("inc/iptc");
205
206                $er = new class_IPTC($fichier);
207                $iptc = $er->fct_lireIPTC();
208                $codesiptc = $er->h_codesIptc;
209               
210                $pb_iptc["$fichier"] = $iptc;   
211       
212                $pb_ecrire = serialize($pb_iptc["$fichier"]);
213                ecrire_fichier($fichier_iptc, $pb_ecrire);
214       
215       
216                return $pb_iptc["$fichier"];
217}
218
219
220function lire_iptc ($fichier, $type=false) {
221        if (!function_exists('iptcparse')) return;
222
223        $iptc = extraire_iptc($fichier);
224       
225
226        if ($iptc["copyright"]) $iptc["copyright"] = mb_eregi_replace("\(c\)", "©", $iptc["copyright"]);
227       
228        if ($type) return $iptc["$type"];
229        else return $iptc;
230       
231}
232
233/**
234 * Tester si on peut traiter l'image compte tenu de la limite de memoire de GD2
235 * @param string $fichier
236 * @param int $largeur
237 * @param int $hauteur
238 * @return string
239 */
240function test_traiter_image($fichier, $largeur, $hauteur) {
241        $surface = $largeur * $hauteur;
242
243        if ($surface > $GLOBALS["meta"]["max_taille_vignettes"])
244                return '';
245        if (!file_exists($fichier))
246                return '';
247
248        return ' ';
249}
250
251/**
252 * Generer un histrogramme des couleurs RVB de l'image
253 *
254 * @param object $im
255 * @return string
256 */
257function image_histogramme($im) {
258        include_spip("inc/filtres_images");
259       
260        $fonction = array('image_histo', func_get_args());
261        $image = image_valeurs_trans($im, "histo","png",$fonction);
262
263        if (!$image) return("");
264       
265        $x_i = $image["largeur"];
266        $y_i = $image["hauteur"];
267        $surface = $x_i * $y_i;
268
269        if (!test_traiter_image($image["fichier"], $x_i, $y_i) ) return;
270       
271       
272        $im = $image["fichier"];
273       
274        $dest = $image["fichier_dest"];
275        $creer = $image["creer"];
276
277        if ($creer) {
278                $im = $image["fonction_imagecreatefrom"]($im);
279                $im_ = imagecreatetruecolor(258, 130);
280                @imagealphablending($im_, false);
281                @imagesavealpha($im_,true);
282                $color_t = ImageColorAllocateAlpha( $im_, 255, 255, 255 , 50);
283                imagefill ($im_, 0, 0, $color_t);
284                $col_poly = imagecolorallocate($im_,60,60,60);
285                imagepolygon($im_, array ( 0, 0, 257, 0, 257, 129, 0,129 ), 4, $col_poly);
286
287                $val_gris = $val_r = $val_g = $val_b = array();
288                for ($x = 0; $x < $x_i; $x++) {
289                        for ($y=0; $y < $y_i; $y++) {
290
291                                $rgb = ImageColorAt($im, $x, $y);
292                                $a = ($rgb >> 24) & 0xFF;
293                                $r = ($rgb >> 16) & 0xFF;
294                                $g = ($rgb >> 8) & 0xFF;
295                                $b = $rgb & 0xFF;
296
297                                $a = (127-$a) / 127;
298                                $a=1;
299                               
300                                $gris = round($a*($r+$g+$b) / 3);
301                                $r = round($a*$r);
302                                $g = round($a*$g);
303                                $b = round($a*$b);
304                               
305                                $val_gris[$gris] ++;
306                                $val_r[$r] ++;
307                                $val_g[$g] ++;
308                                $val_b[$b] ++;
309                        } 
310                }
311                $max = max( max($val_gris), max($val_r), max($val_g), max($val_b));
312               
313                // Limiter Max si trop concentr'e
314                $max = min ($max, round($surface*0.03));
315
316                $rapport = (127/$max);
317
318                $gris_50 = imagecolorallocate($im_, 170,170,170);
319                $gris_70 = imagecolorallocate($im_, 60,60,60);
320                for ($i = 0; $i < 256; $i++) {
321                        $val = 127 - round(max(0,$val_gris[$i]) * $rapport);
322                        imageline ($im_, $i+1, 128, $i+1, $val+1, $gris_50);
323                        imagesetpixel ($im_, $i+1, $val+1, $gris_70);
324                }
325                $bleu = imagecolorallocate($im_, 0, 0, 255);
326                for ($i = 0; $i < 256; $i++) {
327                        $val = 127 - round(max(0,$val_b[$i]) * $rapport);
328                        if ($i==0) imagesetpixel ($im_, $i+1, $val+1, $bleu);
329                        else imageline($im_, $i, $val_old+1, $i+1, $val+1, $bleu);
330
331                        $val_old = $val;
332                }
333                $green = imagecolorallocate($im_, 0, 255, 0);
334                for ($i = 0; $i < 256; $i++) {
335                        $val = 127 - round(max(0,$val_g[$i]) * $rapport);
336                        if ($i==0) imagesetpixel ($im_, $i+1, $val+1, $green);
337                        else imageline($im_, $i, $val_old+1, $i+1, $val+1, $green);
338                        $val_old = $val;
339                }
340                $rouge = imagecolorallocate($im_, 255, 0, 0);
341                for ($i = 0; $i < 256; $i++) {
342                        $val = 127 - round(max(0,$val_r[$i]) * $rapport);
343                        if ($i==0) imagesetpixel ($im_, $i+1, $val+1, $rouge);
344                        else imageline($im_, $i, $val_old+1, $i+1, $val+1, $rouge);
345                        $val_old = $val;
346                }
347
348                $image["fonction_image"]($im_, "$dest");
349                imagedestroy($im_);
350                imagedestroy($im);
351        }
352
353        return _image_ecrire_tag($image,array('src'=>$dest,'width'=>258,'height'=>130));
354}
355
356function position_carte ($latitude, $longitude, $taille) {
357        if (strlen($latitude) == 0 && strlen($longitude) == 0) return;
358
359        $img = find_in_path("imgs_photo/earth-map-$taille.jpg");
360        $img = "<img src='$img' alt='carte' />";
361       
362       
363        $n = round(($taille / 4) - (($latitude / 90) * ($taille / 4)));
364        $l = round(($taille / 2) + (($longitude / 180) * ($taille / 2)));
365       
366        $n = ($n - 4)."px";
367        $l = ($l - 4)."px";
368       
369        $croix = find_in_path("imgs_photo/croix-gps.gif");
370        $croix = "<img src='$croix' alt='+' />";
371
372       
373        return "<div style='position: relative; text-align: left;'><div>$img</div><div style='position: absolute; top: $n; left: $l;'>$croix</div></div>";
374}
375
376
377?>
Note: See TracBrowser for help on using the repository browser.