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à những 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 bộ nhớ đệm trong bộ nhớ hoặc trực tiếp vào một tệp.
  • Trình thực thi: ImageCapture sử dụng trình thực thi để xử lý các lệnh gọi lại và thao tác I/O. Bạn có thể tuỳ chỉnh các trình thực thi này để cải thiện hiệu suất và khả năng kiểm soát.
  • 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ó 2 cách để chụp ảnh bằng ImageCapture. Mỗi hàm đều sử dụng một hàm 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à hàm OnImageCapturedCallback hoặc OnImageSavedCallback. Executor chạy lệnh gọi lại và xử lý mọi IO kết quả.

Chụp ảnh

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

Thiết lập camera

Để thiết lập camera, hãy tạo một CameraProvider. Sau đó, hãy tạo một đối tượng ImageCapture. 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 camera, 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à những đ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 một đối tượng File để xác định vị trí lưu.
  • Hàm takePicture() chụp ảnh theo cách không đồng bộ bằng cách sử dụng các lựa 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 thái 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á, flash 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