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

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

passer quoi au squelette pour differencier les cas d'utilisation
indenter le html
simplifier le js pour se passer des id avec md5

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