В Android 15 появился режим автоматической экспозиции для съемки при слабом освещении. Он доступен как в Camera 2, так и в расширении камеры для ночного режима. Режим автоматической экспозиции "Усиление при слабом освещении" автоматически регулирует яркость потока предварительного просмотра в условиях низкой освещенности. Это отличается от того, как расширение камеры для ночного режима создает неподвижные изображения, поскольку ночной режим объединяет серию фотографий для создания одного улучшенного изображения. Ночной режим отлично подходит для создания неподвижных изображений, но не может создавать непрерывный поток кадров, в отличие от режима автоэкспозиции для слабого освещения. Таким образом, режим автоэкспозиции Low Light Boost позволяет использовать новые возможности камеры, например:
- Улучшенный предпросмотр изображений, чтобы пользователям было проще кадрировать снимки, сделанные при слабом освещении.
- Сканирование QR-кодов при слабом освещении.
Если вы включите режим автоматической экспозиции для слабого освещения, он будет автоматически включаться при низком уровне освещенности и выключаться при более высоком.
Приложения могут записывать видео из потока предварительного просмотра в условиях низкой освещенности, чтобы сохранить осветленное видео.
Режим автоэкспозиции для усиления слабого освещения можно использовать в Camera2 или через расширения камеры. В этом документе рассказывается, как использовать режим автоэкспозиции "Улучшение при слабом освещении" с Camera2. Вы также можете использовать режим автоэкспозиции Low Light Boost с расширением камеры "Ночной режим", если оно поддерживается устройством.
Проверить доступность
Прежде чем использовать режим автоэкспозиции Low Light Boost, убедитесь, что он поддерживается на устройстве.
Если режим Low Light Boost AE доступен, он будет указан в списке режимов экспозиции в camera2.CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES. (Усиление при слабом освещении – это отдельный режим автоэкспозиции, поскольку другие режимы несовместимы с осветлением изображения в режиме предварительного просмотра, которое выполняется в режиме автоэкспозиции с усилением при слабом освещении.)
Чтобы проверить, доступен ли режим автоэкспозиции для усиления при слабом освещении, вызовите CameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES) и посмотрите, есть ли среди возвращенных режимов ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY.
Kotlin
val characteristics = cameraManager.getCameraCharacteristics(cameraId) val autoExposureModes = characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES)!! val lowLightBoostSupported = autoExposureModes.contains( CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY) if (lowLightBoostSupported) { // Enable Low Light Boost AE Mode (next section) } else { // Proceed without Low Light Boost AE Mode }
Java
CameraCharacteristics characteristics = mCameraManager.getCameraCharacteristics(cameraId); int[] autoExposureModes = characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES); boolean lowLightBoostSupported = autoExposureModes.contains( CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY); if (lowLightBoostSupported) { // Enable Low Light Boost AE Mode (next section) } else { // Proceed without Low Light Boost AE Mode }
Включить режим автоэкспозиции для усиления света
Чтобы включить режим автоэкспозиции с усилением при слабом освещении в сеансе Camera2, задайте для параметра CaptureRequest.CONTROL_AE_MODE значение ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY. После этого вам нужно будет убедиться, что режим Low Light Boost AE включен. Для этого проверьте поле CaptureResult.CONTROL_AE_MODE. Это нужно проверить, поскольку усиление слабого освещения совместимо не со всеми конфигурациями камер. Например, при высокоскоростной записи не поддерживается режим автоэкспозиции с усилением при слабом освещении из-за ограничений по частоте кадров. Если режим автоэкспозиции Low Light Boost не включен, возможно, вам потребуется изменить конфигурацию камеры и повторить попытку.
Kotlin
val captureRequestBuilder = camera.createCaptureRequest( CameraDevice.TEMPLATE_PREVIEW) if (isLowLightBoostAvailable(cameraId)) { captureRequestBuilder.set( CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY ) } // other capture request params session.setRepeatingRequest( captureRequestBuilder.build(), object : CaptureCallback() { @Override fun onCaptureCompleted(session: CameraCaptureSession, request: CaptureRequest, result: TotalCaptureResult) { // verify Low Light Boost AE Mode AE mode set successfully result.get(CaptureResult.CONTROL_AE_MODE) == CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY } }, cameraHandler )
Java
CaptureRequest.Builder captureRequestBuilder = mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); if (isLowLightBoostAvailable(cameraId)) { captureRequestBuilder.set( CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY); } // other capture request params mSession.setRepeatingRequest( captureRequestBuilder.build(), new CaptureCallback() { @Override public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) { // verify Low Light Boost AE Mode AE mode set successfully result.get(CaptureResult.CONTROL_AE_MODE) == CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY; } }, mCameraHandler );
Режим автоэкспозиции при усилении при слабом освещении
Режим автоэкспозиции Low Light Boost делает изображение в окне предварительного просмотра ярче в условиях низкой освещенности и не влияет на него, если света достаточно для обычной съемки. Чтобы узнать, включен ли режим автоэкспозиции Low Light Boost, проверьте поле CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE.
Если вы включили режим автоматической экспозиции для слабого освещения и он сейчас активен, в поле будет указано CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE.
Затем вы можете показать значок луны или другой индикатор того, что предварительный просмотр становится ярче.
Kotlin
session.setRepeatingRequest( captureRequestBuilder.build(), object : CaptureCallback() { @Override fun onCaptureCompleted(session: CameraCaptureSession, request: CaptureRequest, result: TotalCaptureResult) { // check if Low Light Boost AE Mode is active or inactive if (result.get(CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE) == CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE) { // Low Light Boost AE Mode state is active // Show Moon Icon } else { // Low Light Boost AE Mode state is inactive or AE mode is not set // to Low Light Boost AE Mode // Hide Moon Icon } } }, cameraHandler )
Java
mSession.setRepeatingRequest( captureRequestBuilder.build(), new CaptureCallback() { @Override public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) { // check if Low Light Boost AE Mode is active or inactive if (result.get(CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE) == CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE) { // Low Light Boost AE Mode state is active // Show Moon Icon } else { // Low Light Boost AE Mode state is inactive or AE mode is not set // to Low Light Boost AE Mode // Hide Moon Icon } } }, mCameraHandler );