התרחיש לדוגמה של צילום תמונות מיועד לצילום ברזולוציה גבוהה, לתמונות באיכות גבוהה ולספק איזון לבן אוטומטי, חשיפה אוטומטית פונקציונליות של מיקוד אוטומטי (3A), בנוסף לפקדים ידניים פשוטים של המצלמה. המתקשר/ת אחראי/ת להחליט איך להשתמש בתמונה שצולמה, כולל האפשרויות הבאות:
takePicture(Executor, OnImageCapturedCallback)
: השיטה הזו יוצרת מאגר זמני בזיכרון של התמונה שצולמה.takePicture(OutputFileOptions, Executor, OnImageSavedCallback)
: השיטה הזו שומרת את התמונה שצולמה במיקום הקובץ שצוין.
יש שני סוגים של קובצי הרצה שניתן להתאים אישית שבהם ImageCapture
פועל,
את מפעיל הקריאה החוזרת (callback) ואת מפעיל ה-IO.
- קובץ הקריאה החוזרת (callback) הוא הפרמטר של השיטות
takePicture
. זה כן משמש להפעלתOnImageCapturedCallback()
שסופק על ידי המשתמש. - אם המתקשר בוחר לשמור את התמונה במיקום קובץ, ניתן לציין
מוציא לפועל שיבצע את הזמנת הקמפיין. כדי להגדיר את מפעיל ה-IO, יש להתקשר
ImageCapture.Builder.setIoExecutor(Executor)
אם האופרטור חסר, CameraX יוגדר כברירת מחדל לביצוע IO פנימי עבור את המשימה.
הגדרת צילום תמונה
צילום התמונות מספק פקדים בסיסיים לצילום תמונות, כמו Flash, מיקוד אוטומטי רציף, השהיה אפסית ועוד.
setCaptureMode()
שימוש ב-ImageCapture.Builder.setCaptureMode()
כדי להגדיר את מצב הצילום בזמן צילום תמונה:
CAPTURE_MODE_MINIMIZE_LATENCY
: אופטימיזציה של צילום תמונות לזמן אחזור.CAPTURE_MODE_MAXIMIZE_QUALITY
: אופטימיזציה של צילום תמונות לשיפור איכות התמונה.
ברירת המחדל של מצב הצילום היא CAPTURE_MODE_MINIMIZE_LATENCY
.
מידע נוסף זמין במשאבי העזרה של setCaptureMode()
.
השהיה של אפס תריס
החל מגרסה 1.2, השהיה ללא תריס (CAPTURE_MODE_ZERO_SHOT_LAG
) זמינה כמצב צילום.
כשהתכונה 'השהיה ללא תריס' מופעלת, זמן האחזור מצטמצם משמעותית בהשוואה למצב הצילום שמוגדר כברירת מחדל, CAPTURE_MODE_MINIMIZE_LATENCY
, כך שלא תפספסו אף תמונה.
השהיה של אפס תריס משתמש במאגר נתונים זמני ומאחסן את שלושת הפריימים האחרונים של הצילום. כשמשתמש לוחץ על לחצן הצילום, CameraX מפעיל את takePicture()
, ומאגר הנתונים הזמני של הצלצול מאחזר את הפריים שצולמה באמצעות חותמת הזמן הקרובה ביותר לזו של לחיצה על הלחצן. לאחר מכן, CameraX מעבד מחדש את סשן הצילום כדי ליצור תמונה מאותה פריים, שנשמרת בדיסק בפורמט JPEG.
דרישות מוקדמות
לפני הפעלה של 'השהיה ללא תריס', צריך להשתמש ב-isZslSupported()
כדי לקבוע אם המכשיר עומד בדרישות הבאות:
- מוגדר טירגוט ל-Android מגרסה 6.0 ואילך (רמת API 23 ומעלה).
- תומכת בעיבוד מחדש של
PRIVATE
.
במכשירים שלא עומדים בדרישות המינימליות, 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()
:
FLASH_MODE_ON
: הפלאש פועל תמיד.FLASH_MODE_AUTO
: הפלאש מופעל אוטומטית לצילום בתאורה חלשה.
צילום תמונה
דוגמת הקוד הבאה מראה איך להגדיר את האפליקציה לצילום תמונה:
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
דוגמת קוד