1,16 → 1,19 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* 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 |
* Classe d'extraction de metadonnées d'un fichier JPEG afin de les mettre dans un tableau au format du CEL. |
* |
* @author Aurélien PERONNET <aurelien@tela-botanica.org> |
* @author Jean-Pascal MILCENT <jpm@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$ |
* @copyright © 2012, Tela Botanica |
* @internal Mininum PHP version : 5.2 |
* @category CEL |
* @package Services |
* @subpackage Bibliothèques |
* @version 0.1 |
* @author Mathias CHOUET <mathias@tela-botanica.org> |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @author Aurelien 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> |
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org> |
*/ |
class ExtracteurMetadonnees { |
|
496,10 → 499,10 |
} |
|
public function decoderMetadonneesBasique($chemin_fichier) { |
$exif = @exif_read_data($chemin_fichier, "EXIF,COMPUTED,IFD0,FILE,COMMENT", true, false); |
$exif = @exif_read_data($chemin_fichier, "EXIF,COMPUTED,IFD0,FILE,COMMENT", true, false); |
|
// tant pis pour les makernote et xmp, les décoder demande trop de librairies externes, autant installer exiftool alors |
$metadonnees = array(); |
// tant pis pour les makernote et xmp, les décoder demande trop de librairies externes, autant installer exiftool alors |
$metadonnees = array(); |
$metadonnees['XMP'] = array(); |
unset($metadonnees['EXIF']['MakerNote']); |
$metadonnees['MAKERNOTE'] = array(); |
511,142 → 514,140 |
$metadonnees_non_formatees = array_merge($metadonnees_non_formatees, $exif['IFD0']); |
} |
$metadonnees['EXIF'] = $this->formaterTableauExif($metadonnees_non_formatees); |
$metadonnees['IPTC'] = $this->extraireIptc($chemin_fichier); |
$metadonnees['File'] = array( |
'ImageWidth' => array('id' => '', 'valeur' => $exif['COMPUTED']['Width']), |
$metadonnees['IPTC'] = $this->extraireIptc($chemin_fichier); |
$metadonnees['File'] = array( |
'ImageWidth' => array('id' => '', 'valeur' => $exif['COMPUTED']['Width']), |
'ImageHeight' => array('id' => '', 'valeur' => $exif['COMPUTED']['Height'])); |
return $metadonnees ; |
} |
return $metadonnees ; |
} |
|
private function formaterTableauExif(&$tableau) { |
$tableau_exif_formate = array(); |
private function formaterTableauExif(&$tableau) { |
$tableau_exif_formate = array(); |
|
foreach ($tableau as $nom_tag => $valeur) { |
$id = ''; |
if (isset($this->tableau_ids_tags_exif[$nom_tag])) { |
$id = $this->tableau_ids_tags_exif[$nom_tag]; |
} |
$tableau_exif_formate[$nom_tag] = array('id' => $id, 'valeur' => $valeur); |
} |
foreach ($tableau as $nom_tag => $valeur) { |
$id = ''; |
if (isset($this->tableau_ids_tags_exif[$nom_tag])) { |
$id = $this->tableau_ids_tags_exif[$nom_tag]; |
} |
$tableau_exif_formate[$nom_tag] = array('id' => $id, 'valeur' => $valeur); |
} |
|
return $tableau_exif_formate; |
} |
return $tableau_exif_formate; |
} |
|
/** |
* Extraction des metadonnées iptc |
**/ |
public function extraireIptc($chemin_fichier) { |
$meta = array(); |
/** |
* Extraction des metadonnées iptc |
*/ |
public function extraireIptc($chemin_fichier) { |
$meta = array(); |
|
// getimagesize renvoie les infos iptc dans le tableau info |
$info = array(); |
$size = getimagesize($chemin_fichier, $info); |
// getimagesize renvoie les infos iptc dans le tableau info |
$info = array(); |
$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, $meta); |
} |
} |
} |
} |
// 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, $meta); |
} |
} |
} |
} |
return $meta; |
} |
|
return $meta; |
} |
/** |
* 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) { |
case "2#005" :// mots cles iptc |
$data_tab['Category'] = array('id' => '5', 'valeur' => $val); |
break; |
case "2#080" :// champ by line |
$data_tab['By-Line'] = array('id' => '80', 'valeur' => $val); |
break ; |
case "2#085" :// champ by line titre |
$data_tab['By-LineTitle'] = array('id' => '85', 'valeur' => $val); |
break ; |
case "2#090" :// ville |
$data_tab['City'] = array('id' => '90', 'valeur' => $val); |
break ; |
case "2#092" :// sous location |
$data_tab['SubLocation'] = array('id' => '92', 'valeur' => $val); |
break ; |
case "2#095" :// etat (pour les us) |
$data_tab['ProvinceState'] = array('id' => '95', 'valeur' => $val); |
break ; |
case "2#100" :// code pays |
$data_tab['CountryPrimaryLocationCode'] = array('id' => '100', 'valeur' => $val); |
break ; |
case "2#101" :// code pays |
$data_tab['CountryName'] = array('id' => '101', 'valeur' => $val); |
break ; |
case "2#105" :// titre principal |
$data_tab['Headline'] = array('id' => '105', 'valeur' => $val); |
break ; |
case "2#110" :// credit |
$data_tab['Credit'] = array('id' => '110', 'valeur' => $val); |
break ; |
case "2#116" :// copyright |
$data_tab['CopyrightNotice'] = array('id' => '116', 'valeur' => $val); |
break ; |
case "2#118" :// contact |
$data_tab['Contact'] = array('id' => '118', 'valeur' => $val); |
break ; |
default: |
unset($data_tab['nom']); |
} |
} |
|
/** |
* 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) { |
case "2#005" :// mots cles iptc |
$data_tab['Category'] = array('id' => '5', 'valeur' => $val); |
break; |
case "2#080" :// champ by line |
$data_tab['By-Line'] = array('id' => '80', 'valeur' => $val); |
break ; |
case "2#085" :// champ by line titre |
$data_tab['By-LineTitle'] = array('id' => '85', 'valeur' => $val); |
break ; |
case "2#090" :// ville |
$data_tab['City'] = array('id' => '90', 'valeur' => $val); |
break ; |
case "2#092" :// sous location |
$data_tab['SubLocation'] = array('id' => '92', 'valeur' => $val); |
break ; |
case "2#095" :// etat (pour les us) |
$data_tab['ProvinceState'] = array('id' => '95', 'valeur' => $val); |
break ; |
case "2#100" :// code pays |
$data_tab['CountryPrimaryLocationCode'] = array('id' => '100', 'valeur' => $val); |
break ; |
case "2#101" :// code pays |
$data_tab['CountryName'] = array('id' => '101', 'valeur' => $val); |
break ; |
case "2#105" :// titre principal |
$data_tab['Headline'] = array('id' => '105', 'valeur' => $val); |
break ; |
case "2#110" :// credit |
$data_tab['Credit'] = array('id' => '110', 'valeur' => $val); |
break ; |
case "2#116" :// copyright |
$data_tab['CopyrightNotice'] = array('id' => '116', 'valeur' => $val); |
break ; |
case "2#118" :// contact |
$data_tab['Contact'] = array('id' => '118', 'valeur' => $val); |
break ; |
default: |
unset($data_tab['nom']); |
} |
} |
private function obtenirHauteur() { |
$hauteur = isset($this->meta['File']['ImageHeight']) ? $this->meta['File']['ImageHeight']['valeur'] : ''; |
return $hauteur; |
} |
|
private function obtenirHauteur() { |
$hauteur = isset($this->meta['File']['ImageHeight']) ? $this->meta['File']['ImageHeight']['valeur'] : ''; |
return $hauteur; |
} |
private function obtenirLargeur() { |
$largeur = isset($this->meta['File']['ImageWidth']) ? $this->meta['File']['ImageWidth']['valeur'] : ''; |
return $largeur; |
} |
|
private function obtenirLargeur() { |
$largeur = isset($this->meta['File']['ImageWidth']) ? $this->meta['File']['ImageWidth']['valeur'] : ''; |
return $largeur; |
} |
private function obtenirDatePriseDeVue() { |
$date = isset($this->meta['EXIF']['DateTimeOriginal']) ? $this->meta['EXIF']['DateTimeOriginal']['valeur'] : ''; |
return $date; |
} |
|
private function obtenirDatePriseDeVue() { |
$date = isset($this->meta['EXIF']['DateTimeOriginal']) ? $this->meta['EXIF']['DateTimeOriginal']['valeur'] : ''; |
return $date; |
} |
private function obtenirAppareilFabricant() { |
$fabriquant = isset($this->meta['EXIF']['Make']) ? $this->meta['EXIF']['Make']['valeur'] : ''; |
return $fabriquant; |
} |
|
private function obtenirAppareilFabricant() { |
$fabriquant = isset($this->meta['EXIF']['Make']) ? $this->meta['EXIF']['Make']['valeur'] : ''; |
return $fabriquant; |
} |
private function obtenirAppareilModele() { |
$modele = isset($this->meta['EXIF']['CameraModelName']) ? $this->meta['EXIF']['CameraModelName']['valeur'] : ''; |
return $modele; |
} |
|
private function obtenirAppareilModele() { |
$modele = isset($this->meta['EXIF']['CameraModelName']) ? $this->meta['EXIF']['CameraModelName']['valeur'] : ''; |
return $modele; |
} |
private function convertirMetaVersXML($type) { |
$xml = null; |
if (isset($this->meta[$type])) { |
$racine = strtolower($type); |
|
private function convertirMetaVersXML($type) { |
$xml = null; |
if (isset($this->meta[$type])) { |
$racine = strtolower($type); |
|
$xml = '<?xml version="1.0" encoding="UTF-8" ?>'."\n"; |
$xml .= "<$racine>"."\n"; |
foreach ($this->meta[$type] as $prop => &$valeur) { |
$xml .= '<'.$prop.' id="'.$valeur['id'].'">'.$valeur['valeur'].'</'.$prop.'>'."\n"; |
} |
$xml .= "</$racine>"; |
} |
return $xml; |
} |
} |
?> |
$xml = '<?xml version="1.0" encoding="UTF-8" ?>'."\n"; |
$xml .= "<$racine>"."\n"; |
foreach ($this->meta[$type] as $prop => &$valeur) { |
$xml .= '<'.$prop.' id="'.$valeur['id'].'">'.$valeur['valeur'].'</'.$prop.'>'."\n"; |
} |
$xml .= "</$racine>"; |
} |
return $xml; |
} |
} |