14,470 → 14,191 |
|
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 ; |
|
$metadonnees = $this->decoderMetaDonnees($chemin_fichier); |
|
return $metadonnees ; |
} |
|
/** |
* 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 ; |
private function peutUtiliserExifTool() { |
// TODO indiquer ceci dans un fichier de config |
return file_exists('/usr/bin/exiftool') && is_executable('/usr/bin/exiftool'); |
} |
|
/** |
* Extraction des metadonnées iptc |
**/ |
public function extraireIptc($chemin_fichier) |
{ |
$iptc_tab = $this->initialiserTableauIptc() ; |
private function decoderMetadonnees($chemin_image) { |
|
// 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) ; |
} |
} |
} |
} |
$metadonnees = array(); |
|
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 ; |
if($this->peutUtiliserExifTool()) { |
|
case "Width" : |
$data_tab['ci_meta_width'] = $val ; |
break ; |
$res = $this->decoderMetadonneesExifTool($chemin_image); |
$metadonnees['meta_exif'] = $this->convertirExifVersXML(&$res); |
$metadonnees['meta_iptc'] = $this->convertirIptcVersXML(&$res); |
$metadonnees['meta_xmp'] = $this->convertirXmpVersXML(&$res); |
$metadonnees['meta_makernote'] = $this->convertirMakernoteVersXML(&$res); |
|
case "Make" : |
$data_tab['ci_meta_make'] = $val ; |
break ; |
$metadonnees['appareil_fabriquant'] = $this->obtenirAppareilFabricant(&$res); |
$metadonnees['appareil_modele'] = $this->obtenirAppareilModele(&$res); |
|
case "Model" : |
$data_tab['ci_meta_model'] = $val ; |
break ; |
$metadonnees['hauteur'] = $this->obtenirHauteur(&$res); |
$metadonnees['largeur'] = $this->obtenirLargeur(&$res); |
|
case "XResolution" : |
$data_tab['ci_meta_x_resolution'] = $val ; |
break ; |
$metadonnees['date_prise_de_vue'] = $this->obtenirDatePriseDeVue(&$res); |
|
case "YResolution" : |
$data_tab['ci_meta_y_resolution'] = $val ; |
break ; |
|
case "DateTimeOriginal" : |
$data_tab['ci_meta_date_time'] = $val ; |
break ; |
} else { |
|
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.";" ; |
} |
} |
|
return $metadonnees; |
} |
|
/** |
* 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.";" ; |
} |
private function obtenirAppareilFabricant($infos_meta) { |
|
$fabriquant = ''; |
|
if(isset($infos_meta['EXIF']['Make'])) { |
$fabriquant = $infos_meta['EXIF']['Make']['valeur']; |
} |
|
return $fabriquant; |
} |
|
/** |
* 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() ; |
private function obtenirAppareilModele($infos_meta) { |
|
$data_tab['ci_meta_iptc_category'] = NULL ; |
$modele = ''; |
|
$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 ; |
if(isset($infos_meta['EXIF']['CameraModelName'])) { |
$modele = $infos_meta['EXIF']['CameraModelName']['valeur']; |
} |
|
$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 $modele; |
} |
|
return $data_tab ; |
private function obtenirHauteur($infos_meta) { |
$hauteur = ''; |
|
if(isset($infos_meta['File']['ImageHeight'])) { |
$hauteur = $infos_meta['File']['ImageHeight']['valeur']; |
} |
|
return $hauteur; |
} |
|
/** |
* 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 ; |
private function obtenirLargeur($infos_meta) { |
$largeur = ''; |
|
$data_tab['ci_meta_model'] = NULL ; |
if(isset($infos_meta['File']['ImageWidth'])) { |
$largeur = $infos_meta['File']['ImageWidth']['valeur']; |
} |
|
$data_tab['ci_meta_x_resolution'] = NULL ; |
return $largeur; |
} |
|
private function obtenirDatePriseDeVue($infos_meta) { |
|
$data_tab['ci_meta_y_resolution'] = NULL ; |
$date = ''; |
|
$data_tab['ci_meta_date_time'] = NULL ; |
if(isset($infos_meta['EXIF']['DateTimeOriginal'])) { |
$date = $infos_meta['EXIF']['DateTimeOriginal']['valeur']; |
} |
|
$data_tab['ci_meta_gps'] = NULL ; |
return $date; |
} |
|
$data_tab['ci_meta_user_comment'] = NULL ; |
private function decoderMetadonneesExifTool($chemin_image) { |
$metadata = array(); |
$res = exec('/usr/bin/exiftool -g -D '.$chemin_image, $metadata); |
|
$metadata_decodees = array(); |
|
$categorie = ''; |
foreach($metadata as &$data) { |
if($this->estUnSeparateurCategorieExifTool($data)) { |
$categorie = trim(str_replace('----','',$data)); |
} else { |
$data_decodee = $this->parserValeurMetadonneeExifTool($data); |
$cle_metadonnee = str_replace(' ', '', $data_decodee['cle']); |
$metadata_decodees[$categorie][$cle_metadonnee] = $data_decodee; |
} |
} |
|
return $metadata_decodees; |
} |
|
$data_tab['ci_meta_exif_exposure_time'] = NULL ; |
private function estUnSeparateurCategorieExifTool($data) { |
return preg_match('^---- (.)* ----^',$data); |
} |
|
$data_tab['ci_meta_exif_f_number'] = NULL ; |
private function parserValeurMetadonneeExifTool($data) { |
$cle_valeur = explode(':',$data); |
|
$valeur = ''; |
if(count($cle_valeur) == 2) { |
$valeur = trim($cle_valeur[1]); |
} |
|
$id_cle = explode(' ',trim($cle_valeur[0]),2); |
|
$id_cle[1] = str_replace(array('-','/'),'',$id_cle[1]); |
|
$cle_id_valeur = array('cle' => $id_cle[1], 'id' => str_replace('-','',$id_cle[0]), 'valeur' => $valeur); |
return $cle_id_valeur; |
} |
|
$data_tab['ci_meta_exif_exif_version'] = NULL ; |
private function convertirExifVersXML($donnees_meta) { |
|
$xml = '<?xml version="1.0" encoding="UTF-8" ?>'; |
$xml .= '<exif>'; |
if (isset($donnees_meta['EXIF'])) { |
foreach ($donnees_meta['EXIF'] as $prop => &$valeur) { |
$xml .= '<'.$prop.' id="'.$valeur['id'].'">'.$valeur['valeur'].'</'.$prop.'>'."\n"; |
} |
} |
$xml .= '</exif>'."\n"."\n"; |
|
return $xml; |
} |
|
$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 ; |
private function convertirIptcVersXML($donnees_meta) { |
|
$data_tab['ci_meta_exif_light_source'] = NULL ; |
$xml = '<?xml version="1.0" encoding="UTF-8" ?>'; |
$xml .= '<iptc>'; |
if (isset($donnees_meta['IPTC'])) { |
foreach ($donnees_meta['IPTC'] as $prop => &$valeur) { |
$xml .= '<'.$prop.' id="'.$valeur['id'].'">'.$valeur['valeur'].'</'.$prop.'>'."\n"; |
} |
} |
$xml .= '</iptc>'."\n"."\n"; |
|
return $xml; |
} |
|
$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 ; |
private function convertirXmpVersXML($donnees_meta) { |
|
$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 ; |
$xml = '<?xml version="1.0" encoding="UTF-8" ?>'; |
$xml .= '<xmp>'; |
if (isset($donnees_meta['XMP'])) { |
foreach ($donnees_meta['XMP'] as $prop => &$valeur) { |
$xml .= '<'.$prop.' id="'.$valeur['id'].'">'.$valeur['valeur'].'</'.$prop.'>'."\n"; |
} |
} |
$xml .= '</xmp>'; |
|
return $xml; |
} |
|
/** |
* 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 ; |
private function convertirMakernoteVersXML($donnees_meta) { |
|
$xml = '<?xml version="1.0" encoding="UTF-8" ?>'; |
$xml .= '<makernote>'; |
if (isset($donnees_meta['MAKERNOTE'])) { |
foreach ($donnees_meta['MAKERNOTE'] as $prop => &$valeur) { |
$xml .= '<'.$prop.' id="'.$valeur['id'].'">'.$valeur['valeur'].'</'.$prop.'>'."\n"; |
} |
} |
$xml .= '</makernote>'; |
|
return ''; |
} |
} |
?> |