PracticU

מצלמה - חלק 6 - שמירת קובץ תמונה

בלי כתוביותעם כתוביות
PracticU › קורס פיתוח אפליקציות - לאנדרואיד - Android - ב-JAVA › מצלמה - חלק 6 - שמירת קובץ תמונה
מילון מושגים:
תמונה - קובץ גרפי המוצג על המסך. בהקשר של וירטואליזציה או Docker, תבנית מוכנה שממנה יוצרים מכונה או קונטיינר.
מחלקה - תבנית בתכנות מונחה עצמים שמגדירה אילו נתונים ופעולות יהיו לאובייקטים שנוצרים ממנה.
מערך - מבנה נתונים שמאחסן אוסף ערכים מאותו סוג ברצף, שאפשר לגשת אליהם לפי מספר מיקום (אינדקס).
פונקציה - קטע קוד בעל שם שמבצע משימה מוגדרת, מקבל ערכי קלט (פרמטרים) ויכול להחזיר תוצאה. מאפשרת לארגן קוד ולהשתמש בו שוב.
רכיב - יחידת בניין עצמאית וניתנת לשימוש חוזר בתוך מערכת או ממשק משתמש, שאחראית על חלק מוגדר מהתפקוד.

מצלמה - חלק 6 - שמירת קובץ תמונה
הצעד האחרון בדוגמת המצלמה בתוך האפליקציה הוא לשמור את התמונה לקובץ. משתמשים שוב במחלקה PictureSaver מהשיעורים הקודמים ומתאימים אותה למערך בתים.
השלבים העיקריים
1. היזכרות ב-PictureSaver: הפונקציה, ששמה שונה ל-save, מקבלת Bitmap, כותבת אותו עם FileOutputStream לתיקיית התמונות החיצונית עם שם שנגזר מתאריך ושעה, ומרעננת את הגלריה כדי שהתמונה תופיע מיד, בלי הפעלה מחדש של המכשיר.
2. גרסה למערך בתים: מה שהמצלמה מחזירה הוא מערך בתים ולא Bitmap. לכן משכפלים את הפונקציה לגרסה שמקבלת byte[] pictureBytes, ממירה אותו עם BitmapFactory.decodeByteArray (מהבית הראשון, באורך המערך) וקוראת ל-save עם ה-Bitmap.
3. savePicture במחלקת הרכיב: ב-CameraSurfaceView הפונקציה savePicture קוראת ל-PictureSaver.save עם pictureBytes. מעטפת try/catch מדווחת שגיאה דרך listener.onError אם ה-Listener אינו null.
4. סיבוב התמונה: התמונה נשמרה עומדת ב-90 מעלות. ב-PictureSaver יוצרים Matrix, קוראים ל-postRotate(90) ובונים Bitmap חדש עם Bitmap.createBitmap (מהנקודה 0,0, רוחב וגובה המקור והמטריצה), ושומרים אותו.
בדיקה
אחרי צילום וביטול לא נשמר דבר. אחרי צילום ושמירה התמונה הופיעה בגלריה באלבום Pictures. התמונה הראשונה נשמרה מסובבת ב-90 מעלות, ולאחר הוספת הסיבוב היא נשמרת ישרה.
כעת אפשר להציג את תצוגת המצלמה בתוך האפליקציה, לצלם ולשמור את התמונה לגלריה בכיוון הנכון.

פרקי ההרצאה: מצלמה - חלק 6 - שמירת קובץ תמונה

  1. 00:00

    תזכורת למחלקה PictureSaver

  2. 01:33

    פונקציית save למערך בתים

  3. 02:34

    המרה ל-Bitmap עם decodeByteArray

  4. 03:38

    קריאה לשמירה מתוך CameraSurfaceView

  5. 04:13

    דיווח שגיאות דרך ה-Listener

  6. 04:53

    בדיקת הצילום והשמירה בגלריה

תמלול ההרצאה: מצלמה - חלק 6 - שמירת קובץ תמונה

הטקסט המלא של הדקות הראשונות בהרצאה «מצלמה - חלק 6 - שמירת קובץ תמונה» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    הדבר האחרון שנשאר לנו לעשות בדוגמה של ה-surface view שמציגה את הקאמרה זה לשמור את התמונה. עכשיו, באחד הסרטונים הקודמים הייתה לנו מחלקה שביצעה שמירה ויש לנו בדיוק את המחלקה הזאת כאן בדוגמה הזאת, היא נקראת Picture Saver.

  2. 00:21

    בואו רגע ניכנס למחלקה הזאת ונזכר מה הפעולות שעשינו. אז בנינו איזושהי פונקציה שנקראת Compress Bitmap, שמה שהיא עשתה היא קיבלה אובייקט Bitmap as is, כמו שהוא צולם ויש לנו פה פייל output stream בכדי לכתוב אותו לסטרים כאן קיבלנו איזשהו נתיב לתמונה

  3. 00:43

    כאשר הנתיב בנוי גם מנתיב לתיקיית התמונות החיצונית מה שנקרא external storage וגם שם של קובץ שבנוי מהתאריך הנוכחי והשעה הנוכחית ומה שאנחנו רואים זה שיש לנו כאן איזושהי מכרוזת שבנינו fine name, pick underline עם התאריך והשעה הנוכחיים, ויש לנו כאן החזרה של הנתיב וה-fine name.

  4. 01:12

    זאת אומרת, הפונקציה get full path and fine name פשוט מחזירה לנו שם ייחודי עבור התמונה, פתחנו פה file output stream, שמרנו את התמונה כ-compressed image, ועשינו איזשהו רפרש לדיסק בכדי לראות אותה מיידית.

  5. 01:29

    אם לא היינו עושים את הרפרש הזה, זה לא שהתמונה לא הייתה נשמרת, היא הייתה נשמרת, פשוט היו רואים אותה רק כשהיו עושים ריסטארט למכשיר.

  6. 01:37

    והפקודה הזאת חסכה לנו ריסטארט. אבל מה הבעיה כרגע? אין לנו אובייקט ביטמאפ. יש לנו אובייקט שהוא בעצם מערך בתים מקורי. אז קודם כל בואו נהפוך את השם הזה למילה פשוט סייב.

  7. 01:56

    שיהיה קצת יותר ברור, כי אנחנו פשוט עושים סייבינג פשוט, ונשכפל את הפונקציה הזאת לעוד פונקציה, שהתפקיד של הפונקציה השנייה זה לקבל מערך בתים, בייט, פיקצ'ר בייטס, בדיוק מה שיש לנו, ולשמור את התמונה במערך בתים. זאת אומרת שיש לנו עכשיו שתי פונקציות, אחת שמקבלת ביטמאפ, שזה בסדר כמו מקודם, ואחת שמקבלת מערך בתים,

  8. 02:31

    זה פשוט ההעמסה של הפונקציה הקודמת. אנחנו רוצים לגשת ל-pictureSaver.save הזאת ולתת את המערך בתים. מה אנחנו עושים עם המערך בתים? אנחנו צריכים להמיר אותו ל-bitmap.

  9. 02:45

    אז בואו נפתח פה ביטמאפ ולצורך המראה יש לנו ביטמאפ-factory.decodebyte array הנה ה-picturebytes אנחנו רוצים להתחיל מ- אנחנו רואים offset, זה אומר 0 אנחנו רוצים להתחיל מהבית הראשון ואנחנו רוצים להמיר את כל הבתים זה אומר pictureBytes.length והנה יש לנו עכשיו המרה של הבתים של התמונה לאובייקט ביטמאפ אם יש לנו המרה של אובייקט ביטמאפ אנחנו יכולים

  10. 03:24

    לקרוא לפונקציית save ולשלוח את הביטמאפ כעת אנחנו צריכים לקרוא לפונקציית ה-save הזאת מתוך הקוד שמבצע את השמירה זה היה בקאמרה surface view כאן הייתה לנו פונקציית save picture למה יש את הפונקציה הזאת בתוך אובייקט ה-camera surface view שבנינו ולא מבחוץ?

  11. 03:49

    בגלל שיש לנו כאן את אובייקט התמונה, את הבתים שלה, אז זה כאילו איזשהו שירות שאנחנו מספקים בתור רכיב חיצוני שאנחנו בונים. אוקיי, אז בואו ניגש ל-save picture ונקרא ל-picture saver.save ואנחנו רואים שיש פה שתי העמסות שבנינו וכל מה שאנחנו צריכים

  12. 04:10

    להעביר זה את הפיקצ'ר בייטס ולטפל באקספצ'ן. אז בואו נבצע סראונד וויד וכאשר ישנה שגיאה כל מה שאנחנו צריכים לעשות זה לקרוא לליסנר נקודה און אירו ולשלוח את אובייקט החריגה שיתרחש בדיוק כמו שעשינו פה מקודם.

  13. 04:35

    בואו רק באמת נעשה את הבדיקה הזאת אם הליסנר שונה מנהל. נשמור פה על אחידות אם הליסנר שונה מנהל, זה אומר שרוצים לקבל דיווחי שגיאות ואז אנחנו רק מדווחים את השקיעה שקרתה, ואין לנו פה יותר אקספשן.

  14. 04:54

    בואו בשלב הזה נבדוק את זה, הנה תוכנית רצה, הנה אנחנו רואים את תיבת הציוד המשרדי, בואו נלחץ על צילום, אם אנחנו מבצעים cancel לא קורה כלום, בואו נלחץ שוב פעם, אם אנחנו מבצעים שמירה חזרנו בחזרה אבל אנחנו רוצים לראות אם באמת המערכת שמרה את התמונה.

  15. 05:23

    אז בואו ניגש כעת לגלרי והנה יש לנו כאן את התמונה שנשמרה. בואו ניכנס לאלבום הקאמרה ונראה באלבום הקאמרה שתי תמונות שצילמנו בעבר בסרטונים הקודמים ואנחנו אין לנו מה להתעסק איתם כרגע.

  16. 05:44

    בואו פשוט נבצע סלקט אנחנו לא רוצים שהוא יבלבל

לקורס המלא: קורס פיתוח אפליקציות לאנדרואיד

ההרצאה הקודמת: מצלמה - חלק 5 - הוספת כפתורים

ההרצאה הבאה: השמעת צלילים

הרצאות קשורות מקורסים אחרים

  • שמירת נתונים בתוך קובץ QVD
  • הזזת מצלמה
  • הנדסה חברתית להפוך קובץ EXE לקובץ תמונה JPG - חלק 1
  • הוספת תמונה למוצר

קורסים נוספים במסלול

  • קורס יסודות התכנות - שפת JAVA - קורס ג'אווה למתחילים
  • קורס פיתוח אפליקציות - לאייפון iPhone iOS - ב-Swift-Xcode
  • קורס פלאטר - Flutter - שפת DART של גוגל למובייל - פיתוח אפליקציות לאנדרואיד ואייפון
  • קורס PhoneGap - פיתוח אפליקציות לאנדרואיד ואייפון