Усиление при слабом освещении

В Android 15 представлен Low Light Boost — новый режим автоматической экспозиции, доступный как для Камеры 2 , так и для расширения камеры для ночного режима . Low Light Boost автоматически регулирует яркость потока предварительного просмотра в условиях низкой освещенности. Это отличается от того, как расширение камеры для ночного режима создает неподвижные изображения, поскольку ночной режим объединяет серию фотографий для создания единого улучшенного изображения. Хотя ночной режим очень хорошо работает для создания неподвижного изображения, он не может создавать непрерывный поток кадров, а режим Low Light Boost может. Таким образом, Low Light Boost открывает новые возможности камеры, например:

  • Обеспечивает улучшенный предварительный просмотр изображения, чтобы пользователи могли лучше кадрировать свои снимки при слабом освещении.
  • Сканирование QR-кодов при слабом освещении.

Если вы включите усиление при слабом освещении, оно автоматически включается при низком уровне освещенности и выключается, когда света становится больше.

Приложения могут записывать поток предварительного просмотра в условиях низкой освещенности, чтобы сохранить более яркое видео.

Вы можете использовать функцию Low Light Boost либо в Camera2 , либо через расширения камеры . В этом документе описано, как использовать функцию Low Light Boost с Camera2. Вы также можете использовать функцию Low Light Boost с расширением камеры «Ночной режим», если оно поддерживается устройством.

Проверить наличие

Прежде чем использовать Low Light Boost, убедитесь, что он поддерживается на устройстве. Если оно доступно, усиление при слабом освещении является одним из режимов экспозиции, перечисленных в camera2.CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES . (Усиление при слабом освещении — это собственная настройка автоматической экспозиции, поскольку другие настройки автоматической экспозиции несовместимы с увеличением яркости при предварительном просмотре, выполняемым при усилении при низком освещении.)

Итак, чтобы проверить, доступно ли усиление при слабом освещении, вызовите CameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES) и проверьте, включают ли возвращаемые режимы ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY :

Котлин

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 (next section)
} else {
  // Proceed without Low Light Boost
}

Джава

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 (next section)
} else {
  // Proceed without Low Light Boost
}

Включить усиление при слабом освещении

Чтобы включить усиление при слабом освещении в сеансе Camera2, установите для CaptureRequest.CONTROL_AE_MODE значение ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY . После этого вам необходимо будет подтвердить, что усиление при слабом освещении включено; вы можете сделать это, проверив поле CaptureResult.CONTROL_AE_MODE . Вам необходимо проверить, потому что Low Light Boost совместим не со всеми конфигурациями камер. Например, высокоскоростная запись не поддерживает Low Light Boost из соображений FPS. Если функция Low Light Boost не включена, возможно, вам придется изменить конфигурацию камеры и повторить попытку.

Котлин

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 set successfully
      result.get(CaptureResult.CONTROL_AE_MODE) ==
          CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY
    }
  },
  cameraHandler
)

Джава

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 set successfully
      result.get(CaptureResult.CONTROL_AE_MODE) ==
          CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY;
    }
  },
  mCameraHandler
);

Монитор с усилением при слабом освещении

Low Light Boost делает поток предварительного просмотра ярче в условиях низкой освещенности и не оказывает никакого эффекта, если окружающая среда уже достаточно яркая для нормальной съемки. Вы можете проверить, активно ли усиление при слабом освещении в данный момент, проверив поле CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE . Если вы включили усиление при слабом освещении и оно в данный момент активно, для поля установлено значение CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE . Затем вы можете отобразить значок луны или какой-либо другой признак того, что предварительный просмотр стал ярче.

Котлин

session.setRepeatingRequest(
  captureRequestBuilder.build(),
  object : CaptureCallback() {
    @Override
    fun onCaptureCompleted(session: CameraCaptureSession,
        request: CaptureRequest, result: TotalCaptureResult) {
      // check if Low Light Boost is active or inactive
      if (result.get(CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE) ==
        CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE) {
        // Low Light Boost state is active
        // Show Moon Icon
      } else {
        // Low Light Boost state is inactive or AE mode is not set
        // to Low Light Boost
        // Hide Moon Icon
      }
    }
  },
  cameraHandler
)

Джава

mSession.setRepeatingRequest(
  captureRequestBuilder.build(),
  new CaptureCallback() {
    @Override
    public void onCaptureCompleted(CameraCaptureSession session,
        CaptureRequest request, TotalCaptureResult result) {
      // check if Low Light Boost is active or inactive
      if (result.get(CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE) ==
        CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE) {
        // Low Light Boost state is active
        // Show Moon Icon
      } else {
        // Low Light Boost state is inactive or AE mode is not set
        // to Low Light Boost
        // Hide Moon Icon
      }
    }
  },
  mCameraHandler
);