בדף הזה נסביר איך לצלם תמונות באיכות גבוהה באמצעות CameraX. עושים זאת באמצעות הכיתה ImageCapture והשיטות המשויכות אליה.
מושגים מרכזיים
אלה המושגים העיקריים שמפורטים במסמך הזה:
- שיטת האחסון: אפשר לצלם תמונות למאגר בזיכרון או ישירות לקובץ.
- מפעילים:
ImageCaptureמשתמש במפעילים לטיפול בקריאות חזרה (callbacks) ובפעולות קלט/פלט. אפשר להתאים אישית את המבצעים האלה כדי לשפר את הביצועים ואת השליטה. - מצבי צילום: אפשר להגדיר את מצב הצילום כך שתתבצע אופטימיזציה לפי זמן האחזור או לפי איכות התמונה.
שיטת האחסון
יש שתי דרכים לצלם תמונות באמצעות ImageCapture. כל אחת מהן משתמשת בעומס יתר של ImageCapture.takePicture():
קובץ: משתמשים ב-
takePicture(OutputFileOptions, Executor, OnImageSavedCallback)כדי לשמור את התמונה שצולמה ישירות בקובץ בדיסק.- זוהי הדרך הנפוצה ביותר לצלם תמונות.
בזיכרון: משתמשים ב-
takePicture(Executor, OnImageCapturedCallback)כדי לקבל מאגר נתונים זמני בזיכרון של התמונה שצולמה.- האפשרות הזו שימושית לעיבוד או לניתוח תמונות בזמן אמת.
מבצעים
כשקוראים לפונקציה takePicture, מעבירים Executor ופונקציית OnImageCapturedCallback או OnImageSavedCallback. הפונקציה Executor מפעילה את פונקציית הקריאה החוזרת ומטפלת בכל פעולות הקלט/פלט שנובעות ממנה.
צילום תמונה
כדי לצלם תמונה, מגדירים את המצלמה ומפעילים את takePicture.
הגדרת המצלמה
כדי להגדיר את המצלמה, יוצרים CameraProvider. לאחר מכן יוצרים אובייקט ImageCapture. משתמשים ב-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);
צילום תמונה
אחרי שמגדירים את המצלמה, קוראים ל-takePicture() כדי לצלם תמונה.
בדוגמה הזו מוסבר איך משתמשים ב-takePicture() כדי לשמור תמונה בדיסק:
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.
}
}
);
}
ריכזנו כאן את הנקודות העיקריות לגבי קטע הקוד הזה:
- הפעולה
ImageCapture.OutputFileOptionsמאפשרת להגדיר את המיקום לשמירה ואת המטא-נתונים.- כאן, ה-
OutputFileOptions.Builder()משתמש באובייקטFileכדי לקבוע את מיקום השמירה.
- כאן, ה-
- הפונקציה
takePicture()מתעדת את התמונה באופן אסינכרוני באמצעות האפשרויות והמבצע שסופקו. - הפונקציה
OnImageSavedCallbackמספקת קריאות חזרה (callbacks) במקרה של הצלחה וכישלון.- פונקציית הקריאה החוזרת
onImageSaved()מטפלת בצילום התמונה בהצלחה ומספקת גישה לתוצאות של התמונות השמורות. - פונקציית ה-callback
onError()מטפלת בשגיאות שקשורות לצילום התמונה.
- פונקציית הקריאה החוזרת
אפשרויות נוספות
במדריך להגדרה לאופטימיזציה, ל-Flash ולפורמטים של קבצים מפורטות דרכים נוספות להגדרת ImageCapture.
מקורות מידע נוספים
מידע נוסף על CameraX זמין במקורות המידע הבאים:
Codelab
דוגמת קוד