Subversion Repositories eFlore/Applications.cel

Rev

Rev 632 | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
/**
 * Classe d'extraction de metadonnées afin de les mettre dans 
 * un tableau au format du cel
 * Encodage en entrée : utf8
 * Encodage en sortie : utf8
 *
 * @author Aurélien PERONNET <aurelien@tela-botanica.org>
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
 * @version $Id$
 */
class ExtracteurMetadonnees {

         public function extraireMetadonnees($chemin_fichier)
         {
         
                $iptc = $this->extraireIptc($chemin_fichier) ;
                $exif = $this->extraireExif($chemin_fichier) ;
                
                $meta = array_merge($exif,$iptc);
                
                $this->initialiserSectionsSupplementaires(&$meta) ;
                
                return $meta ;
         }
         
        /**
        * Extraction des metadonnées exif 
        **/
        public function extraireExif($chemin_fichier)
        {
                $exif_tab = $this->initialiserTableauExif () ;
        
                $exif = @exif_read_data($chemin_fichier,"EXIF,COMPUTED,IFD0,FILE,COMMENT",true,false);

                if ($exif) {
                        foreach ($exif as $key => $section) 
                        {
                            foreach ($section as $name => $val) 
                            {
                                        if ($name != "MakerNote")
                                        {
                                                        $this->decoderValeurExif ($name, $val ,&$exif_tab) ;
                                        }
                            }
                        }
                }
                
                return $exif_tab ;
        }
        
        /**
        * Extraction des metadonnées iptc 
        **/
        public function extraireIptc($chemin_fichier)
        {
                $iptc_tab = $this->initialiserTableauIptc() ;
                
                // geimagesize renvoie le infos iptc dans le tableau info
                $size = getimagesize($chemin_fichier, $info);
                // s'il existe
                if (isset($info["APP13"])) 
                {
                        // on parse les donnees
                        $iptc = iptcparse($info["APP13"]);
                        if ($iptc) {
                                // et on les analyse
                                foreach ($iptc as $marker => $section)
                                {
                                        foreach ($section as $nom => $val)
                                        {
                                                // pour remplir le tableau de donnees
                                                $this->decoderValeurIptc($marker, $val ,&$iptc_tab) ;
                                        }
                                }
                        }
                }
                
                return $iptc_tab ;
        }
        
        /**
        * Stocke une valeur de metadonnées exif dans le champ du tableau correspondant
        * @param String $nom nom de la valeur
        * @param String $val valeur
        * @param String $data référence vers le tableau où la donnée sera stockée 
        **/
        private function decoderValeurExif($nom, $val ,$data_tab)
        {       
                switch ($nom)
                {
                
                        case "Height" :
                        $data_tab['ci_meta_height'] = $val  ;
                        break ;
                        
                        case "Width" :
                        $data_tab['ci_meta_width'] = $val  ;
                        break ;
                        
                        case "Make" :
                                $data_tab['ci_meta_make'] = $val  ;
                        break ;
                        
                        case "Model" :
                                $data_tab['ci_meta_model'] = $val ;
                        break ;
                        
                        case "XResolution" :
                                $data_tab['ci_meta_x_resolution'] = $val  ;
                        break ;
                        
                        case "YResolution" :
                                $data_tab['ci_meta_y_resolution'] = $val ;
                        break ; 
                                
                        case "DateTimeOriginal" :
                                $data_tab['ci_meta_date_time'] = $val  ;
                        break ;
                        
                        case "GPS" :
                                $data_tab['ci_meta_gps'] = $val  ;
                        break ;
                        
                        case "UserComment" :
                                $data_tab['ci_meta_user_comment'] = '"'.$val.'"' ;
                        break ;
                        
                        case "ExposureTime" :
                                $data_tab['ci_meta_exif_exposure_time'] = $val ;
                        break ;
                        
                        case "FNumber" :
                                $data_tab['ci_meta_exif_f_number'] = $val  ;
                        break ;
                        
                        case "ExifVersion" :
                                $data_tab['ci_meta_exif_exif_version'] = $val  ;
                        break ;
                        
                        case "CompressedBitsPerPixel" :
                                $data_tab['ci_meta_exif_compressed_bits_per_pixel'] = $val  ;
                        break ;
                        
                        case "ShutterSpeedValue" :
                                $data_tab['ci_meta_exif_shutter_speed_value'] = $val  ;
                        break ;
                        
                        case "ApertureValue" :
                                $data_tab['ci_meta_exif_aperture_value'] = $val  ;
                        break ;
                        
                        case "ExposureBiasValue" :
                                $data_tab['ci_meta_exif_exposure_bias_value'] = $val  ;
                        break ;
                        
                        case "MaxApertureValue" :
                                $data_tab['ci_meta_exif_max_aperture_value'] = $val  ;
                        break ;
                        
                        case "MeteringMode" :
                                $data_tab['ci_meta_exif_metering_mode'] = $val  ;
                        break ;
                        
                        case "LightSource" :
                                $data_tab['ci_meta_exif_light_source'] = $val  ;
                        break ;
                        
                        case "Flash" :
                                $data_tab['ci_meta_exif_flash'] = $val  ;
                        break ;
                        
                        case "FocalLength" :
                                $data_tab['ci_meta_exif_focal_length'] = $val  ;
                        break ;
                        
                        case "FlashpixVersion" :
                                $data_tab['ci_meta_exif_flash_pix_version'] = $val  ;
                        break ;
                        
                        case "ColorSpace" :
                                $data_tab['ci_meta_exif_color_space'] = $val  ;
                        break ;
                        
                        case "InteroperabilityOffset" :
                                $data_tab['ci_meta_exif_interoperability_offset'] = $val  ;
                        break ;
                        
                        case "FocalPlaneXResolution" :
                                $data_tab['ci_meta_exif_focal_plane_x_resolution'] = $val  ;
                        break ;
                        
                        case "FocalPlaneYResolution" :
                                $data_tab['ci_meta_exif_focal_plane_y_resolution'] = $val  ;
                        break ;
                        
                        case "FocalPlaneResolutionUnit" :
                                $data_tab['ci_meta_exif_focal_plane_resolution_unit'] = $val  ;
                        break ;
                        
                        case "SensingMethod" :
                                $data_tab['ci_meta_exif_sensing_method'] = $val  ;
                        break ;
                        
                        case "FileSource" :
                                $data_tab['ci_meta_exif_file_source'] = $val  ;
                        break ;
                        
                        case "CustomRendered" :
                                $data_tab['ci_meta_exif_custom_rendered'] = $val  ;
                        break ;
                        
                        case "ExposureMode" :
                                $data_tab['ci_meta_exif_exposure_mode'] = $val  ;
                        break ;
                        
                        case "WhiteBalance" :
                                $data_tab['ci_meta_exif_white_balance'] = $val  ;
                        break ;
                        
                        case "DigitalZoomRatio" :
                                $data_tab['ci_meta_exif_digital_zoom_ratio'] = $val  ;
                        break ;
                        
                        case "SceneCaptureType" :
                                $data_tab['ci_meta_exif_scene_capture_type'] = $val  ;
                        break ;
                        
                        case "GainControl" :
                                $data_tab['ci_meta_exif_gain_control'] = $val  ;
                        break ;
                        
                        case "Contrast" :
                                $data_tab['ci_meta_exif_contrast'] = $val  ;
                        break ;
                        
                        case "Saturation" :
                                $data_tab['ci_meta_exif_saturation'] = $val  ;
                        break ;
                        
                        case "Sharpness" :
                                $data_tab['ci_meta_exif_sharpness'] = $val  ;
                        break ;
                        
                        case "SubjectDistanceRange" :
                                $data_tab['ci_meta_exif_subject_distance_range'] = $val  ;
                        break ;
                        
                        default :
                                $data_tab['ci_meta_exif_autres'] .= $nom.":".$val.";" ;
                }       
        }
        
        /**
        * Stocke une valeur de metadonnées iptc dans le champ du tableau correspondant
        * @param String $nom nom de la valeur
        * @param String $val valeur
        * @param String $data référence vers le tableau où la donnée sera stockée
        **/
        private function decoderValeurIptc($nom, $val ,$data_tab)
        {       
                switch($nom)
                {
                        // mots cles iptc
                        case "2#005" :
                                $data_tab['ci_meta_iptc_category'] = $val ;
                        break;
                        
                        case "2#025" :
                                $data_tab['ci_meta_iptc_mots_cles'] = $val ;
                        break;
                        
                        // champ by line
                        case "2#080" :
                                $data_tab['ci_meta_iptc_by_line']  = $val  ;
                        break ;
                        
                        // champ by line titre
                        case "2#085" :
                                $data_tab['ci_meta_iptc_by_line_title'] = $val  ;
                        break ;
                        
                        // ville
                        case "2#090" :
                                $data_tab['ci_meta_iptc_city'] = $val  ;
                        break ;
                        
                        // sous location
                        case "2#092" :
                                $data_tab['ci_meta_iptc_sub_location'] = $val ;
                        break ;
                        
                        // etat (pour les us)
                        case "2#095" :
                                $data_tab['ci_meta_iptc_province_state'] = $val  ;
                        break ;
                        
                        // code pays
                        case "2#100" :
                                $data_tab['ci_meta_iptc_country_primary_location_code'] = $val  ;
                        break ;
                        
                        // code pays
                        case "2#101" :
                                $data_tab['ci_meta_iptc_country_name'] = $val  ;
                        break ;
                        
                        // titre principal
                        case "2#105" :
                                $data_tab['ci_meta_iptc_headline'] = $val  ;
                        break ;
                        
                        // credit
                        case "2#110" :
                                $data_tab['ci_meta_iptc_credit'] = $val  ;
                        break ;
                        
                        // copyright
                        case "2#116" :
                                $data_tab['ci_meta_iptc_copyright_notice'] = $val  ;
                        break ;
                        
                        // contact
                        case "2#118" :
                                $data_tab['ci_meta_iptc_contact'] = $val  ;
                        break ;
                        
                        // autres (pour les champs qu'on ne prend pas en compte)
                        default :
                                $data_tab['ci_meta_iptc_autres'] .= $nom.":".$val.";" ;
                }
        }
        
        /**
        * Crée le tableau vide pour stocker les iptc pour le ce
        * 
        * @return array $data_tab référence vers le tableau où la donnée sera stockée
        * 
        **/
        private function initialiserTableauIptc()
        {       
                $data_tab = array() ;
                
                $data_tab['ci_meta_iptc_category'] = NULL ;
                
                $data_tab['ci_meta_iptc_mots_cles'] = NULL ;
                        
                $data_tab['ci_meta_iptc_by_line']  = NULL ;
                        
                $data_tab['ci_meta_iptc_by_line_title'] = NULL ;
                        
                $data_tab['ci_meta_iptc_city'] = NULL ;
                        
                $data_tab['ci_meta_iptc_sub_location'] = NULL ;
                        
                $data_tab['ci_meta_iptc_province_state'] = NULL ;
                        
                $data_tab['ci_meta_iptc_country_primary_location_code'] = NULL ;
                
                $data_tab['ci_meta_iptc_country_name'] = NULL  ;
                        
                $data_tab['ci_meta_iptc_headline'] = NULL ;
                        
                $data_tab['ci_meta_iptc_credit'] = NULL ;
                        
                $data_tab['ci_meta_iptc_copyright_notice'] = NULL ;
                        
                $data_tab['ci_meta_iptc_contact'] = NULL ;
                        
                $data_tab['ci_meta_iptc_autres'] .= " " ;
        
                return $data_tab ;              
        }
        
        /**
        * Crée le tableau vide pour stocker les exifs pour le cel
        * 
        * @return array $data_tab référence vers le tableau où la donnée sera stockée
        * 
        **/
        private function initialiserTableauExif()
        {
                $data_tab = array() ;
         
                $data_tab['ci_meta_height'] = 0  ;
                        
                $data_tab['ci_meta_width'] = 0  ;
         
                $data_tab['ci_meta_make'] = NULL ;
                
                $data_tab['ci_meta_model'] = NULL ;
                
                $data_tab['ci_meta_x_resolution'] = NULL ;
                
                $data_tab['ci_meta_y_resolution'] = NULL ;
                
                $data_tab['ci_meta_date_time'] = NULL ;
                
                $data_tab['ci_meta_gps'] = NULL ;
        
                $data_tab['ci_meta_user_comment'] = NULL ;
        
                $data_tab['ci_meta_exif_exposure_time'] = NULL ;
        
                $data_tab['ci_meta_exif_f_number'] = NULL ;
        
                $data_tab['ci_meta_exif_exif_version'] = NULL ;
        
                $data_tab['ci_meta_exif_compressed_bits_per_pixel'] = NULL ;
        
                $data_tab['ci_meta_exif_shutter_speed_value'] = NULL ;
        
                $data_tab['ci_meta_exif_aperture_value'] = NULL ;
        
                $data_tab['ci_meta_exif_exposure_bias_value'] = NULL ;
        
                $data_tab['ci_meta_exif_max_aperture_value'] = NULL ;
        
                $data_tab['ci_meta_exif_metering_mode'] = NULL ;
        
                $data_tab['ci_meta_exif_flash'] = NULL ;
                
                $data_tab['ci_meta_exif_light_source'] = NULL ;
        
                $data_tab['ci_meta_exif_focal_length'] = NULL ;
        
                $data_tab['ci_meta_exif_flash_pix_version'] = NULL ;
        
                $data_tab['ci_meta_exif_color_space'] = NULL ;
        
                $data_tab['ci_meta_exif_interoperability_offset'] = NULL ;
        
                $data_tab['ci_meta_exif_focal_plane_x_resolution'] = NULL ;
        
                $data_tab['ci_meta_exif_focal_plane_y_resolution'] = NULL ;
        
                $data_tab['ci_meta_exif_focal_plane_resolution_unit'] = NULL ;
        
                $data_tab['ci_meta_exif_sensing_method'] = NULL ;
        
                $data_tab['ci_meta_exif_file_source'] = NULL ;
                        
                $data_tab['ci_meta_exif_custom_rendered'] = NULL ;
        
                $data_tab['ci_meta_exif_exposure_mode'] = NULL ;
        
                $data_tab['ci_meta_exif_white_balance'] = NULL ;                
        
                $data_tab['ci_meta_exif_digital_zoom_ratio'] = NULL ;
        
                $data_tab['ci_meta_exif_scene_capture_type'] = NULL ;
        
                $data_tab['ci_meta_exif_gain_control'] = NULL ;
        
                $data_tab['ci_meta_exif_contrast'] = NULL ;
                
                $data_tab['ci_meta_exif_saturation'] = NULL ;
        
                $data_tab['ci_meta_exif_sharpness'] = NULL ;
        
                $data_tab['ci_meta_exif_subject_distance_range'] = NULL ;
        
                $data_tab['ci_meta_exif_autres'] .= " " ;
        
                return $data_tab ;                      
        }
        
        /**
        * Crée le tableau vide pour stocker les section supplémentaires pour le cel
        * 
        * @return array $tab référence vers le tableau de metadonnées
        * 
        **/
        private function InitialiserSectionsSupplementaires($tab)
        {
                $tab['ci_meta_exif_autres'] .= " " ;
                $tab['ci_meta_iptc_autres'] .= " " ;
                $tab['ci_nom_original'] = NULL ;
                $tab['ci_md5'] = NULL ;
        }
}
?>