再、
露出が 1/640 の 1 枚の写真には、「ExposureTime」式の EXIF フィールドがあります。「15625/10000000」。一部の写真でこの値が読み取り可能な形式 (たとえば、「1/100」) で表示される理由はわかりませんが、この「15625」を「1/640」に変換する必要があります。どのように?:)
ありがとう。
それは単純な数学です: 分数の一番上と一番下を一番上の値で割ります。
15625 / 10000000
= (15625/15625) / (10000000/15625)
= 1 / 640
PHP では、次のように実行できます。
$exposure = "15625/10000000";
$parts = explode("/", $exposure);
$exposure = implode("/", array(1, $parts[1]/$parts[0]));
echo $exposure;
いくつかのサニティ チェックと特殊なケースを使用して、ZZ Coders の実装を改善しました。いくつかの特殊なケースがスローされた私の画像ではうまくいくようです。問題があればお知らせください。改善いたします。
// 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';
}
これは、露出を正規化するために使用するコードです。
if (($bottom % $top) == 0) {
$data = '1/'.round($bottom/$top, 0).' sec';
} else {
if ($bottom == 1) {
$data = $top.' sec';
} else {
$data = $top.'/'.$bottom.' sec';
}
}
ほとんどの露出を正しく処理しますが、たまに奇妙な露出が見られます。
ユークリッドのアルゴリズムを使用して最大公約数を見つけることができます。これは分数を減らすのに役立ちます。