Wzmocnienie słabego oświetlenia

Android 15 wprowadza Mocne światło – nowy tryb automatycznej ekspozycji dostępny zarówno w Aparacie 2, jak i w rozszerzeniu do aparatu w trybie nocnym. Funkcja słabego oświetlenia automatycznie reguluje jasność strumienia podglądu przy słabym oświetleniu. Różni się to od sposobu, w jaki rozszerzenie do aparatu w trybie nocnym tworzy obrazy nieruchome, ponieważ tryb nocny łączy serię zdjęć w jedno ulepszone zdjęcie. Tryb nocny sprawdza się bardzo dobrze przy nagrywaniu nieruchomych obrazów, ale nie umożliwia tworzenia ciągłego strumienia klatek, ale funkcja słabego oświetlenia jest dostępna. Funkcja słabego oświetlenia pozwala korzystać z nowych funkcji aparatu, takich jak:

  • Funkcja ulepszonego podglądu obrazu, dzięki której użytkownicy mogą lepiej wykadrować zdjęcia w słabym oświetleniu.
  • Skanuję kody QR przy słabym oświetleniu.

Jeśli włączysz funkcję słabego oświetlenia, będzie się ona automatycznie włączać przy słabym oświetleniu i wyłączać, gdy jest więcej światła.

Aplikacje mogą nagrywać filmy w trybie „Podgląd” przy słabym oświetleniu.

Ulepszonego oświetlenia możesz używać w aplikacji Camera2 lub za pomocą rozszerzeń kamery. Z tego dokumentu dowiesz się, jak korzystać z funkcji słabego oświetlenia w aplikacji Aparat 2. Z funkcji słabego oświetlenia możesz też korzystać z rozszerzeniem aparatu w trybie nocnym, jeśli jest ono obsługiwane przez urządzenie.

Sprawdź dostępność

Zanim zaczniesz korzystać z funkcji słabego oświetlenia, sprawdź, czy urządzenie ją obsługuje. Jeśli jest dostępna, wzmacnianie słabego oświetlenia jest jednym z trybów ekspozycji wymienionych w artykule camera2.CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES. (Wzmocnienie słabego oświetlenia to własne ustawienie automatycznej ekspozycji, ponieważ inne ustawienia automatycznej ekspozycji są niezgodne z rozjaśnieniem w podglądzie za pomocą funkcji Low Light Boost).

Aby sprawdzić, czy funkcja słabego oświetlenia jest dostępna, wywołaj metodę CameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES) i sprawdź, czy zwracane tryby obejmują 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 (next section)
} else {
  // Proceed without Low Light Boost
}

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

Włącz wzmacnianie słabego oświetlenia

Aby włączyć wzmocnienie słabego oświetlenia w sesji Aparatu 2, ustaw w polu CaptureRequest.CONTROL_AE_MODE wartość ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY. Następnie musisz sprawdzić, czy funkcja słabego oświetlenia została włączona. Aby to zrobić, sprawdź pole CaptureResult.CONTROL_AE_MODE. Musisz to sprawdzić, ponieważ funkcja Wzmocnienie słabego oświetlenia nie jest zgodna ze wszystkimi konfiguracjami kamer. Na przykład szybkie nagrywanie nie obsługuje funkcji słabego oświetlenia z powodu liczby klatek na sekundę. Jeśli funkcja Ulepszona jasność nie jest włączona, być może musisz zmienić konfigurację kamery i spróbować jeszcze raz.

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

Monitorowanie słabego oświetlenia

Funkcja słabego oświetlenia rozjaśnia podgląd strumienia przy słabym oświetleniu i nie ma żadnego efektu, jeśli otoczenie jest już wystarczająco jasne, by można było robić zdjęcia. Aby sprawdzić, czy funkcja słabego oświetlenia jest obecnie aktywna, sprawdź pole CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE. Jeśli ta funkcja jest włączona i jest obecnie aktywna, pole ma wartość CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE. Może to być ikona księżyca lub inny rodzaj rozjaśniania podglądu.

Kotlin

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
)

Java

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
);