* @license GPL v3 * @license CECILL v2 * @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 ; } } ?>