123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- <?php
- /**
- * PHP Exif Native Reader Adapter
- *
- * @link http://github.com/miljar/PHPExif for the canonical source repository
- * @copyright Copyright (c) 2013 Tom Van Herreweghe <tom@theanalogguy.be>
- * @license http://github.com/miljar/PHPExif/blob/master/LICENSE MIT License
- * @category PHPExif
- * @package Reader
- */
- namespace PHPExif\Adapter;
- use PHPExif\Exif;
- /**
- * PHP Exif Native Reader Adapter
- *
- * Uses native PHP functionality to read data from a file
- *
- * @category PHPExif
- * @package Reader
- */
- class Native extends AdapterAbstract
- {
- const INCLUDE_THUMBNAIL = true;
- const NO_THUMBNAIL = false;
- const SECTIONS_AS_ARRAYS = true;
- const SECTIONS_FLAT = false;
- const SECTION_FILE = 'FILE';
- const SECTION_COMPUTED = 'COMPUTED';
- const SECTION_IFD0 = 'IFD0';
- const SECTION_THUMBNAIL = 'THUMBNAIL';
- const SECTION_COMMENT = 'COMMENT';
- const SECTION_EXIF = 'EXIF';
- const SECTION_ALL = 'ANY_TAG';
- const SECTION_IPTC = 'IPTC';
- /**
- * List of EXIF sections
- *
- * @var array
- */
- protected $requiredSections = array();
- /**
- * Include the thumbnail in the EXIF data?
- *
- * @var boolean
- */
- protected $includeThumbnail = self::NO_THUMBNAIL;
- /**
- * Parse the sections as arrays?
- *
- * @var boolean
- */
- protected $sectionsAsArrays = self::SECTIONS_FLAT;
- /**
- * @var string
- */
- protected $mapperClass = '\\PHPExif\\Mapper\\Native';
- /**
- * Contains the mapping of names to IPTC field numbers
- *
- * @var array
- */
- protected $iptcMapping = array(
- 'title' => '2#005',
- 'keywords' => '2#025',
- 'copyright' => '2#116',
- 'caption' => '2#120',
- 'headline' => '2#105',
- 'credit' => '2#110',
- 'source' => '2#115',
- 'jobtitle' => '2#085'
- );
- /**
- * Getter for the EXIF sections
- *
- * @return array
- */
- public function getRequiredSections()
- {
- return $this->requiredSections;
- }
- /**
- * Setter for the EXIF sections
- *
- * @param array $sections List of EXIF sections
- * @return \PHPExif\Adapter\Native Current instance for chaining
- */
- public function setRequiredSections(array $sections)
- {
- $this->requiredSections = $sections;
- return $this;
- }
- /**
- * Adds an EXIF section to the list
- *
- * @param string $section
- * @return \PHPExif\Adapter\Native Current instance for chaining
- */
- public function addRequiredSection($section)
- {
- if (!in_array($section, $this->requiredSections)) {
- array_push($this->requiredSections, $section);
- }
- return $this;
- }
- /**
- * Define if the thumbnail should be included into the EXIF data or not
- *
- * @param boolean $value
- * @return \PHPExif\Adapter\Native Current instance for chaining
- */
- public function setIncludeThumbnail($value)
- {
- $this->includeThumbnail = $value;
- return $this;
- }
- /**
- * Returns if the thumbnail should be included into the EXIF data or not
- *
- * @return boolean
- */
- public function getIncludeThumbnail()
- {
- return $this->includeThumbnail;
- }
- /**
- * Define if the sections should be parsed as arrays
- *
- * @param boolean $value
- * @return \PHPExif\Adapter\Native Current instance for chaining
- */
- public function setSectionsAsArrays($value)
- {
- $this->sectionsAsArrays = (bool) $value;
- return $this;
- }
- /**
- * Returns if the sections should be parsed as arrays
- *
- * @return boolean
- */
- public function getSectionsAsArrays()
- {
- return $this->sectionsAsArrays;
- }
- /**
- * Reads & parses the EXIF data from given file
- *
- * @param string $file
- * @return \PHPExif\Exif|boolean Instance of Exif object with data
- */
- public function getExifFromFile($file)
- {
- $sections = $this->getRequiredSections();
- $sections = implode(',', $sections);
- $sections = (empty($sections)) ? null : $sections;
- $data = @exif_read_data(
- $file,
- $sections,
- $this->getSectionsAsArrays(),
- $this->getIncludeThumbnail()
- );
- if (false === $data) {
- return false;
- }
- $xmpData = $this->getIptcData($file);
- $data = array_merge($data, array(self::SECTION_IPTC => $xmpData));
- // map the data:
- $mapper = $this->getMapper();
- $mappedData = $mapper->mapRawData($data);
- // hydrate a new Exif object
- $exif = new Exif();
- $hydrator = $this->getHydrator();
- $hydrator->hydrate($exif, $mappedData);
- $exif->setRawData($data);
- return $exif;
- }
- /**
- * Returns an array of IPTC data
- *
- * @param string $file The file to read the IPTC data from
- * @return array
- */
- public function getIptcData($file)
- {
- getimagesize($file, $info);
- $arrData = array();
- if (isset($info['APP13'])) {
- $iptc = iptcparse($info['APP13']);
- foreach ($this->iptcMapping as $name => $field) {
- if (!isset($iptc[$field])) {
- continue;
- }
- if (count($iptc[$field]) === 1) {
- $arrData[$name] = reset($iptc[$field]);
- } else {
- $arrData[$name] = $iptc[$field];
- }
- }
- }
- return $arrData;
- }
- }
|