กรณีการใช้งานการจับภาพได้รับการออกแบบมาเพื่อจับภาพความละเอียดสูง รูปภาพคุณภาพสูง รวมถึงปรับสมดุลแสงขาวอัตโนมัติ การรับแสงอัตโนมัติ และ ฟังก์ชันโฟกัสอัตโนมัติ (3A) นอกเหนือจากการควบคุมกล้องด้วยตนเองที่ใช้งานง่าย ผู้โทรจะเป็นผู้รับผิดชอบในการตัดสินใจเกี่ยวกับวิธีใช้ภาพที่บันทึกไว้ ซึ่งรวมถึงตัวเลือกต่อไปนี้
takePicture(Executor, OnImageCapturedCallback)
: วิธีนี้จะมีบัฟเฟอร์ในหน่วยความจำของรูปภาพที่จับภาพไว้takePicture(OutputFileOptions, Executor, OnImageSavedCallback)
: วิธีการนี้จะบันทึกรูปภาพที่บันทึกลงในตําแหน่งไฟล์ที่ระบุ
ผู้ดำเนินการที่ปรับแต่งได้ที่ 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()
เพื่อตรวจสอบว่าอุปกรณ์เป็นไปตามข้อกำหนดต่อไปนี้หรือไม่
- กำหนดเป้าหมายเป็น Android 6.0 ขึ้นไป (API ระดับ 23 ขึ้นไป)
- รองรับการประมวลผล
PRIVATE
ใหม่
สำหรับอุปกรณ์ที่ไม่เป็นไปตามข้อกำหนดขั้นต่ำ 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
ตัวอย่างโค้ด