Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解析EXIF';s";“曝光时间”;使用PHP_Php_Exif - Fatal编程技术网

解析EXIF';s";“曝光时间”;使用PHP

解析EXIF';s";“曝光时间”;使用PHP,php,exif,Php,Exif,关于, 一张曝光率为1/640的照片的EXIF字段为“曝光时间”,等于“15625/10000000”。我不确定为什么有些照片以可读格式显示此值(例如,“1/100”),但我需要将此“15625”转换回“1/640”。怎么做?:) 谢谢 这是一个简单的数学:只需将分数的顶部和底部除以顶部值即可 15625 / 10000000 = (15625/15625) / (10000000/15625) = 1 / 640 在PHP中,您可以这样做: $exposure = "15625/1000

关于,

一张曝光率为1/640的照片的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;

这是一个简单的数学:简单地将分数的顶部和底部除以顶部的值

  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;

这是我用来规范曝光的代码

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

它可以正确处理大多数曝光,但我偶尔会看到一些奇怪的。这是我用来规范曝光的代码

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

它可以正确地处理大多数曝光,但我偶尔会看到一些奇怪的。你可以使用欧几里德算法找到最大公约数,这将帮助你减少分数。

你可以使用欧几里德算法找到最大公约数,这将帮助您降低分数。

我通过一些健全性检查和特殊情况改进了ZZ编码器的实现。它似乎与我的图像配合得很好,有几个特殊的例子。请让我知道,如果有任何问题,我们会改进它

// 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';
}
//曝光时间
$exif=exif\u读取数据($fullPath,'IFD0',true);
$arexposuretime=爆炸('/',$exif['exif']['ExposureTime']);
//零分母的健全性检查。
如果($arexposuretime[1]==0){
$ExposureTime='1/?秒';
//如果分子为零。
}elseif($arexposuretime[0]==0){
$ExposureTime='0/'。$arexposureTime[1]。'sec';
//分母为1时,以整秒、分钟和/或小时显示时间。
}elseif($ArreExposureTime[1]==1){
//在秒范围内。
如果($arexposuretime[0]<60){
$ExposureTime=$arexposureTime[0]。's';
//在分钟范围内。
}elseif($arexposuretime[0]>=60)&($arexposuretime[0]<3600)){
$ExposureTime=gmdate(“i\m:s\s,$arexposuretime[0]);
//在小时范围内。
}否则{
$ExposureTime=gmdate(“H\H:i\m:s\s,$arexposuretime[0]);
}
//当“反转”是均匀可除的时,显示减少的分数曝光。
}elseif(($ArreExposureTime[1]]/$ArreExposureTime[0])==0){
$ExposureTime='1/'。$arexposureTime[1]/$arexposureTime[0]。'sec';
//如果该值大于或等于3/10,哪一个是最小标准
//曝光值不均匀,以十进制形式显示。
}elseif($ArreExposureTime[0]/$ArreExposureTime[1])>=3/10){
$ExposureTime=四舍五入($ArreExposureTime[0]/$ArreExposureTime[1]),1.“秒”;
//如果所有其他操作都失败,只需按找到的方式显示即可。
}否则{
$ExposureTime='.$ArreExposureTime[0]./.$ArreExposureTime[1].'sec';
}

我改进了ZZ编码器的实现,只进行了一些健全性检查和特殊情况。它似乎与我的图像配合得很好,有几个特殊的例子。请让我知道,如果有任何问题,我们会改进它

// 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';
}
//曝光时间
$exif=exif\u读取数据($fullPath,'IFD0',true);
$arexposuretime=爆炸('/',$exif['exif']['ExposureTime']);
//零分母的健全性检查。
如果($arexposuretime[1]==0){
$ExposureTime='1/?秒';
//如果分子为零。
}elseif($arexposuretime[0]==0){
$ExposureTime='0/'。$arexposureTime[1]。'sec';
//分母为1时,以整秒、分钟和/或小时显示时间。
}elseif($ArreExposureTime[1]==1){
//在秒范围内。
如果($arexposuretime[0]<60){
$ExposureTime=$arexposureTime[0]。's';
//在分钟范围内。
}elseif($arexposuretime[0]>=60)&($arexposuretime[0]<3600)){
$ExposureTime=gmdate(“i\m:s\s,$arexposuretime[0]);
//在小时范围内。
}否则{
$ExposureTime=gmdate(“H\H:i\m:s\s,$arexposuretime[0]);
}
//当“反转”是均匀可除的时,显示减少的分数曝光。
}elseif(($ArreExposureTime[1]]/$ArreExposureTime[0])==0){
$ExposureTime='1/'。$arexposureTime[1]/$arexposureTime[0]。'sec';
//如果该值大于或等于3/10,哪一个是最小标准
//曝光值不均匀,以十进制形式显示。
}elseif($ArreExposureTime[0]/$ArreExposureTime[1])>=3/10){
$ExposureTime=四舍五入($ArreExposureTime[0]/$ArreExposureTime[1]),1.“秒”;
//如果所有其他操作都失败,只需按找到的方式显示即可。
}否则{
$ExposureTime='.$ArreExposureTime[0]./.$ArreExposureTime[1].'sec';
}

只要顶部不为0,不为不完美分数,也不为减少时分子非1的分数。其他方面agree@ircmaxell:是的,它也假设它是数字的,但是我假设你已经进行了错误检查。问题是,你不能总是相信写这些文件的人会把正确的东西放在那里:)谢谢,这正是我想要的。只要顶部永远不是0,也不是不完美的分数,也不是减少时有非1分子的分数。其他方面agree@ircmaxell:是的,它也假设它是数字的,但是我假设你已经进行了错误检查。问题是,你不能总是相信写文件的人会把正确的东西放进去:)谢谢,这正是我想要的。