หน้านี้อธิบายวิธีบันทึกภาพคุณภาพสูงด้วย CameraX โดยใช้
คลาส ImageCapture และเมธอดที่เกี่ยวข้อง
หัวข้อสำคัญ
หัวข้อหลักที่กล่าวถึงในเอกสารนี้มีดังนี้
- วิธีการจัดเก็บ: คุณสามารถบันทึกรูปภาพลงในบัฟเฟอร์ในหน่วยความจำ หรือลงในไฟล์โดยตรงก็ได้
- Executors:
ImageCaptureใช้ Executors เพื่อจัดการการเรียกกลับและการดำเนินการ I/O คุณสามารถปรับแต่ง Executors เหล่านี้เพื่อให้ได้ประสิทธิภาพและการควบคุมที่ดีขึ้น - โหมดการบันทึก: คุณสามารถกำหนดค่าโหมดการบันทึกเพื่อเพิ่มประสิทธิภาพ เวลาในการตอบสนองหรือคุณภาพของรูปภาพก็ได้
วิธีการจัดเก็บ
คุณสามารถบันทึกรูปภาพด้วย ImageCapture ได้ 2 วิธี โดยแต่ละวิธีจะใช้การโอเวอร์โหลดของ ImageCapture.takePicture() ดังนี้
ไฟล์: ใช้
takePicture(OutputFileOptions, Executor, OnImageSavedCallback)เพื่อบันทึกรูปภาพที่บันทึกลงในไฟล์บน ดิสก์โดยตรง- วิธีนี้เป็นวิธีที่ใช้กันมากที่สุดในการบันทึกรูปภาพ
ในหน่วยความจำ: ใช้
takePicture(Executor, OnImageCapturedCallback)เพื่อรับบัฟเฟอร์ในหน่วยความจำของรูปภาพที่บันทึก- วิธีนี้มีประโยชน์สำหรับการประมวลผลหรือวิเคราะห์รูปภาพแบบเรียลไทม์
Executors
เมื่อเรียก takePicture คุณจะส่ง Executor และฟังก์ชัน
OnImageCapturedCallback หรือ OnImageSavedCallback Executor จะเรียกใช้ฟังก์ชันเรียกกลับและจัดการ I/O ที่เกิดขึ้น
ถ่ายภาพ
หากต้องการถ่ายภาพ ให้ตั้งค่ากล้องแล้วเรียก 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.
}
}
);
}
ประเด็นสำคัญเกี่ยวกับข้อมูลโค้ดนี้มีดังนี้
- The
ImageCapture.OutputFileOptionsช่วยให้คุณกำหนดค่าตำแหน่งบันทึก และข้อมูลเมตาได้- ในที่นี้
OutputFileOptions.Builder()จะใช้ออบเจ็กต์Fileเพื่อ กำหนดตำแหน่งบันทึก
- ในที่นี้
- ฟังก์ชัน
takePicture()จะบันทึกรูปภาพแบบไม่พร้อมกันโดยใช้ตัวเลือกและ Executor ที่ระบุ - The
OnImageSavedCallbackมีฟังก์ชันเรียกกลับสำหรับความสำเร็จและความล้มเหลว- ฟังก์ชันเรียกกลับ
onImageSaved()จะจัดการการบันทึกรูปภาพที่สำเร็จและ ให้สิทธิ์เข้าถึงผลลัพธ์ของรูปภาพที่บันทึก - ฟังก์ชันเรียกกลับ
onError()จะจัดการข้อผิดพลาดในการบันทึกรูปภาพ
- ฟังก์ชันเรียกกลับ
ตัวเลือกเพิ่มเติม
ดูวิธีเพิ่มเติมในการกำหนดค่า ImageCapture ได้ที่คู่มือกำหนดค่าเพื่อเพิ่มประสิทธิภาพ แฟลช และรูปแบบไฟล์สำหรับวิธีพิเศษ
แหล่งข้อมูลเพิ่มเติม
ดูข้อมูลเพิ่มเติมเกี่ยวกับ CameraX ได้ที่แหล่งข้อมูลต่อไปนี้
Codelab
ตัวอย่างโค้ด