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



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

我正在使用以下内容来获取 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)"
}

正如您注意到的,打印为 4.321956769055745ShutterSpeedValue十进制值甚至不等于 1/20。

已解决。

根据

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 都使用您的公式正确计算。

最新更新