iOS Image Metadata如何将十进制值作为分数字符串?

问题描述 投票:0回答:1

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

我使用以下内容获取PHAssets的元数据:

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打印为4.321956769055745的十进制值甚至不等于1/20。

ios metadata photo exif
1个回答
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 / 2,1 / 15和1/1919均使用您的公式正确计算。

© www.soinside.com 2019 - 2024. All rights reserved.