จับภาพ

หน้านี้อธิบายวิธีบันทึกภาพคุณภาพสูงด้วย 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

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

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