
compressBitmap(Bitmap) שזורקת IOException. משתמשים ב-FileOutputStream בתוך try ו-finally, וב-finally סוגרים אותו אם אינו null.pic.png יידרס בכל צילום. לכן פונקציה פרטית מייצרת נתיב מלא מתיקיית Environment.getExternalStoragePublicDirectory עם DIRECTORY_PICTURES, ושם קובץ לפי התאריך והשעה.SimpleDateFormat עם yyyyMMdd_HHmmss, כאשר אותיות קטנות וגדולות משמעותיות (MM לחודש, mm לדקות, HH לשעה). השם נפתח ב-pic_ ונגמר ב-.png.bitmap.compress עם הפורמט (PNG, JPEG או WEBP), איכות 0 עד 100 (ב-PNG מתעלמים ממנה, ולכן נותנים 100) ועם ה-FileOutputStream.MediaScannerConnection.scanFile עם הקונטקסט, מערך עם הנתיב, ו-null ל-MimeType ול-listener.compressBitmap בתוך try/catch, ובשגיאה מציגים Toast.WRITE_EXTERNAL_STORAGE.הטקסט המלא של הדקות הראשונות בהרצאה «מצלמה - חלק 2 - שמירת קובץ PNG» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
בסרטון הקודם הצלחנו לצלם תמונה ולהציג אותה. בסרטון הזה אנחנו הולכים לראות האם התמונה נשמרת בתוך המכשיר, אם כן איפה, ואיך אנחנו יכולים לשמור אותה בעצמנו בפורמט שהוא דחוס יותר מהפורמט המקורי.
כי יכול להיות שברצוננו קצת לצמצם אותה מבחינת זיכרון, מבחינת נפח של קובץ וכדומה. אז קודם כל בואו ניגש למכשיר האמיתי, והתמונה שצילמנו הייתה תמונה של התיבה של הציוד המשרדי שלי.
אז בואו ניגש לאפליקציית הגלרי לדוגמה, ונראה שאוטומטית התמונה נשמרה באפליקציית הגלרי. בואו ניכנס אליה ונראה את ה-details שלה, ונראה שהיא שמורה בנתיב הזה Storage Emulated 0dSIM Camera, והשם שלה זה IMG והנה התאריך המקורי והשעה שבה התמונה נשמרה.
אוקיי, אז אנחנו רואים שאוטומטית התמונה הזאת שמורה והיא שמורה באלבום שנקרא קאמרה. סבבה. אנחנו עכשיו רוצים לראות איך אנחנו יכולים לבצע איזשהו קטע קוד ששומר אותה בעצמנו בפורמט שהוא דחוס יותר.
אז לצורך כך בואו ניגש ונבנה מחלקה חדשה, בואו נקרא למחלקה הזאת Picture Saver ובואו נבנה בתוך המחלקה פונקציה Public Static Void. נקרא לה Compress Bitmap שמקבלת ביטמאפ ופשוט שומרת אותה בפורמט דחוס יותר.
אז אם אנחנו רוצים להתעסק עם קובץ ולשמור קובץ אז יש לנו כמובן את File Output Stream. בואו נגדיר אותו כנ"ל. בואו נבצע טריי קאץ' כמו שהיה לנו כשהתעסקנו עם שמירת קבצים.
בעצם זה לא טריי קאץ', זה טריי פיינלי, כי אנחנו לא רוצים פה לטפל בשגיאה. אז אם פייל output stream הוא שונה מנהל, אנחנו רוצים to close it, ובואו נגדיר שאנחנו זורקים exception כאן ב-throw io exception, ומה שאנחנו רוצים לעשות מתוך זה לארגן איזשהו סטרינג פיין מיימ ולמעשה
אנחנו לא רוצים איזשהו שם קבוע נקודה פיק נקודה פי אנד ג'י לדוגמה מפני שאם אנחנו ניקח שם קבוע אז כמובן כל פעם שאנחנו נצלם תמונה אנחנו נדרוס את התמונה הקודמת.
מה שאנחנו רוצים לעשות זה לייצר איזשהו שם שכמו שראינו מקודם במערכת הוא מכיל בתוכו את התאריך ואת השעה הנוכחיים. אז בואו ניגש ונייצר לעצמנו איזושהי פונקציה פריווט סטטיק תספיק לנו שתחזיר סטרינג.
בואו נקרא לה get full path and find name והפונקציה הזאת פשוט תייצר לנו נתיב מלא ושם קובץ שמכיל בתוכו את התאריך ואת השעה הנוכחיים.
אז איך אנחנו עושים את זה? קודם כל יש לנו את הנתיב, בואו נייצר נתיב לתיקיית ה-images החיצונית, זה היה environment, get external storage public directory ל-environment נקודה, ויש לנו את ה-pictures, הנה יש לנו את הנתיב,
וכעת אנחנו רוצים לייצר את ה-file name, רק כאן אנחנו צריכים להוסיף get absolute path בצורה כזאת, והנה ה-file name ואנחנו רוצים שה-file name יהיה כזה שתלוי בתאריך הנוכחי ובשעה הנוכחית.
אז לצורך כך יש לנו בג'אווה מחלקה שנקראת simple date format, בואו נייצר ממנה אובייקט simple date format וניתן לקונסטרקטור את הפורמט הדרוש. הפורמט הדרוש זה שנה, חודש, יום, קו תחתון, שעה, דקה, שנייה.
שימו לב לאותיות טונות גדולות, זה פשוט ההגדרה של המערכת, שחודש זה אם-אם באותיות גדולות, כי לדוגמה דקה זה אם-אם באותיות טונות.
גם שעה זה hh באותיות גדולות, זה בעצם הפורמט שלהם שהם מגדירים. ויש לנו פה את ה-file name, נעשה יש לנו אותו כאן ואנחנו יכולים מיידית להכניס אליו את simple date format יש לנו את הפורצי הפורמט ואנחנו יכולים לתת לה calendar.getinstance ו-to get time כאן בהתחלה אולי נצרף
pick underline ובסוף נשרשר את זה עם png לבסוף אנחנו יכולים כבר בשלב הזה להחזיר את הפאט' משורשר עם סלאש ועם הפייל ניים. אנחנו רוצים לגשת ולקרוא לפונקציה הזאת כאן, והנה כבר יש לנו פייל ניים שמאוגד בתוכו התאריך והשעה.
הדבר הבא שאנחנו יכולים לעשות זה לפתוח אובייקט מהפייל output stream ולתת לקונסטרקטור שלו את הפייל ניים. למעשה נקרא לפייל ניים הזה full path and זה יהיה קצת יותר הגיוני כי זה לא רק file name ולאחר מכן אנחנו רוצים לייצר את התמונה הדחוסה למשתנה הביטמאפ יש פונקציה שנקראת קומפרס הפונקציה הזאת מקבלת את הפורמט הדרוש זה יהיה ביטמאפ נקודה
קומפרס פורמט ויש לנו כל מיני פורמטים שזה בעצם הפורמטים של התמונה PNG, JPEG ו-WebP. PNG זה הפורמט הכי איכותי שיש, אז בואו ניקח אותו.
הדבר הבא זה ה-Quality. ל-PNG, בעצם הפורמט PNG לא מתעסק עם ה-Quality הזה, הוא מתעלם ממנו. אבל בכל מקרה הוא 0 עד 100, אז בואו ניתן פשוט 100, אולי בעתיד נשנה את הפורמט של זה שיישאר 100. ומי ה-File Output Stream?