source: spip-zone/_plugins_/_stable_/metadonnees_photo/photo_infos_fonctions.php @ 26277

Last change on this file since 26277 was 26277, checked in by marcimat@…, 12 years ago

Démission forcée de chemin()

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