צילום תמונה

התרחיש לדוגמה של צילום תמונות מיועד לצילום ברזולוציה גבוהה, לתמונות באיכות גבוהה ולספק איזון לבן אוטומטי, חשיפה אוטומטית פונקציונליות של מיקוד אוטומטי (3A), בנוסף לפקדים ידניים פשוטים של המצלמה. המתקשר/ת אחראי/ת להחליט איך להשתמש בתמונה שצולמה, כולל האפשרויות הבאות:

יש שני סוגים של קובצי הרצה שניתן להתאים אישית שבהם ImageCapture פועל, את מפעיל הקריאה החוזרת (callback) ואת מפעיל ה-IO.

  • קובץ הקריאה החוזרת (callback) הוא הפרמטר של השיטות takePicture. זה כן משמש להפעלת OnImageCapturedCallback() שסופק על ידי המשתמש.
  • אם המתקשר בוחר לשמור את התמונה במיקום קובץ, ניתן לציין מוציא לפועל שיבצע את הזמנת הקמפיין. כדי להגדיר את מפעיל ה-IO, יש להתקשר ImageCapture.Builder.setIoExecutor(Executor) אם האופרטור חסר, CameraX יוגדר כברירת מחדל לביצוע IO פנימי עבור את המשימה.

הגדרת צילום תמונה

צילום התמונות מספק פקדים בסיסיים לצילום תמונות, כמו Flash, מיקוד אוטומטי רציף, השהיה אפסית ועוד.

setCaptureMode()

שימוש ב-ImageCapture.Builder.setCaptureMode() כדי להגדיר את מצב הצילום בזמן צילום תמונה:

ברירת המחדל של מצב הצילום היא CAPTURE_MODE_MINIMIZE_LATENCY. מידע נוסף זמין במשאבי העזרה של setCaptureMode().

השהיה של אפס תריס

החל מגרסה 1.2, השהיה ללא תריס (CAPTURE_MODE_ZERO_SHOT_LAG) זמינה כמצב צילום. כשהתכונה 'השהיה ללא תריס' מופעלת, זמן האחזור מצטמצם משמעותית בהשוואה למצב הצילום שמוגדר כברירת מחדל, CAPTURE_MODE_MINIMIZE_LATENCY, כך שלא תפספסו אף תמונה.

השהיה של אפס תריס משתמש במאגר נתונים זמני ומאחסן את שלושת הפריימים האחרונים של הצילום. כשמשתמש לוחץ על לחצן הצילום, CameraX מפעיל את takePicture(), ומאגר הנתונים הזמני של הצלצול מאחזר את הפריים שצולמה באמצעות חותמת הזמן הקרובה ביותר לזו של לחיצה על הלחצן. לאחר מכן, CameraX מעבד מחדש את סשן הצילום כדי ליצור תמונה מאותה פריים, שנשמרת בדיסק בפורמט JPEG.

דרישות מוקדמות

לפני הפעלה של 'השהיה ללא תריס', צריך להשתמש ב-isZslSupported() כדי לקבוע אם המכשיר עומד בדרישות הבאות:

במכשירים שלא עומדים בדרישות המינימליות, CameraX תוחזר לערך CAPTURE_MODE_MINIMIZE_LATENCY.

השהיה של אפס תריס זמינה רק בתרחיש לדוגמה של צילום תמונה. לא ניתן להפעיל אותה עבור צילום וידאו או באמצעות תוספי מצלמה. לבסוף, מכיוון ששימוש בתוצאות Flash בזמן אחזור ארוך יותר השהיה של אפס תריס לא פועלת כשהפלאש פועל או במצב אוטומטי. מידע נוסף על הגדרת מצב הפלאש מופיע ב-setFlashMode().

הפעלת השהיה של אפס תריס

כדי להפעיל השהיה של אפס תריס, מעבירים את המתג CAPTURE_MODE_ZERO_SHOT_LAG אל ImageCapture.Builder.setCaptureMode(). אם הפעולה תיכשל, setCaptureMode() יחזור אל CAPTURE_MODE_MINIMIZE_LATENCY.

setFlashMode()

מצב הפלאש שמוגדר כברירת מחדל הוא FLASH_MODE_OFF. כדי להגדיר את מצב הפלאש, משתמשים ב-ImageCapture.Builder.setFlashMode():

צילום תמונה

דוגמת הקוד הבאה מראה איך להגדיר את האפליקציה לצילום תמונה:

Kotlin

val imageCapture = ImageCapture.Builder()
    .setTargetRotation(view.display.rotation)
    .build()

cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture,
    imageAnalysis, preview)

Java

ImageCapture imageCapture =
    new ImageCapture.Builder()
        .setTargetRotation(view.getDisplay().getRotation())
        .build();

cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, imageAnalysis, preview);

שימו לב ש-bindToLifecycle() מחזיר אובייקט Camera. במדריך הזה אפשר למצוא מידע נוסף לגבי שליטה בפלט של המצלמה, כמו זום וחשיפה.

לאחר הגדרת המצלמה, הקוד הבא מצלם תמונה על סמך פעולת משתמש:

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.
            }
       }
    );
}

שיטת צילום התמונה תומכת באופן מלא JPEG. לקוד לדוגמה שמראה איך להמיר Media.Image מפורמט YUV_420_888 ל-RGB אובייקט Bitmap, ראו YuvToRgbConverter.kt.

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

למידע נוסף על CameraX, ניתן לעיין במשאבים הנוספים הבאים.

Codelab

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

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