การเพิ่มแสงในสภาวะแสงน้อย

Android 15 เปิดตัวการเพิ่มแสงน้อย ซึ่งเป็นโหมดการรับแสงอัตโนมัติแบบใหม่ที่มีให้ใช้งาน ทั้งกล้อง 2 และส่วนขยายกล้องในโหมดกลางคืน การเพิ่มแสงในสภาวะแสงน้อย ปรับความสว่างของสตรีมตัวอย่างในสภาวะแสงน้อยโดยอัตโนมัติ ซึ่งแตกต่างจากวิธีที่ส่วนขยายกล้องโหมดกลางคืนสร้าง เพราะโหมดกลางคืนจะรวมภาพถ่ายอัจฉริยะเข้าด้วยกันเพื่อสร้างเป็นภาพถ่ายเดี่ยว รูปภาพที่ปรับปรุงคุณภาพแล้ว แม้โหมดกลางคืนจะได้ผลดีมากสำหรับการสร้างภาพนิ่ง ไม่สามารถสร้างสตรีมเฟรมอย่างต่อเนื่อง แต่การเพิ่มแสงน้อยได้ ดังนั้น การเพิ่มแสงน้อยช่วยให้กล้องมีความสามารถใหม่ๆ ดังตัวอย่างต่อไปนี้

  • ให้การแสดงตัวอย่างรูปภาพที่ปรับปรุงแล้ว เพื่อให้ผู้ใช้สามารถจัดเฟรมภาพได้ดีขึ้น ภาพในสภาวะแสงน้อย
  • กำลังสแกนคิวอาร์โค้ดในที่ที่มีแสงน้อย

หากคุณเปิดใช้การเพิ่มในสภาวะแสงน้อย จะเป็นการเปิดโดยอัตโนมัติเมื่อโหมดแสงน้อย ระดับแสง และจะปิดเมื่อมีแสงสว่างมากขึ้น

แอปสามารถบันทึกสตรีมตัวอย่างในสภาพแสงน้อยเพื่อบันทึก เป็นวิดีโอที่สว่างขึ้น

คุณสามารถใช้การเพิ่มในสภาวะแสงน้อยได้ในกล้อง 2 หรือผ่าน ส่วนขยายกล้อง เอกสารนี้ครอบคลุมถึงวิธีใช้การเพิ่มแสงน้อยด้วย Camera2 คุณยังสามารถใช้ การเพิ่มแสงน้อยโดยใช้ส่วนขยายกล้องในโหมดกลางคืนหากระบบรองรับ อุปกรณ์

ตรวจสอบห้องว่าง

ก่อนใช้การเพิ่มแสงน้อย ให้ตรวจสอบว่าระบบรองรับฟีเจอร์นี้ในอุปกรณ์ หากเป็น โหมดแสงน้อยคือโหมดการรับแสงอย่างหนึ่งที่แสดงอยู่ใน 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 (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
}

เปิดการเพิ่มแสงน้อย

หากต้องการเปิดใช้การเพิ่มในสภาวะแสงน้อยในเซสชัน Camera2 ให้ตั้งค่า CaptureRequest.CONTROL_AE_MODE ถึง ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY หลังจากนั้น คุณจะต้อง ตรวจสอบว่าได้เปิดการเพิ่มแสงน้อยแล้ว คุณสามารถทำได้โดยทำเครื่องหมายที่ CaptureResult.CONTROL_AE_MODE คุณต้องตรวจสอบเนื่องจากแสงน้อย Boost ใช้ไม่ได้กับการกำหนดค่ากล้องบางอย่าง เช่น ความเร็วสูง การบันทึกไม่รองรับการเพิ่มสภาวะแสงน้อย เนื่องจากการพิจารณา FPS ถ้า ไม่ได้เปิดฟีเจอร์ลดแสงน้อย คุณอาจต้องเปลี่ยนกล้อง การกำหนดค่าแล้วลองอีกครั้ง

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

ตรวจสอบการเพิ่มในสภาวะแสงน้อย

การเพิ่มแสงในสภาวะแสงน้อยจะเพิ่มความสว่างให้กับสตรีมตัวอย่างในสภาพแสงน้อย และ ไม่ส่งผลใดๆ หากสภาพแวดล้อมนั้นสว่างเพียงพอสำหรับเวลาปกติ การจับภาพ คุณสามารถตรวจสอบว่ากำลังเพิ่มระดับแสงน้อยอยู่หรือไม่ได้โดยตรวจสอบ ช่อง 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 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
);