בדף הזה מוסבר איך לצלם תמונות באיכות גבוהה באמצעות CameraX. אפשר לעשות את זה באמצעות המחלקה ImageCapture וה-methods שמשויכים אליה.
מושגים מרכזיים
אלה המושגים העיקריים שמוסברים במסמך הזה:
- שיטת האחסון: אפשר לצלם תמונות ולשמור אותן במאגר זמני בזיכרון או ישירות בקובץ.
- רכיבי Executor:
ImageCaptureמשתמש ברכיבי Executor כדי לטפל בקריאות חוזרות ובפעולות קלט/פלט. אתם יכולים להתאים אישית את מנהלי התהליכים האלה כדי לשפר את הביצועים ולשלוט בהם. - מצבי צילום: אתם יכולים להגדיר את מצב הצילום כך שתתבצע אופטימיזציה של זמן האחזור או של איכות התמונה.
שיטת האחסון
יש שתי דרכים לצלם תמונות באמצעות ImageCapture. כל אחת מהן משתמשת בעומס יתר של ImageCapture.takePicture():
קובץ: משתמשים ב-
takePicture(OutputFileOptions, Executor, OnImageSavedCallback)כדי לשמור את התמונה שצולמה ישירות בקובץ בדיסק.- זו הדרך הכי נפוצה לצלם תמונות.
In-Memory: שימוש ב-
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מספק קריאות חוזרות להצלחה ולכישלון.- פונקציית הקריאה החוזרת
onImageSaved()מטפלת בצילום תמונה מוצלח ומספקת גישה לתוצאות של התמונה שנשמרה. - פונקציית ה-callback
onError()מטפלת בשגיאות בצילום תמונות.
- פונקציית הקריאה החוזרת
אפשרויות נוספות
במדריך להגדרה לצורך אופטימיזציה, צריבת ROM (flash) ופורמט קובץ מוסברות דרכים נוספות להגדרת ImageCapture.
מקורות מידע נוספים
מידע נוסף על CameraX זמין במקורות המידע הבאים:
Codelab
דוגמת קוד