צילום תמונה

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

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

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

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

שיטת האחסון

יש שתי דרכים לצלם תמונות באמצעות 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 מספק קריאות חוזרות להצלחה ולכישלון.
    • פונקציית הקריאה החוזרת onImageSaved() מטפלת בצילום תמונה מוצלח ומספקת גישה לתוצאות של התמונה שנשמרה.
    • פונקציית ה-callback‏ onError() מטפלת בשגיאות בצילום תמונות.

אפשרויות נוספות

במדריך להגדרה לצורך אופטימיזציה, צריבת ROM‏ (flash) ופורמט קובץ מוסברות דרכים נוספות להגדרת ImageCapture.

מקורות מידע נוספים

מידע נוסף על CameraX זמין במקורות המידע הבאים:

Codelab

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

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