จับภาพ

หน้านี้จะอธิบายวิธีจับภาพคุณภาพสูงด้วย 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 จะให้การเรียกกลับสำหรับกรณีที่สำเร็จและไม่สำเร็จ

ตัวเลือกเพิ่มเติม

ดูคำแนะนำในการกำหนดค่าเพื่อการเพิ่มประสิทธิภาพ แฟลช และรูปแบบไฟล์เพื่อดูวิธีอื่นๆ ในการกําหนดค่า ImageCapture

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

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

Codelab

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

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