PracticU

מצלמה - חלק 2 - שמירת קובץ PNG

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

מצלמה - חלק 2 - שמירת קובץ PNG
אפליקציית המצלמה שומרת את התמונה לבד באלבום Camera, אבל אפשר גם לשמור אותה בעצמנו בפורמט דחוס יותר, כדי לחסוך נפח. בשיעור בונים מחלקה שמקבלת Bitmap ושומרת אותו כקובץ PNG.
השלבים העיקריים
1. מחלקה PictureSaver: פונקציה סטטית compressBitmap(Bitmap) שזורקת IOException. משתמשים ב-FileOutputStream בתוך try ו-finally, וב-finally סוגרים אותו אם אינו null.
2. שם ייחודי: שם קבוע כמו pic.png יידרס בכל צילום. לכן פונקציה פרטית מייצרת נתיב מלא מתיקיית Environment.getExternalStoragePublicDirectory עם DIRECTORY_PICTURES, ושם קובץ לפי התאריך והשעה.
3. פורמט השם: SimpleDateFormat עם yyyyMMdd_HHmmss, כאשר אותיות קטנות וגדולות משמעותיות (MM לחודש, mm לדקות, HH לשעה). השם נפתח ב-pic_ ונגמר ב-.png.
4. דחיסה: קוראים ל-bitmap.compress עם הפורמט (PNG, JPEG או WEBP), איכות 0 עד 100 (ב-PNG מתעלמים ממנה, ולכן נותנים 100) ועם ה-FileOutputStream.
5. רענון הגלריה: בלי רענון התמונה לא תופיע עד הפעלה מחדש של המכשיר. לכן קוראים ל-MediaScannerConnection.scanFile עם הקונטקסט, מערך עם הנתיב, ו-null ל-MimeType ול-listener.
6. קריאה מ-MainActivity: אחרי הצגת התמונה קוראים ל-compressBitmap בתוך try/catch, ובשגיאה מציגים Toast.
7. הרשאה: ב-Manifest מוסיפים הרשאת WRITE_EXTERNAL_STORAGE.
תוצאה
במכשיר האמיתי התמונה של אפליקציית המצלמה נשמרה באלבום Camera (בגודל 180 קילובייט), והתמונה של האפליקציה שלנו באלבום Pictures. האיכות והמימדים שלה קטנים יותר והגודל כ-20.57 קילובייט.
כעת אפשר לשמור תמונה שצולמה לקובץ משלנו בפורמט שבחרנו, והיא מופיעה מיד בגלריה.
השיעור הבא בקורס: מצלמה - חלק 3 - צילום מתוך האפליקציה

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

  1. 00:00

    היכן נשמרת התמונה שצולמה

  2. 00:39

    התמונה באלבום Camera בגלריה

  3. 01:18

    מחלקה PictureSaver לשמירה דחוסה

  4. 02:38

    שם קובץ ייחודי לכל תמונה

  5. 03:37

    נתיב לתיקיית Pictures

  6. 04:13

    שם קובץ עם SimpleDateFormat

  7. 06:33

    דחיסה ל-PNG עם Bitmap.compress

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

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

  1. 00:00

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

  2. 00:17

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

  3. 00:35

    אז בואו ניגש לאפליקציית הגלרי לדוגמה, ונראה שאוטומטית התמונה נשמרה באפליקציית הגלרי. בואו ניכנס אליה ונראה את ה-details שלה, ונראה שהיא שמורה בנתיב הזה Storage Emulated 0dSIM Camera, והשם שלה זה IMG והנה התאריך המקורי והשעה שבה התמונה נשמרה.

  4. 01:05

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

  5. 01:25

    אז לצורך כך בואו ניגש ונבנה מחלקה חדשה, בואו נקרא למחלקה הזאת Picture Saver ובואו נבנה בתוך המחלקה פונקציה Public Static Void. נקרא לה Compress Bitmap שמקבלת ביטמאפ ופשוט שומרת אותה בפורמט דחוס יותר.

  6. 01:52

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

  7. 02:08

    בעצם זה לא טריי קאץ', זה טריי פיינלי, כי אנחנו לא רוצים פה לטפל בשגיאה. אז אם פייל output stream הוא שונה מנהל, אנחנו רוצים to close it, ובואו נגדיר שאנחנו זורקים exception כאן ב-throw io exception, ומה שאנחנו רוצים לעשות מתוך זה לארגן איזשהו סטרינג פיין מיימ ולמעשה

  8. 02:40

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

  9. 02:55

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

  10. 03:18

    בואו נקרא לה get full path and find name והפונקציה הזאת פשוט תייצר לנו נתיב מלא ושם קובץ שמכיל בתוכו את התאריך ואת השעה הנוכחיים.

  11. 03:36

    אז איך אנחנו עושים את זה? קודם כל יש לנו את הנתיב, בואו נייצר נתיב לתיקיית ה-images החיצונית, זה היה environment, get external storage public directory ל-environment נקודה, ויש לנו את ה-pictures, הנה יש לנו את הנתיב,

  12. 04:00

    וכעת אנחנו רוצים לייצר את ה-file name, רק כאן אנחנו צריכים להוסיף get absolute path בצורה כזאת, והנה ה-file name ואנחנו רוצים שה-file name יהיה כזה שתלוי בתאריך הנוכחי ובשעה הנוכחית.

  13. 04:25

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

  14. 04:54

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

  15. 05:09

    גם שעה זה hh באותיות גדולות, זה בעצם הפורמט שלהם שהם מגדירים. ויש לנו פה את ה-file name, נעשה יש לנו אותו כאן ואנחנו יכולים מיידית להכניס אליו את simple date format יש לנו את הפורצי הפורמט ואנחנו יכולים לתת לה calendar.getinstance ו-to get time כאן בהתחלה אולי נצרף

  16. 05:42

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

  17. 06:14

    הדבר הבא שאנחנו יכולים לעשות זה לפתוח אובייקט מהפייל output stream ולתת לקונסטרקטור שלו את הפייל ניים. למעשה נקרא לפייל ניים הזה full path and זה יהיה קצת יותר הגיוני כי זה לא רק file name ולאחר מכן אנחנו רוצים לייצר את התמונה הדחוסה למשתנה הביטמאפ יש פונקציה שנקראת קומפרס הפונקציה הזאת מקבלת את הפורמט הדרוש זה יהיה ביטמאפ נקודה

  18. 06:50

    קומפרס פורמט ויש לנו כל מיני פורמטים שזה בעצם הפורמטים של התמונה PNG, JPEG ו-WebP. PNG זה הפורמט הכי איכותי שיש, אז בואו ניקח אותו.

  19. 07:05

    הדבר הבא זה ה-Quality. ל-PNG, בעצם הפורמט PNG לא מתעסק עם ה-Quality הזה, הוא מתעלם ממנו. אבל בכל מקרה הוא 0 עד 100, אז בואו ניתן פשוט 100, אולי בעתיד נשנה את הפורמט של זה שיישאר 100. ומי ה-File Output Stream?

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

ההרצאה הקודמת: מצלמה - חלק 1 - צילום תמונה

ההרצאה הבאה: מצלמה - חלק 3 - צילום מתוך האפליקציה

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

  • שמירת נתונים בתוך קובץ QVD
  • הזזת מצלמה
  • שמירת Payload מוצפן
  • קובץ Manifest

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

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