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

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

verifier l'existence du fichier pour decider qu'on peut le traiter

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
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 string $fichier
229 * @param int $largeur
230 * @param int $hauteur
231 * @return string
232 */
233function test_traiter_image($fichier, $largeur, $hauteur) {
234        $surface = $largeur * $hauteur;
235
236        if ($surface > $GLOBALS["meta"]["max_taille_vignettes"])
237                return '';
238        if (!file_exists($fichier))
239                return '';
240
241        return ' ';
242}
243
244/**
245 * Generer un histrogramme des couleurs RVB de l'image
246 *
247 * @param object $im
248 * @return string
249 */
250function image_histogramme($im) {
251        include_spip("inc/filtres_images");
252       
253        $fonction = array('image_histo', func_get_args());
254        $image = image_valeurs_trans($im, "histo","png",$fonction);
255
256        if (!$image) return("");
257       
258        $x_i = $image["largeur"];
259        $y_i = $image["hauteur"];
260        $surface = $x_i * $y_i;
261
262        if (!test_traiter_image($image["fichier"], $x_i, $y_i) ) return;
263       
264       
265        $im = $image["fichier"];
266       
267        $dest = $image["fichier_dest"];
268        $creer = $image["creer"];
269
270        if ($creer) {
271                $im = $image["fonction_imagecreatefrom"]($im);
272                $im_ = imagecreatetruecolor(258, 130);
273                @imagealphablending($im_, false);
274                @imagesavealpha($im_,true);
275                $color_t = ImageColorAllocateAlpha( $im_, 255, 255, 255 , 50);
276                imagefill ($im_, 0, 0, $color_t);
277                $col_poly = imagecolorallocate($im_,60,60,60);
278                imagepolygon($im_, array ( 0, 0, 257, 0, 257, 129, 0,129 ), 4, $col_poly);
279
280                $val_gris = $val_r = $val_g = $val_b = array();
281                for ($x = 0; $x < $x_i; $x++) {
282                        for ($y=0; $y < $y_i; $y++) {
283
284                                $rgb = ImageColorAt($im, $x, $y);
285                                $a = ($rgb >> 24) & 0xFF;
286                                $r = ($rgb >> 16) & 0xFF;
287                                $g = ($rgb >> 8) & 0xFF;
288                                $b = $rgb & 0xFF;
289
290                                $a = (127-$a) / 127;
291                                $a=1;
292                               
293                                $gris = round($a*($r+$g+$b) / 3);
294                                $r = round($a*$r);
295                                $g = round($a*$g);
296                                $b = round($a*$b);
297                               
298                                $val_gris[$gris] ++;
299                                $val_r[$r] ++;
300                                $val_g[$g] ++;
301                                $val_b[$b] ++;
302                        } 
303                }
304                $max = max( max($val_gris), max($val_r), max($val_g), max($val_b));
305               
306                // Limiter Max si trop concentr'e
307                $max = min ($max, round($surface*0.03));
308
309                $rapport = (127/$max);
310
311                $gris_50 = imagecolorallocate($im_, 170,170,170);
312                $gris_70 = imagecolorallocate($im_, 60,60,60);
313                for ($i = 0; $i < 256; $i++) {
314                        $val = 127 - round(max(0,$val_gris[$i]) * $rapport);
315                        imageline ($im_, $i+1, 128, $i+1, $val+1, $gris_50);
316                        imagesetpixel ($im_, $i+1, $val+1, $gris_70);
317                }
318                $bleu = imagecolorallocate($im_, 0, 0, 255);
319                for ($i = 0; $i < 256; $i++) {
320                        $val = 127 - round(max(0,$val_b[$i]) * $rapport);
321                        if ($i==0) imagesetpixel ($im_, $i+1, $val+1, $bleu);
322                        else imageline($im_, $i, $val_old+1, $i+1, $val+1, $bleu);
323
324                        $val_old = $val;
325                }
326                $green = imagecolorallocate($im_, 0, 255, 0);
327                for ($i = 0; $i < 256; $i++) {
328                        $val = 127 - round(max(0,$val_g[$i]) * $rapport);
329                        if ($i==0) imagesetpixel ($im_, $i+1, $val+1, $green);
330                        else imageline($im_, $i, $val_old+1, $i+1, $val+1, $green);
331                        $val_old = $val;
332                }
333                $rouge = imagecolorallocate($im_, 255, 0, 0);
334                for ($i = 0; $i < 256; $i++) {
335                        $val = 127 - round(max(0,$val_r[$i]) * $rapport);
336                        if ($i==0) imagesetpixel ($im_, $i+1, $val+1, $rouge);
337                        else imageline($im_, $i, $val_old+1, $i+1, $val+1, $rouge);
338                        $val_old = $val;
339                }
340
341                $image["fonction_image"]($im_, "$dest");
342                imagedestroy($im_);
343                imagedestroy($im);
344        }
345
346        return _image_ecrire_tag($image,array('src'=>$dest,'width'=>258,'height'=>130));
347}
348
349function position_carte ($latitude, $longitude, $taille) {
350        if (strlen($latitude) == 0 && strlen($longitude) == 0) return;
351
352        $img = find_in_path("imgs_photo/earth-map-$taille.jpg");
353        $img = "<img src='$img' alt='carte' />";
354       
355       
356        $n = round(($taille / 4) - (($latitude / 90) * ($taille / 4)));
357        $l = round(($taille / 2) + (($longitude / 180) * ($taille / 2)));
358       
359        $n = ($n - 4)."px";
360        $l = ($l - 4)."px";
361       
362        $croix = find_in_path("imgs_photo/croix-gps.gif");
363        $croix = "<img src='$croix' alt='+' />";
364
365       
366        return "<div style='position: relative; text-align: left;'><div>$img</div><div style='position: absolute; top: $n; left: $l;'>$croix</div></div>";
367}
368
369
370?>
Note: See TracBrowser for help on using the repository browser.