コード例 #1
0
 public function testDecimalToFraction()
 {
     $result = convertToFraction($this->test_decimal);
     $this->assertInternalType('integer', $result['numerator']);
     $this->assertInternalType('integer', $result['denominator']);
     $this->assertEquals(3, $result['numerator']);
     $this->assertEquals(40, $result['denominator']);
 }
コード例 #2
0
ファイル: exif.php プロジェクト: ariep/ZenPhoto20-DEV
function formatExposure($data)
{
    if (strpos($data, '/') === false) {
        if ($data >= 1) {
            return round($data, 2) . ' ' . '!sec!';
        } else {
            return convertToFraction($data) . ' !sec!';
        }
    } else {
        return '!bulb!';
    }
}
コード例 #3
0
ファイル: xmpMetadata.php プロジェクト: ariep/ZenPhoto20-DEV
 /**
  * Filter for handling image objects
  *
  * @param object $image
  * @return object
  */
 static function new_image($image)
 {
     $source = '';
     $metadata_path = '';
     $files = safe_glob(substr($image->localpath, 0, strrpos($image->localpath, '.')) . '.*');
     if (count($files) > 0) {
         foreach ($files as $file) {
             if (strtolower(getSuffix($file)) == XMP_EXTENSION) {
                 $metadata_path = $file;
                 break;
             }
         }
     }
     if (!empty($metadata_path)) {
         $source = self::extractXMP(file_get_contents($metadata_path));
     } else {
         if (getOption('xmpMetadata_examine_images_' . strtolower(substr(strrchr($image->localpath, "."), 1)))) {
             $f = file_get_contents($image->localpath);
             $l = filesize($image->localpath);
             $abort = 0;
             $i = 0;
             while ($i < $l && $abort < 200 && !$source) {
                 $tag = bin2hex(substr($f, $i, 2));
                 $size = hexdec(bin2hex(substr($f, $i + 2, 2)));
                 switch ($tag) {
                     case 'ffe1':
                         // EXIF
                     // EXIF
                     case 'ffe2':
                         // EXIF extension
                     // EXIF extension
                     case 'fffe':
                         // COM
                     // COM
                     case 'ffe0':
                         // IPTC marker
                         $source = self::extractXMP($f);
                         $i = $i + $size + 2;
                         $abort = 0;
                         break;
                     default:
                         if ($f[$i] == '<') {
                             $source = self::extractXMP($f);
                         }
                         $i = $i + 1;
                         $abort++;
                         break;
                 }
             }
         }
     }
     // direct import to ZenPhoto20 fields with no processing required
     $import = array('location' => 'XMPSubLocation', 'city' => 'XMPCity', 'city' => 'XMPCity', 'state' => 'XMPState', 'country' => 'XMPLocationName', 'copyright' => 'XMPCopyright', 'rotation' => 'XMPOrientation');
     if (!empty($source)) {
         $metadata = self::extract($source);
         if (count($metadata > 0)) {
             $exifVars = self::getMetadataFields();
             foreach ($metadata as $field => $element) {
                 if (!array_key_exists($field, $exifVars) || $exifVars[$field][5]) {
                     $image->set('hasMetadata', 1);
                     $v = self::to_string($element);
                     if (($key = array_search($field, $import)) !== false) {
                         $image->set($key, $v);
                     } else {
                         switch ($field) {
                             case 'XMPSource':
                                 if (!isset($metadata['XMPImageCredit'])) {
                                     $this->set('credit', $v);
                                 }
                                 break;
                             case 'XMPImageCredit':
                                 $this->set('credit', $v);
                                 break;
                             case 'XMPImageHeadline':
                                 if (getoption('transform_newlines')) {
                                     $v = nl2br($v);
                                 }
                                 $image->setTitle($v);
                                 break;
                             case 'XMPImageCaption':
                                 if (getoption('transform_newlines')) {
                                     $v = nl2br(v);
                                 }
                                 $image->setDesc($v);
                                 break;
                             case 'XMPDateTimeOriginal':
                                 $image->setDateTime($element);
                                 break;
                             case 'XMPExposureTime':
                                 $v = formatExposure(self::rationalNum($element));
                                 break;
                             case 'XMPFocalLength':
                                 $v = self::rationalNum($element) . ' mm';
                                 break;
                             case 'XMPAperatureValue':
                             case 'XMPFNumber':
                                 $v = 'f/' . self::rationalNum($element);
                                 break;
                             case 'XMPExposureBiasValue':
                             case 'XMPGPSAltitude':
                                 $v = self::rationalNum($element);
                                 break;
                             case 'XMPGPSLatitude':
                             case 'XMPGPSLongitude':
                                 $n = explode(',', substr($element, 0, -1));
                                 $r = $n[0] + $n[1] / 60;
                                 $ref = strtoupper(substr($element, -1, 1));
                                 $v = Image::toDMS($r, $ref);
                                 if (in_array($ref, array('S', 'W'))) {
                                     $r = -$r;
                                 }
                                 $r = (double) $r;
                                 $image->set(substr($field, 3), $r);
                                 break;
                             case 'XMPLensInfo':
                                 preg_match_all('~(\\d+/\\d+)~', $v, $matches);
                                 if (isset($matches[1]) && !empty($matches[1])) {
                                     $lens = array();
                                     foreach ($matches[1] as $i => $f) {
                                         $term = explode('/', $f);
                                         if ($term[0] != 0 && $term[1] != 0) {
                                             $lens[$i] = convertToFraction($term[0] / $term[1]);
                                         } else {
                                             $lens[$i] = 0;
                                         }
                                     }
                                     if ($lens[0] == $lens[1]) {
                                         $v = sprintf('%0.0fmm', $lens[0]);
                                     } else {
                                         $v = sprintf('%0.0f-%0.0fmm', $lens[0], $lens[1]);
                                     }
                                     if ($lens[2] == $lens[3]) {
                                         if ($lens[2] != 0) {
                                             $v .= sprintf(' f/%0.1f', $lens[2]);
                                         }
                                     } else {
                                         $v .= sprintf(' f/%0.1f-%0.1f', $lens[3], $lens[2]);
                                     }
                                 }
                                 break;
                             case 'rating':
                                 $v = min(getoption('rating_stars_count'), $v) * min(1, getOption('rating_split_stars'));
                                 $image->set('total_value', $v);
                                 $image->set('total_votes', 1);
                                 break;
                             case 'XMPKeywords':
                                 if (!is_array($element)) {
                                     $element = explode(',', $element);
                                 }
                                 $element = array_unique(array_merge($image->getTags(), $element));
                                 $image->setTags($element);
                                 break;
                         }
                     }
                     $image->set($field, $v);
                 }
             }
             $image->save();
         }
     }
     return $image;
 }