Changeset 54437 in spip-zone for _plugins_/metadonnees_photo


Ignore:
Timestamp:
Nov 14, 2011, 12:02:46 PM (8 years ago)
Author:
cedric@…
Message:

utiliser une static plutot qu'une globale dans le cache des exif

Location:
_plugins_/metadonnees_photo/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/metadonnees_photo/trunk/paquet.xml

    r54435 r54437  
    22        prefix="photo_infos"
    33        categorie="multimedia"
    4         version="2.0.0"
     4        version="2.0.1"
    55        etat="stable"
    66        compatibilite="[3.0.0-beta;3.0.*]"
  • _plugins_/metadonnees_photo/trunk/photo_infos_fonctions.php

    r54431 r54437  
    3737}
    3838
     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 */
    3946function 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", " ", 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"]);
     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", " ", 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, "/"));
    79100                        }
    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"];
     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);
    85111                        }
    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."° $minutes"."’"." $secondes"."” $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 ;
     112
     113                        $N_S = $exif_direc["GPSLatitudeRef"];
     114                        $mem_exif[$fichier]["GPSLatitude"] = $deg."° $minutes"."’"." $secondes"."” $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, "/"));
    114137                        }
    115138
    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"]);
     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);
    119148                        }
    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."° $minutes"."’"." $secondes"."” $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 
    163 function lire_exif($fichier, $type=false) {
     149
     150                        $W_E = $exif_direc["GPSLongitudeRef"];
     151                        $mem_exif[$fichier]["GPSLongitude"] =  $deg."° $minutes"."’"." $secondes"."” $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) {
    164173       
    165174        $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
     176        if (!$type)
     177                return $exif;
     178        else
     179                return $exif["$type"];
     180}
     181
    175182
    176183function extraire_iptc($fichier) {
Note: See TracChangeset for help on using the changeset viewer.