编辑:已解决,我回答了下面的问题。
我使用以下内容获取PHAssets的元数据:
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
打印为4.321956769055745
的十进制值甚至不等于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 / 2,1 / 15和1/1919均使用您的公式正确计算。