Метаданные изображения iOS, как получить десятичные значения в виде дробной строки? - PullRequest
0 голосов
/ 05 апреля 2019

РЕДАКТИРОВАТЬ: Решено, я ответил на вопрос ниже.

Я использую следующее для получения метаданных для 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.

1 Ответ

0 голосов
/ 05 апреля 2019

Разрешено.

Согласно

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 были все правильнорассчитывается по вашей формуле.

...