setExposureOffset method
Sets the exposure offset for the selected camera.
The supplied offset
value should be in EV units. 1 EV unit represents a
doubling in brightness. It should be between the minimum and maximum offsets
obtained through getMinExposureOffset
and getMaxExposureOffset
respectively.
Throws a CameraException
when an illegal offset is supplied.
When the supplied offset
value does not align with the step size obtained
through getExposureStepSize
, it will automatically be rounded to the nearest step.
Returns the (rounded) offset value that was set.
Implementation
Future<double> setExposureOffset(double offset) async {
_throwIfNotInitialized('setExposureOffset');
// Check if offset is in range
final List<double> range = await Future.wait(
<Future<double>>[getMinExposureOffset(), getMaxExposureOffset()]);
if (offset < range[0] || offset > range[1]) {
throw CameraException(
'exposureOffsetOutOfBounds',
'The provided exposure offset was outside the supported range for this device.',
);
}
// Round to the closest step if needed
final double stepSize = await getExposureOffsetStepSize();
if (stepSize > 0) {
final double inv = 1.0 / stepSize;
double roundedOffset = (offset * inv).roundToDouble() / inv;
if (roundedOffset > range[1]) {
roundedOffset = (offset * inv).floorToDouble() / inv;
} else if (roundedOffset < range[0]) {
roundedOffset = (offset * inv).ceilToDouble() / inv;
}
offset = roundedOffset;
}
try {
return CameraPlatform.instance.setExposureOffset(_cameraId, offset);
} on PlatformException catch (e) {
throw CameraException(e.code, e.message);
}
}