编辑:已解决,我回答了以下问题。
我正在使用以下方法获取PHAsset的元数据:
let data = NSData.init(contentsOf: url!)!
if let imageSource = CGImageSourceCreateWithData(data, nil) {
let metadata = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil)! as NSDictionary
}
元数据字典具有我要查找的所有值。但是,某些带有分数的字段,例如ShutterSpeedValue
,ExposureTime
会以小数形式显示:
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。
答案 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。