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:
takePicture(Executor, OnImageCapturedCallback)
: Metode ini menyediakan buffering dalam memori dari gambar yang diambil.takePicture(OutputFileOptions, Executor, OnImageSavedCallback)
: Metode ini menyimpan gambar yang diambil ke lokasi file yang disediakan.
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 menjalankanOnImageCapturedCallback()
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:
CAPTURE_MODE_MINIMIZE_LATENCY
: mengoptimalkan pengambilan gambar untuk meminimalkan latensi.CAPTURE_MODE_MAXIMIZE_QUALITY
: mengoptimalkan pengambilan gambar untuk memaksimalkan kualitas gambar.
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:
- Menargetkan Android 6.0+ (level API 23 dan yang lebih baru).
- Mendukung pemrosesan ulang
PRIVATE
.
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()
:
FLASH_MODE_ON
: Flash selalu aktif.FLASH_MODE_AUTO
: Flash otomatis aktif untuk pengambilan foto saat minim cahaya.
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
Contoh kode