Pengambilan gambar

Kasus penggunaan pengambilan gambar dirancang untuk mengambil foto berkualitas tinggi dan beresolusi tinggi serta menyediakan fungsionalitas white balance otomatis, eksposur otomatis, dan fokus otomatis (3A), selain kontrol kamera manual yang sederhana. Pemanggil bertanggung jawab menentukan penggunaan gambar yang diambil, yang meliputi opsi berikut:

Ada dua jenis eksekutor yang dapat disesuaikan yang menjalankan ImageCapture, eksekutor callback dan eksekutor IO.

  • Eksekutor callback adalah parameter dari metode takePicture. Ini digunakan untuk menjalankan OnImageCapturedCallback() yang diberikan pengguna.
  • Jika pemanggil memilih untuk menyimpan gambar ke lokasi file, Anda dapat menentukan eksekutor untuk melakukan IO. Untuk menetapkan eksekutor IO, panggil ImageCapture.Builder.setIoExecutor(Executor). Jika eksekutor tidak ada, CameraX akan ditetapkan secara default ke eksekutor IO internal untuk tugas tersebut.

Menyiapkan pengambilan gambar

Pengambilan gambar memberikan kontrol dasar untuk mengambil gambar, seperti flash, fokus otomatis berkelanjutan, shutter tanpa jeda, dan lainnya.

setCaptureMode()

Gunakan ImageCapture.Builder.setCaptureMode() untuk mengonfigurasi mode pengambilan saat mengambil foto:

Mode pengambilan disetel secara default ke CAPTURE_MODE_MINIMIZE_LATENCY. Untuk informasi selengkapnya, lihat dokumentasi referensi setCaptureMode().

Shutter Tanpa Jeda

Mulai 1.2, Shutter Tanpa Jeda (CAPTURE_MODE_ZERO_SHOT_LAG) tersedia sebagai mode pengambilan. Jika Shutter Tanpa Jeda diaktifkan, latensi akan berkurang secara signifikan dibandingkan dengan mode pengambilan default, CAPTURE_MODE_MINIMIZE_LATENCY, sehingga Anda tidak akan melewatkan gambar.

Shutter Tanpa Jeda menggunakan buffering ring yang menyimpan tiga bingkai pengambilan terbaru. Saat pengguna menekan tombol rekam, CameraX akan memanggil takePicture(), dan buffering ring akan mengambil bingkai yang diambil dengan stempel waktu yang paling dekat dengan penekanan tombol tersebut. CameraX kemudian akan memproses ulang sesi pengambilan untuk menghasilkan gambar dari bingkai tersebut, yang disimpan ke disk dalam format JPEG.

Prasyarat

Sebelum mengaktifkan Shutter Tanpa Jeda, gunakan isZslSupported() untuk menentukan apakah perangkat Anda memenuhi persyaratan berikut:

Untuk perangkat yang tidak memenuhi persyaratan minimum, CameraX akan dikembalikan ke CAPTURE_MODE_MINIMIZE_LATENCY.

Shutter Tanpa Jeda hanya tersedia untuk kasus penggunaan Pengambilan gambar. Anda tidak dapat mengaktifkannya untuk kasus penggunaan Perekaman video atau dengan Ekstensi kamera. Terakhir, karena menggunakan flash menghasilkan latensi yang lebih besar, Shutter Tanpa Jeda tidak berfungsi saat flash AKTIF atau dalam mode OTOMATIS. Untuk mengetahui informasi selengkapnya tentang cara menyetel mode flash, lihat setFlashMode().

Mengaktifkan Shutter Tanpa Jeda

Untuk mengaktifkan Shutter Tanpa Jeda, teruskan CAPTURE_MODE_ZERO_SHOT_LAG ke ImageCapture.Builder.setCaptureMode(). Jika tidak berhasil, setCaptureMode() akan kembali ke CAPTURE_MODE_MINIMIZE_LATENCY.

setFlashMode()

Mode flash default adalah FLASH_MODE_OFF. Untuk menyetel mode flash, gunakan ImageCapture.Builder.setFlashMode():

Mengambil foto

Contoh kode berikut menunjukkan cara mengonfigurasi aplikasi Anda untuk mengambil foto:

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

Perhatikan bahwa bindToLifecycle() menampilkan objek Camera. Lihat panduan ini untuk informasi mengontrol output kamera selengkapnya, seperti zoom dan eksposur.

Setelah Anda mengonfigurasi kamera, kode berikut akan mengambil foto berdasarkan tindakan pengguna:

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

Metode pengambilan gambar sepenuhnya mendukung format JPEG. Untuk mengetahui kode contoh yang menampilkan cara mengonversi objek Media.Image dari format YUV_420_888 ke objek Bitmap RGB, lihat YuvToRgbConverter.kt.

Referensi lainnya

Untuk mempelajari CameraX lebih lanjut, lihat referensi tambahan berikut.

Codelab

  • Mulai Menggunakan CameraX
  • Contoh kode

  • Aplikasi contoh CameraX