Rev 632 | Blame | 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){$metadonnees = $this->decoderMetaDonnees($chemin_fichier);return $metadonnees ;}private function peutUtiliserExifTool() {// TODO indiquer ceci dans un fichier de configreturn file_exists('/usr/bin/exiftool') && is_executable('/usr/bin/exiftool');}private function decoderMetadonnees($chemin_image) {$metadonnees = array();if($this->peutUtiliserExifTool()) {$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);$metadonnees['appareil_fabriquant'] = $this->obtenirAppareilFabricant(&$res);$metadonnees['appareil_modele'] = $this->obtenirAppareilModele(&$res);$metadonnees['hauteur'] = $this->obtenirHauteur(&$res);$metadonnees['largeur'] = $this->obtenirLargeur(&$res);$metadonnees['date_prise_de_vue'] = $this->obtenirDatePriseDeVue(&$res);} else {}return $metadonnees;}private function obtenirAppareilFabricant($infos_meta) {$fabriquant = '';if(isset($infos_meta['EXIF']['Make'])) {$fabriquant = $infos_meta['EXIF']['Make']['valeur'];}return $fabriquant;}private function obtenirAppareilModele($infos_meta) {$modele = '';if(isset($infos_meta['EXIF']['CameraModelName'])) {$modele = $infos_meta['EXIF']['CameraModelName']['valeur'];}return $modele;}private function obtenirHauteur($infos_meta) {$hauteur = '';if(isset($infos_meta['File']['ImageHeight'])) {$hauteur = $infos_meta['File']['ImageHeight']['valeur'];}return $hauteur;}private function obtenirLargeur($infos_meta) {$largeur = '';if(isset($infos_meta['File']['ImageWidth'])) {$largeur = $infos_meta['File']['ImageWidth']['valeur'];}return $largeur;}private function obtenirDatePriseDeVue($infos_meta) {$date = '';if(isset($infos_meta['EXIF']['DateTimeOriginal'])) {$date = $infos_meta['EXIF']['DateTimeOriginal']['valeur'];}return $date;}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;}private function estUnSeparateurCategorieExifTool($data) {return preg_match('^---- (.)* ----^',$data);}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;}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;}private function convertirIptcVersXML($donnees_meta) {$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;}private function convertirXmpVersXML($donnees_meta) {$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;}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 '';}}?>