หน้านี้จะอธิบายวิธีจับภาพคุณภาพสูงด้วย CameraX โดยคุณดำเนินการดังกล่าวได้โดยใช้คลาส ImageCapture
และเมธอดที่เกี่ยวข้อง
หัวข้อสำคัญ
แนวคิดหลักที่กล่าวถึงในเอกสารนี้ ได้แก่
- วิธีการจัดเก็บ: คุณสามารถจับภาพไปยังบัฟเฟอร์ในหน่วยความจำหรือไปยังไฟล์โดยตรง
- Executor:
ImageCapture
ใช้ Executor เพื่อจัดการการเรียกกลับและการดำเนินการ I/O คุณสามารถปรับแต่งผู้ดำเนินการเหล่านี้เพื่อประสิทธิภาพและการควบคุมที่ดียิ่งขึ้น - โหมดการจับภาพ: คุณกำหนดค่าโหมดการจับภาพเพื่อเพิ่มประสิทธิภาพสำหรับเวลาในการตอบสนองหรือคุณภาพของรูปภาพได้
วิธีการจัดเก็บข้อมูล
การจับภาพด้วย
ImageCapture
ทำได้ 2 วิธี แต่ละรายการใช้ ImageCapture.takePicture()
ดังนี้
ไฟล์: ใช้
takePicture(OutputFileOptions, Executor, OnImageSavedCallback)
เพื่อบันทึกรูปภาพที่จับภาพไปยังไฟล์ในดิสก์โดยตรง- วิธีนี้เป็นวิธีที่พบบ่อยที่สุดในการจับภาพ
ในหน่วยความจำ: ใช้
takePicture(Executor, OnImageCapturedCallback)
เพื่อรับบัฟเฟอร์ในหน่วยความจำของรูปภาพที่จับภาพไว้- ซึ่งมีประโยชน์สำหรับการประมวลผลหรือการวิเคราะห์รูปภาพแบบเรียลไทม์
ผู้ดำเนินการ
เมื่อเรียกใช้ takePicture
คุณจะส่ง Executor
และฟังก์ชัน OnImageCapturedCallback
หรือ OnImageSavedCallback
Executor
จะเรียกใช้การเรียกกลับและจัดการ IO ที่เกิดขึ้น
ถ่ายภาพ
หากต้องการถ่ายภาพ ให้ตั้งค่ากล้องแล้วเรียกใช้ takePicture
ตั้งค่ากล้อง
หากต้องการตั้งค่ากล้อง ให้สร้าง CameraProvider
จากนั้นสร้างออบเจ็กต์ ImageCapture
วิธีใช้ ImageCapture.Builder()
Kotlin
val imageCapture = ImageCapture.Builder()
.setTargetRotation(view.display.rotation)
.build()
cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, preview)
Java
ImageCapture imageCapture =
new ImageCapture.Builder()
.setTargetRotation(view.getDisplay().getRotation())
.build();
cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, preview);
ถ่ายรูป
หลังจากกำหนดค่ากล้องแล้ว ให้เรียกใช้ takePicture()
เพื่อจับภาพ
ตัวอย่างนี้แสดงวิธีใช้ takePicture()
เพื่อบันทึกรูปภาพลงในดิสก์
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.
}
}
);
}
ประเด็นสําคัญเกี่ยวกับข้อมูลโค้ดนี้มีดังนี้
ImageCapture.OutputFileOptions
ช่วยให้คุณกําหนดค่าตําแหน่งบันทึกและข้อมูลเมตาได้- ในที่นี้
OutputFileOptions.Builder()
ใช้ออบเจ็กต์File
เพื่อระบุตำแหน่งบันทึก
- ในที่นี้
- ฟังก์ชัน
takePicture()
จะจับภาพแบบไม่พร้อมกันโดยใช้ตัวเลือกและผู้ดำเนินการที่ระบุ OnImageSavedCallback
จะให้การเรียกกลับสำหรับกรณีที่สำเร็จและไม่สำเร็จ- Callback
onImageSaved()
จะจัดการการจับภาพรูปภาพให้เสร็จสมบูรณ์และให้การเข้าถึงผลการค้นหารูปภาพที่บันทึกไว้ - การเรียกกลับ
onError()
จะจัดการข้อผิดพลาดในการจับภาพ
- Callback
ตัวเลือกเพิ่มเติม
ดูคำแนะนำในการกำหนดค่าเพื่อการเพิ่มประสิทธิภาพ แฟลช และรูปแบบไฟล์เพื่อดูวิธีอื่นๆ ในการกําหนดค่า ImageCapture
แหล่งข้อมูลเพิ่มเติม
ดูข้อมูลเพิ่มเติมเกี่ยวกับ CameraX ได้ที่แหล่งข้อมูลต่อไปนี้
Codelab
ตัวอย่างโค้ด