[השמעת מוסיקה] ZAMYLA צ'אן: זה היה מיס סקרלט עם פמוט. מי עשה? ובכן, אנחנו הולכים לגלות. ברמז משחק לוח, ייתכן יינתן תמונה אדומה פיזית. והתמונה שהיא מאוד אדומה ו פצעונים, והתפקיד שלך הוא לחשוף את המסר החבוי. ובדרך כלל אתה מסופק עם אדום זכוכית מגדלת, או מסך אדום עולה כי מסר סמוי. ובכן, אנחנו הולכים לחקות את זה. במי עשה, אתה נתון תמונת מפת סיביות זה נראה מאוד לא יציב ואדום, ולאחר מכן להפעיל את התכנית מי עשה כדי לחשוף את מסר חבוי. אז בואו לשבור את זה לשלבים. ראשית, אתה רוצה לפתוח את הקובץ - מושג שאתה כבר נתון. ולאחר מכן גם ליצור קובץ מפת סיביות פסק דין. אז אתה רוצה לעדכן את מפת הסיביות כותרת מידע לoutfile פסק הדין. עוד על כך בהמשך. ואז אתה הולך לקרוא ל רמז, scanline, על ידי פיקסל פיקסל, שינוי צבעי פיקסל כ צורך בכך, וכתיבה אלה לגזר הדין - על ידי פיקסל פיקסל לתוך scanline פסק דין. איך אפשר להתחיל ללכת על זה? ובכן, למזלנו, יש לנו copy.c בקוד ההפצה. וזה הולך להוכיח די שימושי לנו. Copy.c פתח קובץ, קורא שב הכותרת של infile, ולאחר מכן מעדכנת את הכותרת של outfile. ולאחר מכן הוא קורא כל פיקסל ב scanline, על ידי פיקסל פיקסל, ולאחר מכן כותב פיקסל שלoutfile. לכן, אולי הצעד הראשון שלך יהיה להפעיל את הפעולות הבאות הפקודה בטרמינל - cp copy.c whodunit.c. הפעולה זו תיצור עותק של copy.c שם whodunit.c. אז הצעד הראשון שלנו כדי לפתוח את קובץ, טוב, יש מדויק העתק מדויק של שבcopy.c. אז אני אשאיר אתכם להסתכל על זה. עם מה שיש לנו עסק בPSET זה אני קובץ / O, בעצם לוקח את הקבצים, קריאה, כתיבה, עריכתם. איך פותח קובץ ראשון? ובכן, אתה הולך להכריז על קובץ מצביע, ואז אתה קורא fopen פונקציה. תעבור בדרך, או את שמו של ש קובץ, ולאחר מכן במצב שאתה רוצה כדי לפתוח קובץ שבו עובר בr ייפתח foo.bmp לקריאה. ואילו fopen עם עובר בw יהיה bar.bmp הפתוח, לכתיבה לקובץ ו למעשה לערוך אותו. אז עכשיו שאנחנו כבר פתחנו את הקובץ, שלנו השלב הבא הוא לעדכן את מידע הכותרת העליונה לoutfile. מה מידע כותרת עליונה? ובכן, דבר ראשון שאנחנו צריכים לדעת מה היא מפת סיביות. מפת סיביות היא רק פשוטה הסדר של בתים. והם הכריזו בקובץ זה כאן, bmp.h, עם חבורה של מידע של מה מפת סיביות מורכב למעשה מ. אבל מה שבאמת אכפת לנו הוא כותרת קובץ מפת סיביות, ממש כאן, ו כותרת מפת הסיביות המידע, כאן. הכותרת מורכבת מכמה משתנים שיוכיחו שימושי מאוד. יש biSizeImage, שהוא גודל כולל של התמונה בבתים. וזה כולל פיקסלים וריפוד. הריפוד הוא מאוד חשוב, אבל עוד נגיע לכך בהמשך. BiWidth מייצג את הרוחב תמונה בפיקסלים מינוס הריפוד. BiHeight הוא לאחר מכן גם את הגובה של התמונה בפיקסלים. ולאחר מכן BITMAPFILEHEADER ו BITMAPINFOHEADER, כפי שציינתי מוקדם יותר, אלה מיוצגים כstructs. אז, אתה לא יכול לגשת לכותרת הקובץ עצמו, אבל אתה רוצה להגיע ל אלה משתנים בפנים. על אישור. אז איך לעדכן את המידע בכותרת? ובכן, דבר ראשון שאנחנו צריכים לראות אם אנחנו צריך לשנות את כל מידע מ infile, הרמז, כדי outfile, את פסק הדין. האם משהו משתנה במקרה זה? ובכן, לא ממש, כי אנחנו הולכים להיות רק משנה את הצבעים. אנחנו לא הולכים להיות שינוי הקובץ גודל, גודל התמונה, את הרוחב, או הגובה. אז אתה בסדר לעת עתה על ידי פשוט מעתיק כל פיקסל. על אישור. אז עכשיו בואו נסתכל על איך שאנחנו באמת יכול לקרוא כל פיקסל מהקובץ. קובץ נוסף שאני / פונקצית O יבוא לידי ביטוי - fread. זה לוקח במצביע לstruct שיכיל את הבתים ש אתה קורא. אז אתה קורא לזה. ואז אתה עובר בגודל, שהוא גודלו של כל אלמנט שאתה רוצה לקרוא. הנה, sizeof הפונקציה יהיה שימושי. ואז אתה עובר במספר, שבו מייצג את מספר האלמנטים של גודל לקרוא. ולבסוף, inptr, שהוא מצביע הקובץ שאתה הולך לקרוא מ. אז כל אלה הם המרכיבים בתוך inptr והם הולכים לנתונים. בואו נסתכל על דוגמא קטנה. אם אני רוצה לקרוא לנתוני שני כלבים, טוב, אני יכול לעשות את זה באחת משתי דרכים. אני יכול גם לקרוא בשני עצמים בגודל כלב מinptr שלי, או שאני יכול לקרוא באובייקט אחד בגודל של שני כלבים. אז אתה רואה שבהתאם לדרך לך שתסדר גודל ומספר, אתה יכול לקרוא באותו מספר הבתים. אז עכשיו, בואו נשנה צבע פיקסל כמו שאנחנו צריכים. אם תסתכל שוב בbmp.h, ולאחר מכן אתה תראה שבתחתית RGBTRIPLEs הוא struct אחר, שבו הם מורכבים משלושה בתים. אחד, rgbtBlue, rgbtGreen, וrgbtRed. אז כל אחד מהם מייצג את הכמות של כחול, כמות ירוקה, ו סכום של אדום בתוך פיקסל זה, שבו כל סכום מיוצג על ידי מספר הקסדצימלי. אז ff0000 יהיה בצבע כחול, כי זה הולך מכחול, לירוק, ואדום. ואז כל של f יהיה לבן. בואו נסתכל על smiley.bmp, אשר יש לך בקוד ההפצה שלך. אם אתה פותח אותו רק תמונה צופה, אז אתה רק לראות סמיילי אדום. אבל לוקח צלילה עמוקה יותר ב, אנחנו רואה שהמבנה מזה רק פיקסלים. יש לנו פיקסלים לבנים, ולאחר מכן פיקסלים אדומים. כל לבן, ffffff, ולאחר מכן פיקסלים אדומים שצבוע בבשבילך כאן, ואתה רואה שהם 0000FF. אפס כחול, אפס ירוק, ואדום מלא. ומכיוון שסמיילי הוא רחב שמונה פיקסלים, אין לנו כל ריפוד. בסדר. אז אם אני היה להקצות ערכים שונים לRGBTRIPLE ורציתי לעשות את זה ירוק, אז מה הייתי עושה הוא אני אכריז RGBTRIPLE, בשם משולש, ולאחר מכן לגשת לכל בתים בתוך שאני struct ישתמש מפעיל הנקודה. אז triple.rgbtBlue, אני יכול להקצות של -0. גרין אני יכול להקצות אותו למלא - כל מספר, באמת, בין 0 ל FF. ולאחר מכן אדום, אני גם הולך להגיד 0. אז זה נותן לי פיקסל ירוק. בשלב הבא, מה אם אני רוצה לבדוק את הערך של משהו? יש לי משהו שיכולים בודק אם ערך rgbtBlue של המשולש הוא ff ולאחר מכן להדפיס, "אני מרגיש כחול! ", כתוצאה מכך. עכשיו, זה לא בהכרח אומר שפיקסל כחול, נכון? מכיוון שערכים הירוקים ואדום של פיקסל יכול להיות גם שאינם 0 ערכים. כל מה שזה אומר, וכל זה זו בדיקה היא לצבע כחול מלא. אבל כל הפיקסלים יכולים להיות גם חלקיים ערכי צבע, כמו זו הדוגמא הבאה כאן. זה קצת קשה יותר לראות מה הדימוי הזה הוא עכשיו. זה נראה קצת יותר כמו clue.bmp שיינתן לך. עכשיו, מבחינה פיזית, אתה יכול לפתור את זה, בגלל שיש הרבה אדום, על ידי מרים את מסך אדום לתמונה כך שהצבעים האחרים יכולים להופיע. אז איך אנחנו מחקים את זה עם ג? ובכן, אנחנו יכולים להסיר את כל אדומים מהתמונה לחלוטין. וכך לעשות את זה היינו להגדיר בכל הערך האדום של פיקסל ל0. וכך התמונה הייתה נראית קצת קצת כמו זה, שבו אין לנו אדום שהיא. אנחנו יכולים לראות את המסר הסמוי קצת יותר ברור עכשיו. זה עוד פרצוף מחייך. או שאולי אנחנו יכולים להשתמש בשיטה אחרת. אולי, אנחנו יכולים לזהות כל הפיקסלים האדומים - כי כל פיקסלים עם הוא, 0 כחול, 0 ירוק, ו0 אדומים - ולשנות אותם לצבע לבן. והתמונה שלנו עשויה להיראות משהו כזה. יותר קל קצת לראות. יש המון דרכים אחרות כדי לחשוף המסר הסודי, כמו גם, התמודדות עם המניפולציה הצבע. אולי אתה יכול להשתמש באחת מהשיטות שהזכרתי לעיל. ובנוסף, ייתכן שתרצה כדי לשפר כמה צבעים ולהביא אותם החוצה. אז עכשיו שאנחנו כבר שינינו את פיקסל צבע, הבא אנחנו רק צריכים לכתוב אותם לscanline, על ידי פיקסל פיקסל. ושוב, אתה רוצה להסתכל אחורה לcopy.c, אם לא יועתק את זה כבר, ומסתכל fwrite פונקציה, אשר לוקחת נתונים, מצביע לstruct שמכיל את הבתים שאתה קורא מ, בגודל של הפריטים, מספר פריטים, ולאחר מכן outptr - היעד של קבצים אלה. אחרי שאתה כותב בפיקסלים, תוכל גם צריך לכתוב בריפוד. מהו ריפוד? ובכן, כל פיקסל rgbt אורך שלושה בתים. אבל, scanline לתמונת מפת סיביות צריך להיות כפול של ארבעה בתים. ואם מספר הפיקסלים אינו כפול של ארבעה, ואז אנחנו צריכים להוסיף הריפוד הזה. ריפוד הוא רק מיוצג על ידי 0s. אז, איך אנחנו כותבים, או לקרוא את זה? ובכן, מתברר שאתה לא יכול ריפוד fread ממש, אבל אתה יכול לחשב את זה. במקרה זה, את הרמז ואת פסק הדין יש את אותו רוחב, כך ריפוד הוא אותו הדבר. והריפוד, כפי שתראה בcopy.c, מחושב עם הנוסחה הבאה - sizeof הפעמים bi.biWidth (RGBTRIPLE) יהיה לתת לנו כמה בתים bmp יש בכל שורה. משם, modulos והורדות עם 4 יכולים לחשב כמה יש להוסיף בייטים רבים, כך מספר רב של בתים על כל שורה היא ארבע. עכשיו שיש לנו את הנוסחה ל כמה ריפוד שאנחנו צריכים, עכשיו אנחנו יכולים לכתוב את זה. עכשיו, שציינתי קודם, ריפוד הוא רק 0s. אז במקרה הזה, אנחנו רק לשים char, במקרה הזה 0, לתוכנו outptr - outfile שלנו. כך שיכול להיות רק fputc 0, פסיק outptr. אז, בזמן שאנחנו היית קוראים לשלנו קובץ, שהקובץ / O שמרה על מסלול שלנו עמדה באותם קבצים עם משהו נקרא מחוון מיקום קובץ. תחשוב על זה כסמן. בעיקרון, זה מקדם בכל פעם כי אנחנו fread, אבל יש לנו שליטה על זה, יותר מדי. כדי להזיז את מחוון מיקום קובץ, אתה יכול להשתמש בfseek הפונקציה. איפה inptr מייצג את הקובץ מצביע שאתם מחפשים ב, סכום הוא מספר הבתים שאתה רוצה להזיז את הסמן, ולאחר מכן מ מתייחס לנקודת ההתייחסות ממקום שבי הסמן שלך הוא. אם אתה עובר בSEEK_CUR, כי מייצג את הזרם עמדה בקובץ. או שאתה יכול להשתמש בכמה פרמטרים אחרים. לכן, אולי תרצו להשתמש fseek לדלג על הריפוד של קובץ ב. ושוב, אם אתה תקוע, יש דוגמא לכך בcopy.c. אז עכשיו יש לנו פתחתי את הקובץ, את הרמז, ואת פסק הדין. שנעדכן את המידע לכותרת שלנו פסק דין, כי בכל מפת סיביות זקוקה לכותרת. אז יש לנו לקרוא לתוך מושג של scanline, על ידי פיקסל פיקסל, לשנות כל צבע במידת צורך, ו כותב אותם לתוך פסק דין, על ידי פיקסל פיקסל. ברגע שאתה פותח את פסק דין, אתה יכול לראות מי האשם, או מה הסוד מסר הוא. השם שלי הוא Zamyla, ו זה היה מי עשה.