我正在尝试使用最小值为0且最大值为1的UISlider来控制相机的曝光,其最小快门速度为1/2秒,最大快门速度为1/8192。

这是用户将看到的快门值列表:
[2, 4, 8, 12, 16, 30, 40, 50, 64, 96, 128, 192, 240, 384, 480, 768, 1024, 1536, 2048, 4096, 8192](均为秒。)

问题是,这些值不能线性映射。曝光差异与1/4096至1/8192相同,为1/2至1/4。如果线性映射,则0.5大约等于4094,因此快门差值的一个步骤将占据滑块的一半。

我正在寻找指数地映射值。 0.5应该大致等于128,.25应该等于16,.75应该等于6000。

最佳答案

func getShutterValue(sliderValue: Double) -> Int {
    return Int(pow(2,Double(1+Int(sliderValue*12))))
}

print(getShutterValue(0))      // 2
print(getShutterValue(0.25))   // 16
print(getShutterValue(0.4992)) // 64
print(getShutterValue(0.5))    // 128
print(getShutterValue(0.75))   // 1024
print(getShutterValue(1))      // 8192




如以下注释中所述:如果要以连续范围[2.0,8192.0]返回快门值,则可以使用以下修改的getShutterValue(..)函数:

func getShutterValue(sliderValue: Double) -> Double {
    return pow(2, 1+sliderValue*12)
}

print(getShutterValue(0))      // 2.0
print(getShutterValue(0.25))   // 16.0
print(getShutterValue(0.33))   // 31.12....
print(getShutterValue(0.4992)) // 127.15....
print(getShutterValue(0.5))    // 128.0
print(getShutterValue(0.75))   // 1024.0
print(getShutterValue(1))      // 8192.0


但是请注意,如果您选择使用这种方法,则由于浮点数的精度有限,因此如果要在某些可比较的比较语句(==)中使用快门值,请务必小心。

09-20 09:13