iOS图像元数据如何获取十进制值作为分数字符串?

时间:2019-04-05 03:47:24

标签: ios metadata photo exif

编辑:已解决,我回答了以下问题。

我正在使用以下方法获取PHAsset的元数据:

let data = NSData.init(contentsOf: url!)!
if let imageSource = CGImageSourceCreateWithData(data, nil) { 
    let metadata = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil)! as NSDictionary
}

元数据字典具有我要查找的所有值。但是,某些带有分数的字段,例如ShutterSpeedValueExposureTime会以小数形式显示:

ExposureTime = "0.05"
ShutterSpeedValue = "4.321956769055745"

当我在Mac的预览应用程序和exiftool上查看此数据时,它显示:

ExposureTime = 1/20
ShutterSpeedValue = 1/20

如何获取正确的分数字符串而不是十进制字符串?

编辑:我尝试使用SO代码中的代码简单地将小数转换为分数字符串,但这是不正确的:

func rationalApproximation(of x0 : Double, withPrecision eps : Double = 1.0E-6) -> String {
    var x = x0
    var a = x.rounded(.down)
    var (h1, k1, h, k) = (1, 0, Int(a), 1)

    while x - a > eps * Double(k) * Double(k) {
        x = 1.0/(x - a)
        a = x.rounded(.down)
        (h1, k1, h, k) = (h, k, h1 + Int(a) * h, k1 + Int(a) * k)
    }
    return "\(h)/\(k)"
}

您注意到,打印为ShutterSpeedValue的{​​{1}}的十进制值甚至不等于1/20。

1 个答案:

答案 0 :(得分:0)

已解决。

按照

https://www.dpreview.com/forums/post/54376235

ShutterSpeedValue is defined as APEX value, where:
ShutterSpeed = -log2(ExposureTime)

所以-log2(1/20)是4.3219,就像我观察到的那样。

因此,为了获得ShutterSpeedValue,我使用以下代码:

"1/\(ceil(pow(2, Double(4.321956769055745))))"

我测试了3张不同的照片,并使用您的公式正确计算了1 / 20、1 / 15和1/1919。