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:
ImageCapturemenggunakan 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():
File: Gunakan
takePicture(OutputFileOptions, Executor, OnImageSavedCallback)untuk menyimpan gambar yang diambil langsung ke file di disk.- Ini adalah cara paling umum untuk mengambil foto.
Dalam Memori: Gunakan
takePicture(Executor, OnImageCapturedCallback)untuk menerima buffering dalam memori dari gambar yang diambil.- Hal ini berguna untuk pemrosesan atau analisis gambar real-time.
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.OutputFileOptionsmemungkinkan Anda mengonfigurasi lokasi simpan dan metadata.- Di sini,
OutputFileOptions.Builder()menggunakan objekFileuntuk menentukan lokasi penyimpanan.
- Di sini,
- Fungsi
takePicture()mengambil gambar secara asinkron menggunakan opsi dan eksekutor yang disediakan. OnImageSavedCallbackmenyediakan 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.
- Callback
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
Contoh kode