Chụp ảnh

Trang này mô tả cách chụp ảnh chất lượng cao bằng CameraX. Bạn thực hiện việc này bằng lớp ImageCapture và các phương thức liên kết của lớp đó.

Khái niệm chính

Sau đây là các khái niệm chính được thảo luận trong tài liệu này:

  • Phương thức lưu trữ: Bạn có thể chụp ảnh vào vùng đệm trong bộ nhớ hoặc trực tiếp vào tệp.
  • Trình thực thi: ImageCapture sử dụng trình thực thi để xử lý lệnh gọi lại và các thao tác I/O. Bạn có thể tuỳ chỉnh các trình thực thi này để có hiệu suất và khả năng kiểm soát tốt hơn.
  • Chế độ chụp: Bạn có thể định cấu hình chế độ chụp để tối ưu hoá độ trễ hoặc chất lượng hình ảnh.

Phương thức lưu trữ

Có hai cách để chụp ảnh bằng ImageCapture. Mỗi hàm sử dụng một phương thức nạp chồng của ImageCapture.takePicture():

Trình thực thi

Khi gọi takePicture, bạn sẽ truyền một Executor và một hàm OnImageCapturedCallback hoặc OnImageSavedCallback. Executor chạy lệnh gọi lại và xử lý mọi hoạt động đầu vào/đầu ra (IO) thu được.

Chụp ảnh

Để chụp ảnh, bạn thiết lập máy ảnh rồi gọi takePicture.

Thiết lập camera

Để thiết lập máy ảnh, hãy tạo một CameraProvider. Sau đó, hãy tạo một đối tượng ImageCapture. Sử dụng 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);

Chụp ảnh

Sau khi bạn định cấu hình máy ảnh, hãy gọi takePicture() để chụp ảnh. Ví dụ này minh hoạ cách sử dụng takePicture() để lưu hình ảnh vào ổ đĩa:

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.
            }
       }
    );
}

Sau đây là các điểm chính về đoạn mã này:

  • ImageCapture.OutputFileOptions cho phép bạn định cấu hình vị trí lưu và siêu dữ liệu.
    • Ở đây, OutputFileOptions.Builder() sử dụng đối tượng File để xác định vị trí lưu.
  • Hàm takePicture() chụp ảnh không đồng bộ bằng cách sử dụng các tuỳ chọn và trình thực thi được cung cấp.
  • OnImageSavedCallback cung cấp lệnh gọi lại cho trường hợp thành công và không thành công.
    • Lệnh gọi lại onImageSaved() xử lý việc chụp ảnh thành công và cung cấp quyền truy cập vào kết quả hình ảnh đã lưu.
    • Lệnh gọi lại onError() xử lý các lỗi chụp ảnh.

Tùy chọn bổ sung

Hãy xem Hướng dẫn định cấu hình để tối ưu hoá, truyền nhanh và định dạng tệp để biết thêm các cách bạn có thể định cấu hình ImageCapture.

Tài nguyên khác

Để tìm hiểu thêm về CameraX, hãy tham khảo các tài nguyên sau:

Lớp học lập trình

  • Bắt đầu sử dụng CameraX
  • Đoạn mã mẫu

  • Ứng dụng mẫu CameraX