การจับภาพ

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

ผู้ดำเนินการที่ปรับแต่งได้ที่ ImageCapture จะเรียกใช้มี 2 ประเภท ได้แก่ ผู้ดำเนินการ Callback และผู้ดำเนินการ IO

  • ตัวดำเนินการ Callback คือพารามิเตอร์ของเมธอด takePicture ใช่เลย ที่ใช้เพื่อเรียกใช้ OnImageCapturedCallback() ที่ผู้ใช้ระบุ
  • หากผู้โทรเลือกที่จะบันทึกภาพลงในตำแหน่งไฟล์ คุณสามารถระบุ ให้ผู้บริหารดำเนินการ IO หากต้องการตั้งค่าผู้ดำเนินการ IO โปรดเรียก ImageCapture.Builder.setIoExecutor(Executor) หากไม่มีผู้ดำเนินการ CameraX จะตั้งค่าเริ่มต้นเป็นผู้ดำเนินการ IO ภายในสำหรับ งานนั้น

ตั้งค่าการจับภาพ

การจับภาพเป็นการควบคุมพื้นฐานสำหรับการถ่ายภาพ เช่น แฟลช ระบบโฟกัสอัตโนมัติแบบต่อเนื่อง การหน่วงเวลาชัตเตอร์เป็นศูนย์ และอื่นๆ

setCaptureMode()

ใช้ ImageCapture.Builder.setCaptureMode() เพื่อกำหนดค่าโหมดจับภาพเมื่อถ่ายภาพ:

  • CAPTURE_MODE_MINIMIZE_LATENCY: เพิ่มประสิทธิภาพการจับภาพเพื่อเวลาในการตอบสนอง
  • CAPTURE_MODE_MAXIMIZE_QUALITY: เพิ่มประสิทธิภาพการจับภาพเพื่อคุณภาพของรูปภาพ

โหมดจับภาพมีค่าเริ่มต้นเป็น CAPTURE_MODE_MINIMIZE_LATENCY ดูข้อมูลเพิ่มเติมได้ในเอกสารอ้างอิง setCaptureMode()

ความล่าช้าของชัตเตอร์เป็นศูนย์

ตั้งแต่เวอร์ชัน 1.2 เป็นต้นไป เวลาหน่วงของชัตเตอร์ศูนย์ (CAPTURE_MODE_ZERO_SHOT_LAG) จะมีให้ใช้เป็นโหมดจับภาพ เมื่อเปิดใช้งานเวลาหน่วงของชัตเตอร์เป็นศูนย์ เวลาในการตอบสนองจะลดลงอย่างมากเมื่อเทียบกับโหมดจับภาพเริ่มต้น CAPTURE_MODE_MINIMIZE_LATENCY เพื่อให้คุณไม่พลาดทุกช็อต

ความล่าช้าของชัตเตอร์เป็นศูนย์ใช้บัฟเฟอร์วงแหวนที่เก็บเฟรมจับภาพ 3 เฟรมล่าสุด เมื่อผู้ใช้กดปุ่มจับภาพ CameraX จะเรียกใช้ takePicture() และบัฟเฟอร์ริงจะดึงข้อมูลเฟรมที่จับภาพซึ่งมีการประทับเวลาที่ใกล้เคียงกับการกดปุ่มมากที่สุด จากนั้น CameraX จะประมวลผลเซสชันการจับภาพอีกครั้งเพื่อสร้างรูปภาพจากเฟรมดังกล่าว ซึ่งจะบันทึกลงในดิสก์ในรูปแบบ JPEG

สิ่งที่ต้องมีก่อน

ก่อนเปิดใช้เวลาหน่วงของชัตเตอร์ ให้ใช้ isZslSupported() เพื่อตรวจสอบว่าอุปกรณ์เป็นไปตามข้อกำหนดต่อไปนี้หรือไม่

สำหรับอุปกรณ์ที่ไม่เป็นไปตามข้อกำหนดขั้นต่ำ CameraX จะกลับไปใช้ CAPTURE_MODE_MINIMIZE_LATENCY

ความล่าช้าของชัตเตอร์เป็นศูนย์จะใช้ได้กับกรณีการใช้งานการจับภาพเท่านั้น คุณไม่สามารถเปิดใช้งานสำหรับการจับภาพวิดีโอ Use Case หรือส่วนขยายกล้อง สุดท้าย เนื่องจากการใช้ Flash จะทำให้เวลาในการตอบสนองนานขึ้น ความล่าช้าของชัตเตอร์เป็นศูนย์จะไม่ทำงานเมื่อเปิดแฟลชหรืออยู่ในโหมดอัตโนมัติ ดูข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าโหมดแฟลชได้ที่ setFlashMode()

เปิดใช้งานเวลาหน่วงของชัตเตอร์ศูนย์

หากต้องการเปิดใช้เวลาหน่วงของชัตเตอร์ให้ทำงานทันที ให้ส่ง CAPTURE_MODE_ZERO_SHOT_LAG ไปยัง ImageCapture.Builder.setCaptureMode() หากไม่สำเร็จ setCaptureMode() จะกลับไปเป็น CAPTURE_MODE_MINIMIZE_LATENCY

setFlashMode()

โหมดแฟลชเริ่มต้นคือ FLASH_MODE_OFF หากต้องการตั้งค่าโหมดแฟลช ให้ใช้ ImageCapture.Builder.setFlashMode() โดยทำดังนี้

  • FLASH_MODE_ON: เปิดแฟลชไว้ตลอดเวลา
  • FLASH_MODE_AUTO: แฟลชจะเปิดโดยอัตโนมัติสำหรับช็อตที่มีแสงน้อย

ถ่ายภาพ

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีกำหนดค่าแอปเพื่อถ่ายภาพ

Kotlin

val imageCapture = ImageCapture.Builder()
    .setTargetRotation(view.display.rotation)
    .build()

cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture,
    imageAnalysis, preview)

Java

ImageCapture imageCapture =
    new ImageCapture.Builder()
        .setTargetRotation(view.getDisplay().getRotation())
        .build();

cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, imageAnalysis, preview);

โปรดทราบว่า bindToLifecycle() จะแสดงผลออบเจ็กต์ Camera ดูข้อมูลเพิ่มเติมเกี่ยวกับการควบคุมเอาต์พุตของกล้อง เช่น การซูมและการรับแสงได้ในคู่มือนี้

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

Kotlin

fun onClick() {
    val outputFileOptions = ImageCapture.OutputFileOptions.Builder(File(...)).build()
    imageCapture.takePicture(outputFileOptions, cameraExecutor,
        object : ImageCapture.OnImageSavedCallback {
            override fun onError(error: ImageCaptureException)
            {
                // insert your code here.
            }
            override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) {
                // insert your code here.
            }
        })
}

Java

public void onClick() {
    ImageCapture.OutputFileOptions outputFileOptions =
            new ImageCapture.OutputFileOptions.Builder(new File(...)).build();
    imageCapture.takePicture(outputFileOptions, cameraExecutor,
        new ImageCapture.OnImageSavedCallback() {
            @Override
            public void onImageSaved(ImageCapture.OutputFileResults outputFileResults) {
                // insert your code here.
            }
            @Override
            public void onError(ImageCaptureException error) {
                // insert your code here.
            }
       }
    );
}

วิธีการจับภาพจะสนับสนุน JPEG สำหรับโค้ดตัวอย่าง ที่แสดงวิธีแปลง Media.Image จากรูปแบบ YUV_420_888 เป็น RGB Bitmap ออบเจ็กต์ โปรดดู YuvToRgbConverter.kt

แหล่งข้อมูลเพิ่มเติม

ดูข้อมูลเพิ่มเติมเกี่ยวกับ CameraX ได้ในแหล่งข้อมูลเพิ่มเติมต่อไปนี้

Codelab

  • เริ่มต้นใช้งาน CameraX
  • ตัวอย่างโค้ด

  • ตัวอย่างแอป CameraX