示例#1
0
 /**
  * 
  * 
  * @param string $ps_source
  * @param array $pa_options
  * @return bool
  */
 public function read($ps_source, $pa_options = null)
 {
     $vs_path_to_exif_tool = caGetExternalApplicationPath("exiftool");
     $this->opn_current_row = -1;
     $this->opa_row_buf = caMakeArrayKeysLowercase(caExtractMetadataWithExifTool($ps_source));
     if (!is_array($this->opa_row_buf)) {
         return false;
     }
     return true;
 }
示例#2
0
 private function _gmagickRead($ps_filepath)
 {
     try {
         $handle = new Gmagick($ps_filepath);
         $this->setResourceLimits($handle);
         $handle->setimageindex(0);
         // force use of first image in multi-page TIFF
         $this->handle = $handle;
         $this->filepath = $ps_filepath;
         $this->metadata = array();
         // handle metadata
         /* EXIF */
         if (function_exists('exif_read_data') && !$this->opo_config->get('dont_use_exif_read_data')) {
             if (is_array($va_exif = caSanitizeArray(@exif_read_data($ps_filepath, 'EXIF', true, false)))) {
                 $va_metadata['EXIF'] = $va_exif;
             }
         }
         // if the builtin EXIF extraction is not used or failed for some reason, try ExifTool
         if (!isset($va_metadata['EXIF']) || !is_array($va_metadata['EXIF'])) {
             if (caExifToolInstalled()) {
                 $va_metadata['EXIF'] = caExtractMetadataWithExifTool($ps_filepath, true);
             }
         }
         // Rotate incoming image as needed
         if (isset($va_metadata['EXIF']['IFD0']['Orientation'])) {
             $vn_orientation = $va_metadata['EXIF']['IFD0']['Orientation'];
             $vs_tmp_basename = tempnam(caGetTempDirPath(), 'ca_image_tmp');
             $vb_is_rotated = false;
             switch ($vn_orientation) {
                 case 3:
                     $this->handle->rotateimage("#FFFFFF", 180);
                     unset($va_metadata['EXIF']['IFD0']['Orientation']);
                     $vb_is_rotated = true;
                     break;
                 case 6:
                     $this->handle->rotateimage("#FFFFFF", 90);
                     unset($va_metadata['EXIF']['IFD0']['Orientation']);
                     $vb_is_rotated = true;
                     break;
                 case 8:
                     $this->handle->rotateimage("#FFFFFF", -90);
                     unset($va_metadata['EXIF']['IFD0']['Orientation']);
                     $vb_is_rotated = true;
                     break;
             }
             if ($vb_is_rotated) {
                 if ($this->handle->writeimage($vs_tmp_basename)) {
                     $va_tmp = $this->handle->getimagegeometry();
                     $this->properties["faces"] = $this->opa_faces = caDetectFaces($vs_tmp_basename, $va_tmp['width'], $va_tmp['height']);
                 }
                 @unlink($vs_tmp_basename);
             }
         }
         // get XMP
         $o_xmp = new XMPParser();
         if ($o_xmp->parse($ps_filepath)) {
             if (is_array($va_xmp_metadata = $o_xmp->getMetadata()) && sizeof($va_xmp_metadata)) {
                 $va_metadata['XMP'] = array();
                 foreach ($va_xmp_metadata as $vs_xmp_tag => $va_xmp_values) {
                     $va_metadata['XMP'][$vs_xmp_tag] = join('; ', $va_xmp_values);
                 }
             }
         }
         // try to get IPTC and DPX with GraphicsMagick, if available
         if (caMediaPluginGraphicsMagickInstalled()) {
             /* IPTC metadata */
             $vs_iptc_file = tempnam(caGetTempDirPath(), 'gmiptc');
             @rename($vs_iptc_file, $vs_iptc_file . '.iptc');
             // GM uses the file extension to figure out what we want
             $vs_iptc_file .= '.iptc';
             exec($this->ops_graphicsmagick_path . " convert " . caEscapeShellArg($ps_filepath) . " " . caEscapeShellArg($vs_iptc_file) . (caIsPOSIX() ? " 2> /dev/null" : ""), $va_output, $vn_return);
             $vs_iptc_data = file_get_contents($vs_iptc_file);
             @unlink($vs_iptc_file);
             $va_iptc_raw = iptcparse($vs_iptc_data);
             $va_iptc_tags = array('2#004' => 'Genre', '2#005' => 'DocumentTitle', '2#010' => 'Urgency', '2#015' => 'Category', '2#020' => 'Subcategories', '2#025' => 'Keywords', '2#040' => 'SpecialInstructions', '2#055' => 'CreationDate', '2#060' => 'TimeCreated', '2#080' => 'AuthorByline', '2#085' => 'AuthorTitle', '2#090' => 'City', '2#095' => 'State', '2#100' => 'CountryCode', '2#101' => 'Country', '2#103' => 'OTR', '2#105' => 'Headline', '2#110' => 'Credit', '2#115' => 'PhotoSource', '2#116' => 'Copyright', '2#120' => 'Caption', '2#122' => 'CaptionWriter');
             $va_iptc = array();
             if (is_array($va_iptc_raw)) {
                 foreach ($va_iptc_raw as $vs_iptc_tag => $va_iptc_tag_data) {
                     if (isset($va_iptc_tags[$vs_iptc_tag])) {
                         $va_iptc[$va_iptc_tags[$vs_iptc_tag]] = join('; ', $va_iptc_tag_data);
                     }
                 }
             }
             if (sizeof($va_iptc)) {
                 $va_metadata['IPTC'] = $va_iptc;
             }
             /* DPX metadata */
             exec($this->ops_graphicsmagick_path . " identify -format '%[DPX:*]' " . caEscapeShellArg($ps_filepath) . (caIsPOSIX() ? " 2> /dev/null" : ""), $va_output, $vn_return);
             if ($va_output[0]) {
                 $va_metadata['DPX'] = $va_output;
             }
         }
         $this->metadata = $va_metadata;
         return $handle;
     } catch (Exception $e) {
         $this->postError(1610, _t("Could not read image file"), "WLPlugGmagick->read()");
         return false;
         // gmagick couldn't read file, presumably
     }
 }
示例#3
0
 private function _graphicsMagickGetMetadata($ps_filepath)
 {
     $va_metadata = array();
     /* EXIF metadata */
     if (function_exists('exif_read_data') && !$this->opo_config->get('dont_use_exif_read_data')) {
         if (is_array($va_exif = caSanitizeArray(@exif_read_data($ps_filepath, 'EXIF', true, false)))) {
             $va_metadata['EXIF'] = $va_exif;
         }
     }
     // if the builtin EXIF extraction is not used or failed for some reason, try ExifTool
     if (!isset($va_metadata['EXIF']) || !is_array($va_metadata['EXIF'])) {
         if (caExifToolInstalled()) {
             $va_metadata['EXIF'] = caExtractMetadataWithExifTool($ps_filepath, true);
         }
     }
     // else try GraphicsMagick
     if (!isset($va_metadata['EXIF']) || !is_array($va_metadata['EXIF'])) {
         exec($this->ops_graphicsmagick_path . ' identify -format "%[EXIF:*]" ' . caEscapeShellArg($ps_filepath) . (caIsPOSIX() ? " 2> /dev/null" : ""), $va_output, $vn_return);
         if (is_array($va_output) && sizeof($va_output) > 1) {
             foreach ($va_output as $vs_output_line) {
                 $va_tmp = explode('=', $vs_output_line);
                 // format is "Make=NIKON CORPORATION"
                 if (isset($va_tmp[0]) && isset($va_tmp[1])) {
                     $va_metadata['EXIF'][$va_tmp[0]] = $va_tmp[1];
                 }
             }
         }
         $va_output = array();
     }
     $o_xmp = new XMPParser();
     if ($o_xmp->parse($ps_filepath)) {
         if (is_array($va_xmp_metadata = $o_xmp->getMetadata()) && sizeof($va_xmp_metadata)) {
             $va_metadata['XMP'] = array();
             foreach ($va_xmp_metadata as $vs_xmp_tag => $va_xmp_values) {
                 $va_metadata['XMP'][$vs_xmp_tag] = join('; ', $va_xmp_values);
             }
         }
     }
     /* IPTC metadata */
     $vs_iptc_file = tempnam(caGetTempDirPath(), 'gmiptc');
     @rename($vs_iptc_file, $vs_iptc_file . '.iptc');
     // GM uses the file extension to figure out what we want
     $vs_iptc_file .= '.iptc';
     exec($this->ops_graphicsmagick_path . " convert " . caEscapeShellArg($ps_filepath) . " " . caEscapeShellArg($vs_iptc_file) . (caIsPOSIX() ? " 2> /dev/null" : ""), $va_output, $vn_return);
     $vs_iptc_data = file_get_contents($vs_iptc_file);
     @unlink($vs_iptc_file);
     $va_iptc_raw = iptcparse($vs_iptc_data);
     $va_iptc_tags = array('2#004' => 'Genre', '2#005' => 'DocumentTitle', '2#010' => 'Urgency', '2#015' => 'Category', '2#020' => 'Subcategories', '2#025' => 'Keywords', '2#040' => 'SpecialInstructions', '2#055' => 'CreationDate', '2#060' => 'TimeCreated', '2#080' => 'AuthorByline', '2#085' => 'AuthorTitle', '2#090' => 'City', '2#095' => 'State', '2#100' => 'CountryCode', '2#101' => 'Country', '2#103' => 'OTR', '2#105' => 'Headline', '2#110' => 'Credit', '2#115' => 'PhotoSource', '2#116' => 'Copyright', '2#120' => 'Caption', '2#122' => 'CaptionWriter');
     $va_iptc = array();
     if (is_array($va_iptc_raw)) {
         foreach ($va_iptc_raw as $vs_iptc_tag => $va_iptc_tag_data) {
             if (isset($va_iptc_tags[$vs_iptc_tag])) {
                 $va_iptc[$va_iptc_tags[$vs_iptc_tag]] = join('; ', $va_iptc_tag_data);
             }
         }
     }
     if (sizeof($va_iptc)) {
         $va_metadata['IPTC'] = $va_iptc;
     }
     /* DPX metadata */
     exec($this->ops_graphicsmagick_path . " identify -format '%[DPX:*]' " . caEscapeShellArg($ps_filepath) . (caIsPOSIX() ? " 2> /dev/null" : ""), $va_output, $vn_return);
     if ($va_output[0]) {
         $va_metadata['DPX'] = $va_output;
     }
     return $va_metadata;
 }
示例#4
0
 private function _CoreImageGetMetadata($ps_filepath)
 {
     if (caMediaPluginCoreImageInstalled($this->ops_CoreImage_path)) {
         $va_metadata = array();
         if (function_exists('exif_read_data') && !$this->opo_config->get('dont_use_exif_read_data')) {
             if (is_array($va_exif = caSanitizeArray(@exif_read_data($ps_filepath, 'EXIF', true, false)))) {
                 $va_metadata['EXIF'] = $va_exif;
             }
         }
         // if the builtin EXIF extraction is not used or failed for some reason, try ExifTool
         if (!isset($va_metadata['EXIF']) || !is_array($va_metadata['EXIF'])) {
             if (caExifToolInstalled()) {
                 $va_metadata['EXIF'] = caExtractMetadataWithExifTool($ps_filepath, true);
             }
         }
         $o_xmp = new XMPParser();
         if ($o_xmp->parse($ps_filepath)) {
             if (is_array($va_xmp_metadata = $o_xmp->getMetadata()) && sizeof($va_xmp_metadata)) {
                 $va_metadata['XMP'] = $va_xmp_metadata;
             }
         }
         return $va_metadata;
     }
     return null;
 }