>> [השמעת מוסיקה]
>> ZAMYLA צ'אן: המכה בואו דברים עם שינוי גודל.
בשינוי הגודל, המשתמש יעבור ב, באמצעות בשורת הפקודה, תמונת מפת סיביות ש
הם רוצים אותך לשנות את קנה מידה על ידי מספר שהם גם עוברים ב,
בשורת הפקודה.
איך עושה את זה?
>> ובכן, הדבר ראשון, בוא לשבור את זה לשלבים.
אתה הולך רוצה לפתוח infile שהם נותנים לך, כמו גם
ליצור ולפתוח את outfile כי אתה הולך לשים את
גודל תמונה פנימה
ואז, בגלל שאתה שינוי גודל, ו כי זה מפת סיביות, זה כותרת, ולכן
אתה הולך גם לעדכן את הכותרת מידע outfile,
וכותב שפנימה
לאחר מכן, אתה הולך לקרוא לתוך scanline של infile,
פיקסל אחר פיקסל, שינוי גודל אופקי וכתיבת פיקסלים אלה לתוך
outfile, כמפורט בקנה המידה של המשתמש.
>> אתה הולך לזכור להוסיף ריפוד בהתאם לצורך.
עוד על כך בהמשך.
ואז, גם לשנות את גודל בצורה אנכית.
על אישור.
אז זה הולך להיות קצת יותר מסובך מאשר מי עשה את זה, אבל
מה דומה הוא copy.c שתהיה, שוב, להיות שימושי מאוד.
זכור כי copy.c פתח קובץ, מעדכן את מידע הכותרת העליונה עבור
outfile, אז קורא לscanline, פיקסל אחר פיקסל, כותב כל פיקסל
לscanline של קובץ הפלט.
>> אז שוב, אולי הצעד הראשון שלך כנראה להיות לcp, copy.c, resize.c
לתוך ספריית PSET5 שלך.
זכור זאת, לפני שתעתיק אותה, כדי לוודא שאתה מבין
copy.c מאוד ביסודיות.
על אישור.
>> אז בואו לפתוח את קובץ.
אתה יודע איך לעשות את זה.
אני הולך להשאיר לך את זה.
בשלב הבא, לעדכן את מידע הכותרת לoutfile.
כי יש לנו מפת סיביות חדשה, יש לנו מידע על כותרת חדשה.
מה השתניתי כאן?
ובכן, גודל הקובץ עומד להשתנות כי אנחנו הולכים להיות יותר
פיקסלים מאשר בעבר.
גודל התמונה הוא, ובכך, גם הולך להשתנות, כפי שהוא
רוחב והגובה.
>> אז איזה משתנה הם אלה בדיוק,?
ובכן, אם אתה מסתכל לתוך הכותרת מידע, שאתה רואה שיש
biSizeImage, המייצג את סך גודל התמונה בבתים,
כולל פיקסלים וריפוד.
biWidth הוא הרוחב של התמונה בפיקסלים, מינוס הריפוד.
biHeight הוא הגובה של התמונה בפיקסלים.
ולכן אלה הכלולים ב structs BITMAPFILEHEADER ו
BITMAPINFOHEADER.
אתה יכול להגיד איזה מהם הוא שעל ידי הולך bmp.h ומסתכל על
struct BITMAPINFOHEADER וראייה שמשתנים מופיעים שם.
>> אז כדי לעדכן את כותרת outfiles מידע, שאתה הולך רוצה
לשנות אותם הערכים של גובה והרוחב.
אבל רוב הסיכויים הם, אתה אולי צריך קצת של מידע הכותרת של infile
מאוחר יותר, כך הטוב ביותר כדי לעקוב אחר שניהם.
אבל להיות מאוד ברור עם המשתנה שלך שמות, כך שאתה לא בטעות
לכתוב הערכים שגויים ב הכותרת לoutfile.
>> אז עכשיו בואו ניגשנו לקריאה לתוך פיקסל אחר פיקסל scanline.
שוב, אנחנו הולכים להפוך לנאמן שלנו קובץ I / O ספרייה, ומסתכל על
פונקצית fread.
fread לוקחת במצביע למבנה שיכיל את הבתים ש
אתה קורא ב, גודלו של כל אלמנט שאתה קורא -
שוב, sizeof הולך להיות שימושי לתפקד כאן, מספר
אלמנטים של גודל, גודל, כי אתה קריאה ב, ולבסוף,
inpointer, הקובץ ש אתה קורא מ.
אז אתה לוקח אלמנטים מספר של גודל מinpointer, ו
מכניס אותם לתוך הנתונים.
>> עכשיו זה זמן לשינוי גודל אופקי.
אם n שווה 2, ולאחר מכן עבור כל פיקסל ב infile, אנחנו הולכים לכתוב את זה
פעמיים בoutfile.
איך אפשר לכתוב קבצים?
ובכן, יש לנו את פונקצית fwrite, כך אנו לוקחים את המצביע לstruct
המכיל את הבתים שאתה כתיבה מ, ולאחר מכן אנחנו עוברים ב
גודל, מספר, והפלט, שבו אתה הולך לכתוב את זה.
ואז לחזור על תהליך, יהיה איטרטיבי פשוט מסוגל ללולאה.
>> אבל אנחנו צריכים לזכור להוסיף ריפוד פנימה
הרעיון של ריפוד הוא כי, טוב, כל פיקסל הוא שלושה ביסים, אבל
גודלו של כל חייב scanline להיות כפול של 4 בתים.
אז אם מספר הפיקסלים אינו כפול של 4, אנחנו צריכים להוסיף קצת
ריפוד, וזה רק אפסים.
עכשיו, שלא כמו מי עשה את זה, ושלא כמו עותק, ולאחר מכן תמונת infile ו
קובץ outfile שיש שונה ריפוד שונה כיוון שהם
מידות רוחב שונים.
>> על אישור.
אז אולי נוסחה היית לבוא שימושי כאן.
אני אשאיר לך את זה כדי לגלות את זה, אבל להגיד לך את זה, לכתוב את הריפוד,
טוב, זה רק פונקצית fputc פשוטה, עובר בתו
שאתה רוצה לכתוב, ולאחר מכן את מצביע הקובץ שאתה
רוצה לכתוב ל.
אז עכשיו שאנחנו כבר לשנות את גודל אופקי, ולאחר מכן השתמש בריפוד,
זכור כי אתה צריך להעביר את הקובץ שלך מחוון מיקום, כי אתה
לא יכול fread לריפוד.
אז אתה רוצה לוודא כי הקובץ שלך מחוון מיקום בinfile
הוא בנקודה הנכונה.
כי אנחנו גם רוצים לשנות את הגודל בצורה אנכית.
אנחנו לא יכולים פשוט למתוח אותו בצורה אופקית, כי כל הצרכים שורה
להיות מועתק פעמים n.
>> עכשיו, יש כמה שונה דרכים לעשות את זה.
אז אחד, אנחנו יכולים להשתמש בשיטה שכתוב, ב שאנחנו זוכרים את כל פיקסלים
של שורת נתונה במערך, ו אז אנחנו כותבים מערך שכ
פעמים רבות בהתאם לצורך.
או שיש שיטה להעתיק מחדש שבו, אחרי שקראתי בשורה אחת בinfile
ולאחר מכן כותב כי לoutfile, הוספת הריפוד, אנו fseek
בחזרה להתחלה של השורה המקורית, ולאחר מכן לחזור על אופקי
שינוי גודל משם.
ללא קשר לשיטה, אם כי, אתה רוצה שכל פיקסל להיות חוזר ונשנה
n פעמים, ובכל שורה תהיה חזר פעמים n גם כן.
>> עם זה, יהיה לך מפת סיביות גדול מחיים.
השם שלי הוא Zamyla, וזה CS50.