Mengambil gambar

Halaman ini menjelaskan cara mengambil gambar berkualitas tinggi dengan CameraX. Anda melakukannya dengan class ImageCapture dan metode terkaitnya.

Konsep utama

Berikut adalah konsep utama yang dibahas dalam dokumen ini:

  • Metode penyimpanan: Anda dapat mengambil gambar ke buffer dalam memori atau langsung ke file.
  • Eksekutor: ImageCapture menggunakan eksekutor untuk menangani callback dan operasi I/O. Anda dapat menyesuaikan eksekutor ini untuk performa dan kontrol yang lebih baik.
  • Mode Pengambilan: Anda dapat mengonfigurasi mode pengambilan untuk mengoptimalkan latensi atau kualitas gambar.

Metode penyimpanan

Ada dua cara untuk mengambil gambar dengan ImageCapture. Masing-masing menggunakan overload ImageCapture.takePicture():

Eksekutor

Saat memanggil takePicture, Anda meneruskan Executor dan fungsi OnImageCapturedCallback atau OnImageSavedCallback. Executor menjalankan callback dan menangani IO yang dihasilkan.

Mengambil foto

Untuk mengambil foto, Anda menyiapkan kamera, lalu memanggil takePicture.

Menyiapkan kamera

Untuk menyiapkan kamera, buat CameraProvider. Kemudian, buat objek ImageCapture. Gunakan 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);

Ambil foto

Setelah mengonfigurasi kamera, panggil takePicture() untuk mengambil gambar. Contoh ini menunjukkan cara menggunakan takePicture() untuk menyimpan gambar ke disk:

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

Berikut adalah poin-poin penting tentang cuplikan ini:

  • ImageCapture.OutputFileOptions memungkinkan Anda mengonfigurasi lokasi simpan dan metadata.
    • Di sini, OutputFileOptions.Builder() menggunakan objek File untuk menentukan lokasi penyimpanan.
  • Fungsi takePicture() mengambil gambar secara asinkron menggunakan opsi dan eksekutor yang disediakan.
  • OnImageSavedCallback menyediakan callback untuk keberhasilan dan kegagalan.
    • Callback onImageSaved() menangani pengambilan gambar yang berhasil dan memberikan akses ke hasil gambar tersimpan.
    • Callback onError() menangani error pengambilan gambar.

Opsi tambahan

Lihat Panduan mengonfigurasi untuk pengoptimalan, flash, dan format file untuk mengetahui cara tambahan yang dapat Anda gunakan untuk mengonfigurasi ImageCapture.

Aset lainnya

Untuk mempelajari CameraX lebih lanjut, lihat referensi berikut:

Codelab

  • Mulai Menggunakan CameraX
  • Contoh kode

  • Aplikasi contoh CameraX