将FNumber(光圈)显示为数字而不是分数

时间:2019-01-07 作者:Gratzo

我是一个新手,甚至尝试使用PHP,但我认为可能有一个简单的解决方案。EXIF曝光数据仅显示“s”,因此一定有错误。

我还想用普通f-stop将FNumber显示为“Aperture”,例如“f2.8”,但它显示的是分数28/10。是否有PHP代码可以直接插入到模板文件中进行转换?在Wordpress图像中。php中,有简化分数的代码,但这些值并没有通过文件传递,而是直接在模板文件中修改。这肯定有问题。。。

<dt>EXIF data:</dt>
<dd><ul>
<?php foreach ($exif as $key => $value): 
    if (($key != "Width") && ($key != "Height") && ($key !="DateTime")): ?><li><strong><?php
        if ($key == "model") { 
            echo "Camera"; 
        } elseif ($key == "ExposureTime") { 
            echo "Exposure"; 
            $newvalue = explode("(", $value);
            $newvalue = substr($newvalue[2], 0, -1)."s";
        } elseif ($key == "FNumber") { 
            echo "Aperture"; 
        } else { 
            echo $key; 
        } ?></strong>: <?php if (!$newvalue) { echo $value; } else { echo $newvalue; $newvalue = \'\'; } ?></li>
    <?php endif; 
endforeach; ?>
</ul></dd></dl>
以下是var\\u导出($exif)信息:

array (
  \'Model\' => \'Canon EOS 30D\',
  \'DateTime\' => \'2006:12:23 08:35:02\',
  \'ExposureTime\' => \'1/100\',
  \'FNumber\' => \'28/10\',
  \'ExposureProgram\' => 3,
  \'ISOSpeedRatings\' => 200,
  \'ExifVersion\' => \'0221\',
  \'ApertureValue\' => \'194698/65536\',
  \'ExposureBiasValue\' => \'-1/3\',
  \'MeteringMode\' => 5,
  \'FocalLength\' => \'70/1\',
)

2 个回复
最合适的回答,由SO网友:Justin Waulters 整理而成

假设这样做是适当的,您可以将代码更改为:

<dt>EXIF data:</dt>
<dd><ul>
<?php foreach ($exif as $key => $value): 
    if (($key != "Width") && ($key != "Height") && ($key !="DateTime")): ?><li><strong><?php
        if ($key == "model") { 
            echo "Camera"; 
        } elseif ($key == "ExposureTime") { 
            echo "Exposure"; 
            //$newvalue = explode("(", $value);
            //$newvalue = substr($newvalue[2], 0, -1)."s";
              $newvalue = $value . "s"; // see note 1
        } elseif ($key == "FNumber") {
            echo "Aperture";
            $fraction_parts = explode("/", $value);
            $newvalue = $fraction_parts[0] / $fraction_parts[1] // see note 2
        } else { 
            echo $key; 
        } ?></strong>: <?php if (!$newvalue) { echo $value; } else { echo $newvalue; $newvalue = \'\'; } ?></li>
    <?php endif; 
endforeach; ?>
</ul></dd></dl>
我没有测试它,所以请让我知道如果它不工作,我会修复它。

Note 1它只输出快门速度的“s”,因为expode试图根据( 但没有( 在字符串中。所以,当substr() 函数正在查看newvalue[2] 什么都没有得到。此外,您可能从PHP收到一条警告,指出数组键不存在(您可以在PHP日志中检查它)。

由于您提供的转储中的数据看起来已经很好了,所以我只是在其后面加了“s”。

Note 2为了得到分数的十进制值,我将其分解为“/”,它构成了一个数组,分子作为第一个值,分母作为第二个值。然后,自$newvalue 设置为打印(而不是$value) 如果存在,我设置$newvalue 分子除以分母的结果。

我希望这有帮助。

干杯

Edit 1要使其显示为“sec”而不是“s”,只需更改代码显示的位置. "s" 要说. "sec". 然后,要让它在焦距前显示“f/”,您可以添加"f/" . 之前fraction_parts[0]. 请注意期间(.) 用于连接字符串。

Edit 2关于下面评论中发布的其他请求,这是您如何编辑来自$exif 阵列:

<dt>EXIF data:</dt>
<dd><ul>
<?php foreach ($exif as $key => $value): 
    if (($key != "Width") && ($key != "Height") && ($key !="DateTime")): ?><li><strong><?php
        if ($key == "model") { 
            echo "Camera"; 
        } elseif ($key == "ExposureTime") { 
            echo "Exposure"; 
            //$newvalue = explode("(", $value);
            //$newvalue = substr($newvalue[2], 0, -1)."s";
              $newvalue = $value . "s"; // see note 1
        } elseif ($key == "FNumber") {
            echo "Aperture";
            $fraction_parts = explode("/", $value);
            $newvalue = $fraction_parts[0] / $fraction_parts[1] // see note 2
        } elseif ($key == "ExposureProgram") { // see note 3
            echo "Exposure Program";
            $value_definitions = array(
                \'2\' => "Auto",
                \'3\' => "Aperture Priority",
                \'4\' => "Shutter Priority"
            );
            if( array_key_exists( $value, $value_definitions ) ) {
                $newvalue = $value_definitions[$value];
            }
        } else { 
            echo $key; 
        } ?></strong>: <?php if (!$newvalue) { echo $value; } else { echo $newvalue; $newvalue = \'\'; } ?></li>
    <?php endif; 
endforeach; ?>
</ul></dd></dl>
Note 3这是一个与其他条件一样有效的条件。它设置$newvalue 用于替换$value 变量然而,这只会设置$newvalue 如果$value$value_definitions 大堆如果$value 匹配$value_definitions 大堆$newvalue 将设置为分配给匹配键的值。

SO网友:Junnel Gallemaso

虽然可以使用eval()直接计算FNumber,但我不建议使用eval()函数。

在您的情况下,28/10等于2.8,然后只需附加f 在上面。您可以检查该函数,该函数解析该值,然后返回在开头连接了f的值。

function getfStop($fstop){

if(preg_match(\'/(\\d+)(?:\\s*)([\\+\\-\\*\\/])(?:\\s*)(\\d+)/\', $fstop, $val) !== FALSE){
    $operator = $val[2];

    switch($operator){
        case \'+\':
            $p = $val[1] + $val[3];
            break;
        case \'-\':
            $p = $val[1] - $val[3];
            break;
        case \'*\':
            $p = $val[1] * $val[3];
            break;
        case \'/\':
            $p = $val[1] / $val[3];
            break;
    }

    return \'f\'.$p;
   }
}
要使用此函数,只需传递FNumber的值,例如。getfStop(THE_VALUE_OF_FNumber); 我相信这应该行得通。

希望这有帮助!