我正在尝试使用最小值为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
但是请注意,如果您选择使用这种方法,则由于浮点数的精度有限,因此如果要在某些可比较的比较语句(
==
)中使用快门值,请务必小心。