Subversion Repositories eFlore/Applications.cel

Rev

Rev 2459 | Rev 3534 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2459 Rev 2460
Line 1... Line 1...
1
<?php
1
<?php
-
 
2
// declare(encoding='UTF-8');
2
/**
3
/**
3
 * Classe d'extraction de metadonnées afin de les mettre dans
4
 * Classe d'extraction de metadonnées d'un fichier JPEG afin de les mettre dans un tableau au format du CEL.
4
 * un tableau au format du cel
-
 
5
 * Encodage en entrée : utf8
-
 
6
 * Encodage en sortie : utf8
-
 
7
 *
5
 *
-
 
6
 * @internal   Mininum PHP version : 5.2
-
 
7
 * @category   CEL
-
 
8
 * @package    Services
-
 
9
 * @subpackage Bibliothèques
-
 
10
 * @version    0.1
8
 * @author Aurélien PERONNET <aurelien@tela-botanica.org>
11
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
9
 * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
12
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
-
 
13
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
10
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
14
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
11
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
15
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
12
 * @version $Id$
-
 
13
 * @copyright © 2012, Tela Botanica
16
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
14
 */
17
 */
15
class ExtracteurMetadonnees {
18
class ExtracteurMetadonnees {
Line 16... Line 19...
16
 
19
 
17
	private $meta = array();
20
	private $meta = array();
Line 494... Line 497...
494
		$cle_id_valeur = array('cle' => $id_cle[1], 'id' => str_replace('-','',$id_cle[0]), 'valeur' => $valeur);
497
		$cle_id_valeur = array('cle' => $id_cle[1], 'id' => str_replace('-','',$id_cle[0]), 'valeur' => $valeur);
495
		return $cle_id_valeur;
498
		return $cle_id_valeur;
496
	}
499
	}
Line 497... Line 500...
497
 
500
 
498
	public function decoderMetadonneesBasique($chemin_fichier) {
501
	public function decoderMetadonneesBasique($chemin_fichier) {
Line 499... Line 502...
499
    	$exif = @exif_read_data($chemin_fichier, "EXIF,COMPUTED,IFD0,FILE,COMMENT", true, false);
502
		$exif = @exif_read_data($chemin_fichier, "EXIF,COMPUTED,IFD0,FILE,COMMENT", true, false);
500
 
503
 
501
        // tant pis pour les makernote et xmp, les décoder demande trop de librairies externes, autant installer exiftool alors
504
		// tant pis pour les makernote et xmp, les décoder demande trop de librairies externes, autant installer exiftool alors
502
        $metadonnees = array();
505
		$metadonnees = array();
503
		$metadonnees['XMP'] = array();
506
		$metadonnees['XMP'] = array();
504
		unset($metadonnees['EXIF']['MakerNote']);
507
		unset($metadonnees['EXIF']['MakerNote']);
505
		$metadonnees['MAKERNOTE'] = array();
508
		$metadonnees['MAKERNOTE'] = array();
Line 509... Line 512...
509
		}
512
		}
510
		if(isset($exif['IFD0'])) {
513
		if(isset($exif['IFD0'])) {
511
			$metadonnees_non_formatees = array_merge($metadonnees_non_formatees, $exif['IFD0']);
514
			$metadonnees_non_formatees = array_merge($metadonnees_non_formatees, $exif['IFD0']);
512
		}
515
		}
513
		$metadonnees['EXIF'] = $this->formaterTableauExif($metadonnees_non_formatees);
516
		$metadonnees['EXIF'] = $this->formaterTableauExif($metadonnees_non_formatees);
514
        $metadonnees['IPTC'] = $this->extraireIptc($chemin_fichier);
517
		$metadonnees['IPTC'] = $this->extraireIptc($chemin_fichier);
515
        $metadonnees['File'] = array(
518
		$metadonnees['File'] = array(
516
        	'ImageWidth' => array('id' => '', 'valeur' => $exif['COMPUTED']['Width']),
519
			'ImageWidth' => array('id' => '', 'valeur' => $exif['COMPUTED']['Width']),
517
			'ImageHeight' => array('id' => '', 'valeur' => $exif['COMPUTED']['Height']));
520
			'ImageHeight' => array('id' => '', 'valeur' => $exif['COMPUTED']['Height']));
518
        return $metadonnees ;
521
		return $metadonnees ;
-
 
522
	}
-
 
523
 
-
 
524
	private function formaterTableauExif(&$tableau) {
-
 
525
		$tableau_exif_formate = array();
-
 
526
 
-
 
527
		foreach ($tableau as $nom_tag => $valeur) {
-
 
528
			$id = '';
-
 
529
			if (isset($this->tableau_ids_tags_exif[$nom_tag])) {
-
 
530
				$id = $this->tableau_ids_tags_exif[$nom_tag];
519
    }
531
			}
-
 
532
			$tableau_exif_formate[$nom_tag] = array('id' => $id, 'valeur' => $valeur);
-
 
533
		}
-
 
534
 
-
 
535
		return $tableau_exif_formate;
-
 
536
	}
Line -... Line 537...
-
 
537
 
-
 
538
	/**
-
 
539
	 * Extraction des metadonnées iptc
520
 
540
	 */
-
 
541
	public function extraireIptc($chemin_fichier) {
-
 
542
		$meta = array();
-
 
543
 
521
    private function formaterTableauExif(&$tableau) {
544
		// getimagesize renvoie les infos iptc dans le tableau info
-
 
545
		$info = array();
-
 
546
		$size = getimagesize($chemin_fichier, $info);
-
 
547
 
-
 
548
		// s'il existe
-
 
549
		if (isset($info['APP13'])) {
-
 
550
			// on parse les donnees
-
 
551
			$iptc = iptcparse($info['APP13']);
-
 
552
			if ($iptc) {
-
 
553
				// et on les analyse
-
 
554
				foreach ($iptc as $marker => $section) {
-
 
555
					foreach ($section as $nom => $val) {
-
 
556
						// pour remplir le tableau de donnees
-
 
557
						$this->decoderValeurIptc($marker, $val, $meta);
-
 
558
					}
-
 
559
				}
-
 
560
			}
-
 
561
		}
-
 
562
		return $meta;
-
 
563
	}
-
 
564
 
-
 
565
	/**
-
 
566
	* Stocke une valeur de metadonnées iptc dans le champ du tableau correspondant
-
 
567
	* @param String $nom nom de la valeur
-
 
568
	* @param String $val valeur
-
 
569
	* @param String $data référence vers le tableau où la donnée sera stockée
-
 
570
	**/
-
 
571
	private function decoderValeurIptc($nom, $val, &$data_tab) {
-
 
572
		switch ($nom) {
-
 
573
			case "2#005" :// mots cles iptc
-
 
574
				$data_tab['Category'] = array('id' => '5', 'valeur' => $val);
-
 
575
				break;
-
 
576
			case "2#080" :// champ by line
-
 
577
				$data_tab['By-Line']  = array('id' => '80', 'valeur' => $val);
-
 
578
				break ;
-
 
579
			case "2#085" :// champ by line titre
-
 
580
				$data_tab['By-LineTitle'] = array('id' => '85', 'valeur' => $val);
-
 
581
				break ;
-
 
582
			case "2#090" :// ville
-
 
583
				$data_tab['City'] = array('id' => '90', 'valeur' => $val);
-
 
584
				break ;
-
 
585
			case "2#092" :// sous location
-
 
586
				$data_tab['SubLocation'] = array('id' => '92', 'valeur' => $val);
-
 
587
				break ;
-
 
588
			case "2#095" :// etat (pour les us)
-
 
589
				$data_tab['ProvinceState'] = array('id' => '95', 'valeur' => $val);
-
 
590
				break ;
-
 
591
			case "2#100" :// code pays
-
 
592
				$data_tab['CountryPrimaryLocationCode'] = array('id' => '100', 'valeur' => $val);
-
 
593
				break ;
-
 
594
			case "2#101" :// code pays
-
 
595
				$data_tab['CountryName'] = array('id' => '101', 'valeur' => $val);
-
 
596
				break ;
-
 
597
			case "2#105" :// titre principal
-
 
598
				$data_tab['Headline'] = array('id' => '105', 'valeur' => $val);
-
 
599
				break ;
-
 
600
			case "2#110" :// credit
-
 
601
				$data_tab['Credit'] = array('id' => '110', 'valeur' => $val);
-
 
602
				break ;
-
 
603
			case "2#116" :// copyright
-
 
604
				$data_tab['CopyrightNotice'] = array('id' => '116', 'valeur' => $val);
-
 
605
				break ;
-
 
606
			case "2#118" :// contact
-
 
607
				$data_tab['Contact'] = array('id' => '118', 'valeur' => $val);
-
 
608
				break ;
-
 
609
			default:
-
 
610
				unset($data_tab['nom']);
-
 
611
		}
Line 522... Line -...
522
    	$tableau_exif_formate = array();
-
 
523
 
-
 
524
    	foreach ($tableau as $nom_tag => $valeur) {
-
 
525
    		$id = '';
-
 
526
    		if (isset($this->tableau_ids_tags_exif[$nom_tag])) {
-
 
527
    			$id = $this->tableau_ids_tags_exif[$nom_tag];
-
 
528
    		}
-
 
529
    		$tableau_exif_formate[$nom_tag] = array('id' => $id, 'valeur' => $valeur);
-
 
530
    	}
-
 
531
 
-
 
532
    	return $tableau_exif_formate;
-
 
533
    }
-
 
534
 
-
 
535
    /**
-
 
536
    * Extraction des metadonnées iptc
-
 
537
    **/
-
 
538
    public function extraireIptc($chemin_fichier) {
-
 
539
    	$meta = array();
-
 
540
 
-
 
541
        // getimagesize renvoie les infos iptc dans le tableau info
-
 
542
        $info = array();
-
 
543
        $size = getimagesize($chemin_fichier, $info);
-
 
544
 
-
 
545
        // s'il existe
-
 
546
        if (isset($info["APP13"])) {
-
 
547
            // on parse les donnees
-
 
548
            $iptc = iptcparse($info["APP13"]);
-
 
549
            if ($iptc) {
-
 
550
                // et on les analyse
-
 
551
                foreach ($iptc as $marker => $section) {
-
 
552
                    foreach ($section as $nom => $val) {
-
 
553
                        // pour remplir le tableau de donnees
-
 
554
                        $this->decoderValeurIptc($marker, $val, $meta);
-
 
555
                    }
-
 
556
                }
-
 
557
            }
-
 
558
        }
-
 
559
 
-
 
560
        return $meta;
-
 
561
    }
-
 
562
 
-
 
563
    /**
-
 
564
    * Stocke une valeur de metadonnées iptc dans le champ du tableau correspondant
-
 
565
    * @param String $nom nom de la valeur
-
 
566
    * @param String $val valeur
-
 
567
    * @param String $data référence vers le tableau où la donnée sera stockée
-
 
568
    **/
-
 
569
    private function decoderValeurIptc($nom, $val, &$data_tab) {
-
 
570
        switch ($nom) {
-
 
571
            case "2#005" :// mots cles iptc
-
 
572
                $data_tab['Category'] = array('id' => '5', 'valeur' => $val);
-
 
573
            	break;
-
 
574
            case "2#080" :// champ by line
-
 
575
                $data_tab['By-Line']  = array('id' => '80', 'valeur' => $val);
-
 
576
            	break ;
-
 
577
            case "2#085" :// champ by line titre
-
 
578
                $data_tab['By-LineTitle'] = array('id' => '85', 'valeur' => $val);
-
 
579
            	break ;
-
 
580
            case "2#090" :// ville
-
 
581
                $data_tab['City'] = array('id' => '90', 'valeur' => $val);
-
 
582
            	break ;
-
 
583
            case "2#092" :// sous location
-
 
584
                $data_tab['SubLocation'] = array('id' => '92', 'valeur' => $val);
-
 
585
            	break ;
-
 
586
            case "2#095" :// etat (pour les us)
-
 
587
                $data_tab['ProvinceState'] = array('id' => '95', 'valeur' => $val);
-
 
588
            	break ;
-
 
589
            case "2#100" :// code pays
-
 
590
                $data_tab['CountryPrimaryLocationCode'] = array('id' => '100', 'valeur' => $val);
-
 
591
            	break ;
-
 
592
            case "2#101" :// code pays
-
 
593
                $data_tab['CountryName'] = array('id' => '101', 'valeur' => $val);
-
 
594
            	break ;
-
 
595
            case "2#105" :// titre principal
-
 
596
                $data_tab['Headline'] = array('id' => '105', 'valeur' => $val);
-
 
597
            	break ;
-
 
598
            case "2#110" :// credit
-
 
599
                $data_tab['Credit'] = array('id' => '110', 'valeur' => $val);
-
 
600
            	break ;
-
 
601
            case "2#116" :// copyright
-
 
602
                $data_tab['CopyrightNotice'] = array('id' => '116', 'valeur' => $val);
-
 
603
            	break ;
-
 
604
            case "2#118" :// contact
-
 
605
                $data_tab['Contact'] = array('id' => '118', 'valeur' => $val);
-
 
606
            	break ;
-
 
607
            default:
-
 
608
            	unset($data_tab['nom']);
-
 
609
        }
-
 
610
    }
-
 
611
 
-
 
612
    private function obtenirHauteur() {
-
 
613
    	$hauteur = isset($this->meta['File']['ImageHeight']) ? $this->meta['File']['ImageHeight']['valeur'] : '';
-
 
614
    	return $hauteur;
-
 
615
    }
-
 
616
 
-
 
617
    private function obtenirLargeur() {
-
 
618
    	$largeur = isset($this->meta['File']['ImageWidth']) ? $this->meta['File']['ImageWidth']['valeur'] : '';
-
 
619
    	return $largeur;
-
 
620
    }
-
 
621
 
-
 
622
    private function obtenirDatePriseDeVue() {
-
 
623
    	$date = isset($this->meta['EXIF']['DateTimeOriginal']) ? $this->meta['EXIF']['DateTimeOriginal']['valeur'] : '';
-
 
624
    	return $date;
-
 
625
    }
-
 
626
 
-
 
627
    private function obtenirAppareilFabricant() {
-
 
628
    	$fabriquant = isset($this->meta['EXIF']['Make']) ? $this->meta['EXIF']['Make']['valeur'] : '';
-
 
629
    	return $fabriquant;
-
 
630
    }
-
 
631
 
-
 
632
    private function obtenirAppareilModele() {
-
 
633
    	$modele = isset($this->meta['EXIF']['CameraModelName']) ? $this->meta['EXIF']['CameraModelName']['valeur'] : '';
-
 
634
    	return $modele;
-
 
635
    }
-
 
636
 
-
 
637
    private function convertirMetaVersXML($type) {
-
 
638
    	$xml = null;
-
 
639
    	if (isset($this->meta[$type])) {
-
 
640
    		$racine = strtolower($type);
-
 
641
 
-
 
642
    		$xml = '<?xml version="1.0" encoding="UTF-8" ?>'."\n";
-
 
643
    		$xml .= "<$racine>"."\n";
-
 
644
    		foreach ($this->meta[$type] as $prop => &$valeur) {
-
 
645
    			$xml .= '<'.$prop.' id="'.$valeur['id'].'">'.$valeur['valeur'].'</'.$prop.'>'."\n";
-
 
646
    		}
-
 
647
    		$xml .= "</$racine>";
-
 
648
    	}
-
 
649
    	return $xml;
-
 
650
    }
-
 
651
}
612
	}
-
 
613
 
-
 
614
	private function obtenirHauteur() {
-
 
615
		$hauteur = isset($this->meta['File']['ImageHeight']) ? $this->meta['File']['ImageHeight']['valeur'] : '';
-
 
616
		return $hauteur;
-
 
617
	}
-
 
618
 
-
 
619
	private function obtenirLargeur() {
-
 
620
		$largeur = isset($this->meta['File']['ImageWidth']) ? $this->meta['File']['ImageWidth']['valeur'] : '';
-
 
621
		return $largeur;
-
 
622
	}
-
 
623
 
-
 
624
	private function obtenirDatePriseDeVue() {
-
 
625
		$date = isset($this->meta['EXIF']['DateTimeOriginal']) ? $this->meta['EXIF']['DateTimeOriginal']['valeur'] : '';
-
 
626
		return $date;
-
 
627
	}
-
 
628
 
-
 
629
	private function obtenirAppareilFabricant() {
-
 
630
		$fabriquant = isset($this->meta['EXIF']['Make']) ? $this->meta['EXIF']['Make']['valeur'] : '';
-
 
631
		return $fabriquant;
-
 
632
	}
-
 
633
 
-
 
634
	private function obtenirAppareilModele() {
-
 
635
		$modele = isset($this->meta['EXIF']['CameraModelName']) ? $this->meta['EXIF']['CameraModelName']['valeur'] : '';
-
 
636
		return $modele;
-
 
637
	}
-
 
638
 
-
 
639
	private function convertirMetaVersXML($type) {
-
 
640
		$xml = null;
-
 
641
		if (isset($this->meta[$type])) {
-
 
642
			$racine = strtolower($type);
-
 
643
 
-
 
644
			$xml = '<?xml version="1.0" encoding="UTF-8" ?>'."\n";
-
 
645
			$xml .= "<$racine>"."\n";
-
 
646
			foreach ($this->meta[$type] as $prop => &$valeur) {
-
 
647
				$xml .= '<'.$prop.' id="'.$valeur['id'].'">'.$valeur['valeur'].'</'.$prop.'>'."\n";
-
 
648
			}
-
 
649
			$xml .= "</$racine>";
-
 
650
		}
-
 
651
		return $xml;
-
 
652
	}
652
?>
653
}