Chụp ảnh

Trường hợp sử dụng chụp ảnh được thiết kế để chụp ảnh có độ phân giải cao và chất lượng cao, đồng thời cung cấp chức năng tự động cân bằng trắng, tự động phơi sáng và tự động lấy nét (3A), ngoài các chế độ kiểm soát camera chụp thủ công đơn giản. Lệnh gọi chịu trách nhiệm quyết định cách sử dụng ảnh đã chụp, bao gồm các tuỳ chọn sau đây:

Có hai loại trình thực thi (executor) có thể tuỳ chỉnh chạy ImageCapture, trình thực thi lệnh gọi lại và trình thực thi IO.

  • Trình thực thi lệnh gọi lại là tham số của phương thức takePicture. Trình thực thi này được dùng để thực thi OnImageCapturedCallback() do người dùng cung cấp.
  • Nếu lệnh gọi chọn lưu hình ảnh vào một vị trí tệp, bạn có thể chỉ định trình thực thi để thực hiện IO. Để đặt trình thực thi IO, hãy gọi ImageCapture.Builder.setIoExecutor(Executor). Nếu không có trình thực thi này, CameraX sẽ mặc định sử dụng trình thực thi IO nội bộ cho nhiệm vụ.

Thiết lập tính năng chụp ảnh

Tính năng chụp ảnh cung cấp các chế độ điều khiển cơ bản để chụp ảnh, chẳng hạn như đèn flash, tự động lấy nét liên tục, zero-shutter lag (giảm độ trễ màn trập) và nhiều tính năng khác.

setCaptureMode()

Sử dụng ImageCapture.Builder.setCaptureMode() để định cấu hình chế độ chụp khi chụp ảnh:

Chế độ chụp mặc định là CAPTURE_MODE_MINIMIZE_LATENCY. Để biết thêm thông tin, hãy xem tài liệu tham khảo về setCaptureMode().

Zero-Shutter Lag

Kể từ phiên bản 1.2, Zero-Shutter Lag (Giảm độ trễ màn trập) (CAPTURE_MODE_ZERO_SHOT_LAG) có được cung cấp như một chế độ chụp. Khi bật tính năng Zero-Shutter Lag (Giảm độ trễ màn trập), độ trễ sẽ giảm đáng kể so với chế độ chụp mặc định, CAPTURE_MODE_MINIMIZE_LATENCY, để bạn không bao giờ bỏ lỡ bức ảnh nào.

Zero-Shutter Lag (Giảm độ trễ màn trập) sử dụng bộ đệm vòng lưu trữ 3 khung hình chụp gần đây nhất. Khi người dùng nhấn nút chụp, CameraX sẽ gọi takePicture() và bộ đệm vòng sẽ truy xuất khung hình đã chụp với dấu thời gian gần nhất với dấu thời gian khi nhấn nút. Sau đó, CameraX xử lý lại phiên chụp để tạo hình ảnh từ khung đó, hình ảnh này được lưu vào ổ đĩa ở định dạng JPEG.

Điều kiện tiên quyết

Trước khi bật tính năng Zero-Shutter Lag (Giảm độ trễ màn trập), hãy sử dụng isZslSupported() để xác định xem thiết bị của bạn có đáp ứng các yêu cầu sau không:

Đối với các thiết bị không đáp ứng yêu cầu tối thiểu, CameraX sẽ quay lại CAPTURE_MODE_MINIMIZE_LATENCY.

Zero-Shutter Lag (Giảm độ trễ màn trập) chỉ dùng cho trường hợp sử dụng là Chụp ảnh. Bạn không thể bật tính năng này cho trường hợp sử dụng Quay video hoặc với Tiện ích máy ảnh. Cuối cùng, vì việc sử dụng đèn flash dẫn đến độ trễ lớn hơn, nên tính năng Zero-Shutter Lag (Giảm độ trễ màn trập) không hoạt động khi đèn flash đang BẬT hoặc ở chế độ TỰ ĐỘNG. Để biết thêm thông tin về cách đặt chế độ đèn flash, hãy xem setFlashMode().

Bật tính năng Zero-Shutter Lag

Để bật tính năng Zero-Shutter Lag (Giảm độ trễ màn trập), hãy chuyển CAPTURE_MODE_ZERO_SHOT_LAG vào ImageCapture.Builder.setCaptureMode(). Nếu không thành công, setCaptureMode() sẽ quay lại CAPTURE_MODE_MINIMIZE_LATENCY.

setFlashMode()

Chế độ đèn flash mặc định là FLASH_MODE_OFF. Để đặt chế độ đèn flash, hãy dùng ImageCapture.Builder.setFlashMode():

  • FLASH_MODE_ON: Đèn flash luôn bật.
  • FLASH_MODE_AUTO: Đèn flash sẽ tự động bật để chụp ảnh trong điều kiện ánh sáng yếu.

Chụp ảnh

Mã mẫu sau đây cho biết cách định cấu hình ứng dụng của bạn để chụp ảnh:

Kotlin

val imageCapture = ImageCapture.Builder()
    .setTargetRotation(view.display.rotation)
    .build()

cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture,
    imageAnalysis, preview)

Java

ImageCapture imageCapture =
    new ImageCapture.Builder()
        .setTargetRotation(view.getDisplay().getRotation())
        .build();

cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, imageAnalysis, preview);

Lưu ý rằng bindToLifecycle() trả về đối tượng Camera. Xem hướng dẫn này để biết thêm thông tin về cách kiểm soát đầu ra của máy ảnh, chẳng hạn như thu phóng và phơi sáng.

Sau khi bạn định cấu hình máy ảnh, mã sau đây sẽ chụp ảnh dựa trên thao tác của người dùng:

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

Phương thức chụp ảnh hoàn toàn hỗ trợ định dạng JPEG. Để biết mã mẫu cho thấy cách chuyển đổi đối tượng Media.Image từ định dạng YUV_420_888 sang đối tượng Bitmap RGB, xem YuvToRgbConverter.kt.

Tài nguyên khác

Để tìm hiểu thêm về CameraX, hãy tham khảo các tài liệu bổ sung sau đây.

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