בדף הזה נסביר איך לצלם תמונות באיכות גבוהה באמצעות 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
דוגמת קוד