צילום תמונה

בדף הזה נסביר איך לצלם תמונות באיכות גבוהה באמצעות CameraX. עושים זאת באמצעות הכיתה ImageCapture והשיטות המשויכות אליה.

מושגים מרכזיים

אלה המושגים העיקריים שמפורטים במסמך הזה:

  • שיטת האחסון: אפשר לצלם תמונות למאגר בזיכרון או ישירות לקובץ.
  • מפעילים: ImageCapture משתמש במפעילים לטיפול בקריאות חזרה (callbacks) ובפעולות קלט/פלט. אפשר להתאים אישית את המבצעים האלה כדי לשפר את הביצועים ואת השליטה.
  • מצבי צילום: אפשר להגדיר את מצב הצילום כך שתתבצע אופטימיזציה לפי זמן האחזור או לפי איכות התמונה.

שיטת האחסון

יש שתי דרכים לצלם תמונות באמצעות ImageCapture. כל אחת מהן משתמשת בעומס יתר של ImageCapture.takePicture():

מבצעים

כשקוראים לפונקציה 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

  • תחילת העבודה עם CameraX
  • דוגמת קוד

  • אפליקציות לדוגמה של CameraX