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 kelebihan beban 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 buffer 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.
Ambil foto
Untuk mengambil foto, Anda menyiapkan kamera, lalu memanggil takePicture.
Menyiapkan kamera
Untuk menyiapkan kamera, buat CameraProvider. Kemudian, buat objek
ImageCapture. Menggunakan 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 Anda 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 penyimpanan dan metadata.- Di sini,
OutputFileOptions.Builder()menggunakan objekFileuntuk menentukan lokasi penyimpanan.
- Di sini,
- Fungsi
takePicture()mengambil gambar secara asinkron menggunakan opsi dan executor yang disediakan. OnImageSavedCallbackmenyediakan callback untuk keberhasilan dan kegagalan.- Callback
onImageSaved()menangani pengambilan gambar yang berhasil dan memberikan akses ke hasil gambar yang disimpan. - Callback
onError()menangani error pengambilan gambar.
- Callback
Opsi tambahan
Lihat Panduan mengonfigurasi untuk pengoptimalan, flash, dan format file untuk mengetahui cara tambahan
mengonfigurasi ImageCapture.
Aset lainnya
Untuk mempelajari CameraX lebih lanjut, lihat referensi berikut:
Codelab
Contoh kode