2010-06-16 12 views
1

Re,Parsing "ExposureTime" de EXIF ​​en PHP

Une photo avec une exposition étant 1/640 a le champ EXIF ​​de l'équation "ExposureTime". "15625/10000000". Je ne suis pas sûr pourquoi certaines photos affichent cette valeur dans un format lisible (par exemple, "1/100"), mais j'ai besoin de convertir ce "15625" en "1/640". Comment? :)

Merci.

Répondre

3

C'est simple mathématique: il suffit de diviser le haut et le bas de la fraction par la valeur supérieure.

15625/10000000 
= (15625/15625)/(10000000/15625) 
= 1/640 

En PHP, vous pouvez le faire comme ceci:

$exposure = "15625/10000000"; 
$parts = explode("/", $exposure); 
$exposure = implode("/", array(1, $parts[1]/$parts[0])); 

echo $exposure; 
+0

Tant que le sommet n'est jamais 0, ni une fraction imparfaite ni une fraction qui a un numérateur non-1 lorsqu'il est réduit. Autre sage d'accord – ircmaxell

+0

@ircmaxell: Bon, c'est aussi supposer que c'est numérique et tout ça, mais je suppose que vous auriez une erreur de vérification en place. Le problème est, vous ne pouvez pas toujours croire que tout ce qui a écrit les fichiers met la bonne chose là-dedans :) –

+0

Merci, exactement ce que je cherchais. – MarkL

0

Voici le code que j'utilise pour normaliser l'exposition,

    if (($bottom % $top) == 0) { 
          $data = '1/'.round($bottom/$top, 0).' sec'; 
        }  else { 
          if ($bottom == 1) { 
            $data = $top.' sec'; 
          } else { 
            $data = $top.'/'.$bottom.' sec'; 
          } 
        } 

Il gère la plupart des expositions correctement mais je vois quelques uns bizarres une fois de temps en temps.

+0

Merci, je vais l'utiliser. – MarkL

0

Vous pouvez utiliser l'algorithme d'Euclid pour trouver le plus grand commun diviseur, ce qui vous aidera à réduire la fraction.

2

J'ai amélioré la mise en œuvre de ZZ Coders avec quelques vérifications d'intégrité et des cas spéciaux. Il semble bien fonctionner avec mes images avec plusieurs cas spéciaux lancés. S'il vous plaît laissez-moi savoir s'il y a des problèmes et nous allons l'améliorer.

// Exposure Time 
$exif = exif_read_data($fullPath, 'IFD0', true); 
$arrExposureTime = explode('/', $exif['EXIF']['ExposureTime']); 
// Sanity check for zero denominator. 
if ($arrExposureTime[1] == 0) { 
    $ExposureTime = '<sup>1</sup>/? sec'; 
// In case numerator is zero. 
} elseif ($arrExposureTime[0] == 0) { 
    $ExposureTime = '<sup>0</sup>/' . $arrExposureTime[1] . ' sec'; 
// When denominator is 1, display time in whole seconds, minutes, and/or hours. 
} elseif ($arrExposureTime[1] == 1) { 
    // In the Seconds range. 
    if ($arrExposureTime[0] < 60) { 
     $ExposureTime = $arrExposureTime[0] . ' s'; 
    // In the Minutes range. 
    } elseif (($arrExposureTime[0] >= 60) && ($arrExposureTime[0] < 3600)) { 
     $ExposureTime = gmdate("i\m:s\s", $arrExposureTime[0]); 
    // In the Hours range. 
    } else { 
     $ExposureTime = gmdate("H\h:i\m:s\s", $arrExposureTime[0]); 
    } 
// When inverse is evenly divisable, show reduced fractional exposure. 
} elseif (($arrExposureTime[1] % $arrExposureTime[0]) == 0) { 
    $ExposureTime = '<sup>1</sup>/' . $arrExposureTime[1]/$arrExposureTime[0] . ' sec'; 
// If the value is greater or equal to 3/10, which is the smallest standard 
// exposure value that doesn't divid evenly, show it in decimal form. 
} elseif (($arrExposureTime[0]/$arrExposureTime[1]) >= 3/10) { 
    $ExposureTime = round(($arrExposureTime[0]/$arrExposureTime[1]), 1) . ' sec'; 
// If all else fails, just display it as it was found. 
} else { 
    $ExposureTime = '<sup>' . $arrExposureTime[0] . '</sup>/' . $arrExposureTime[1] . ' sec'; 
} 
+0

Vous vous demandez pourquoi ce n'est pas la réponse acceptée. –