1 00:00:00,000 --> 00:00:10,210 >> [השמעת מוסיקה] 2 00:00:10,210 --> 00:00:13,320 >> ZAMYLA צ'אן: המכה בואו דברים עם שינוי גודל. 3 00:00:13,320 --> 00:00:17,710 בשינוי הגודל, המשתמש יעבור ב, באמצעות בשורת הפקודה, תמונת מפת סיביות ש 4 00:00:17,710 --> 00:00:21,860 הם רוצים אותך לשנות את קנה מידה על ידי מספר שהם גם עוברים ב, 5 00:00:21,860 --> 00:00:23,770 בשורת הפקודה. 6 00:00:23,770 --> 00:00:24,690 איך עושה את זה? 7 00:00:24,690 --> 00:00:28,270 >> ובכן, הדבר ראשון, בוא לשבור את זה לשלבים. 8 00:00:28,270 --> 00:00:31,510 אתה הולך רוצה לפתוח infile שהם נותנים לך, כמו גם 9 00:00:31,510 --> 00:00:35,560 ליצור ולפתוח את outfile כי אתה הולך לשים את 10 00:00:35,560 --> 00:00:38,020 גודל תמונה פנימה 11 00:00:38,020 --> 00:00:42,050 ואז, בגלל שאתה שינוי גודל, ו כי זה מפת סיביות, זה כותרת, ולכן 12 00:00:42,050 --> 00:00:46,080 אתה הולך גם לעדכן את הכותרת מידע outfile, 13 00:00:46,080 --> 00:00:47,950 וכותב שפנימה 14 00:00:47,950 --> 00:00:51,850 לאחר מכן, אתה הולך לקרוא לתוך scanline של infile, 15 00:00:51,850 --> 00:00:56,890 פיקסל אחר פיקסל, שינוי גודל אופקי וכתיבת פיקסלים אלה לתוך 16 00:00:56,890 --> 00:01:00,910 outfile, כמפורט בקנה המידה של המשתמש. 17 00:01:00,910 --> 00:01:03,940 >> אתה הולך לזכור להוסיף ריפוד בהתאם לצורך. 18 00:01:03,940 --> 00:01:05,400 עוד על כך בהמשך. 19 00:01:05,400 --> 00:01:07,790 ואז, גם לשנות את גודל בצורה אנכית. 20 00:01:07,790 --> 00:01:08,890 על אישור. 21 00:01:08,890 --> 00:01:13,280 אז זה הולך להיות קצת יותר מסובך מאשר מי עשה את זה, אבל 22 00:01:13,280 --> 00:01:18,310 מה דומה הוא copy.c שתהיה, שוב, להיות שימושי מאוד. 23 00:01:18,310 --> 00:01:23,160 זכור כי copy.c פתח קובץ, מעדכן את מידע הכותרת העליונה עבור 24 00:01:23,160 --> 00:01:28,250 outfile, אז קורא לscanline, פיקסל אחר פיקסל, כותב כל פיקסל 25 00:01:28,250 --> 00:01:30,510 לscanline של קובץ הפלט. 26 00:01:30,510 --> 00:01:37,040 >> אז שוב, אולי הצעד הראשון שלך כנראה להיות לcp, copy.c, resize.c 27 00:01:37,040 --> 00:01:40,560 לתוך ספריית PSET5 שלך. 28 00:01:40,560 --> 00:01:43,920 זכור זאת, לפני שתעתיק אותה, כדי לוודא שאתה מבין 29 00:01:43,920 --> 00:01:46,600 copy.c מאוד ביסודיות. 30 00:01:46,600 --> 00:01:47,620 על אישור. 31 00:01:47,620 --> 00:01:49,880 >> אז בואו לפתוח את קובץ. 32 00:01:49,880 --> 00:01:50,870 אתה יודע איך לעשות את זה. 33 00:01:50,870 --> 00:01:52,600 אני הולך להשאיר לך את זה. 34 00:01:52,600 --> 00:01:56,050 בשלב הבא, לעדכן את מידע הכותרת לoutfile. 35 00:01:56,050 --> 00:01:59,240 כי יש לנו מפת סיביות חדשה, יש לנו מידע על כותרת חדשה. 36 00:01:59,240 --> 00:02:00,970 מה השתניתי כאן? 37 00:02:00,970 --> 00:02:06,000 ובכן, גודל הקובץ עומד להשתנות כי אנחנו הולכים להיות יותר 38 00:02:06,000 --> 00:02:07,900 פיקסלים מאשר בעבר. 39 00:02:07,900 --> 00:02:11,060 גודל התמונה הוא, ובכך, גם הולך להשתנות, כפי שהוא 40 00:02:11,060 --> 00:02:13,050 רוחב והגובה. 41 00:02:13,050 --> 00:02:17,180 >> אז איזה משתנה הם אלה בדיוק,? 42 00:02:17,180 --> 00:02:20,960 ובכן, אם אתה מסתכל לתוך הכותרת מידע, שאתה רואה שיש 43 00:02:20,960 --> 00:02:25,640 biSizeImage, המייצג את סך גודל התמונה בבתים, 44 00:02:25,640 --> 00:02:28,340 כולל פיקסלים וריפוד. 45 00:02:28,340 --> 00:02:32,520 biWidth הוא הרוחב של התמונה בפיקסלים, מינוס הריפוד. 46 00:02:32,520 --> 00:02:35,580 biHeight הוא הגובה של התמונה בפיקסלים. 47 00:02:35,580 --> 00:02:39,200 ולכן אלה הכלולים ב structs BITMAPFILEHEADER ו 48 00:02:39,200 --> 00:02:40,390 BITMAPINFOHEADER. 49 00:02:40,390 --> 00:02:45,300 אתה יכול להגיד איזה מהם הוא שעל ידי הולך bmp.h ומסתכל על 50 00:02:45,300 --> 00:02:49,670 struct BITMAPINFOHEADER וראייה שמשתנים מופיעים שם. 51 00:02:49,670 --> 00:02:54,700 >> אז כדי לעדכן את כותרת outfiles מידע, שאתה הולך רוצה 52 00:02:54,700 --> 00:02:57,025 לשנות אותם הערכים של גובה והרוחב. 53 00:02:57,025 --> 00:03:00,570 אבל רוב הסיכויים הם, אתה אולי צריך קצת של מידע הכותרת של infile 54 00:03:00,570 --> 00:03:03,670 מאוחר יותר, כך הטוב ביותר כדי לעקוב אחר שניהם. 55 00:03:03,670 --> 00:03:07,770 אבל להיות מאוד ברור עם המשתנה שלך שמות, כך שאתה לא בטעות 56 00:03:07,770 --> 00:03:12,490 לכתוב הערכים שגויים ב הכותרת לoutfile. 57 00:03:12,490 --> 00:03:16,160 >> אז עכשיו בואו ניגשנו לקריאה לתוך פיקסל אחר פיקסל scanline. 58 00:03:16,160 --> 00:03:20,210 שוב, אנחנו הולכים להפוך לנאמן שלנו קובץ I / O ספרייה, ומסתכל על 59 00:03:20,210 --> 00:03:22,100 פונקצית fread. 60 00:03:22,100 --> 00:03:26,150 fread לוקחת במצביע למבנה שיכיל את הבתים ש 61 00:03:26,150 --> 00:03:30,130 אתה קורא ב, גודלו של כל אלמנט שאתה קורא - 62 00:03:30,130 --> 00:03:34,410 שוב, sizeof הולך להיות שימושי לתפקד כאן, מספר 63 00:03:34,410 --> 00:03:38,820 אלמנטים של גודל, גודל, כי אתה קריאה ב, ולבסוף, 64 00:03:38,820 --> 00:03:41,310 inpointer, הקובץ ש אתה קורא מ. 65 00:03:41,310 --> 00:03:46,770 אז אתה לוקח אלמנטים מספר של גודל מinpointer, ו 66 00:03:46,770 --> 00:03:49,040 מכניס אותם לתוך הנתונים. 67 00:03:49,040 --> 00:03:51,695 >> עכשיו זה זמן לשינוי גודל אופקי. 68 00:03:51,695 --> 00:03:56,880 אם n שווה 2, ולאחר מכן עבור כל פיקסל ב infile, אנחנו הולכים לכתוב את זה 69 00:03:56,880 --> 00:04:00,870 פעמיים בoutfile. 70 00:04:00,870 --> 00:04:02,210 איך אפשר לכתוב קבצים? 71 00:04:02,210 --> 00:04:06,400 ובכן, יש לנו את פונקצית fwrite, כך אנו לוקחים את המצביע לstruct 72 00:04:06,400 --> 00:04:10,170 המכיל את הבתים שאתה כתיבה מ, ולאחר מכן אנחנו עוברים ב 73 00:04:10,170 --> 00:04:14,430 גודל, מספר, והפלט, שבו אתה הולך לכתוב את זה. 74 00:04:14,430 --> 00:04:19,200 ואז לחזור על תהליך, יהיה איטרטיבי פשוט מסוגל ללולאה. 75 00:04:19,200 --> 00:04:21,740 >> אבל אנחנו צריכים לזכור להוסיף ריפוד פנימה 76 00:04:21,740 --> 00:04:26,040 הרעיון של ריפוד הוא כי, טוב, כל פיקסל הוא שלושה ביסים, אבל 77 00:04:26,040 --> 00:04:28,940 גודלו של כל חייב scanline להיות כפול של 4 בתים. 78 00:04:28,940 --> 00:04:33,660 אז אם מספר הפיקסלים אינו כפול של 4, אנחנו צריכים להוסיף קצת 79 00:04:33,660 --> 00:04:36,630 ריפוד, וזה רק אפסים. 80 00:04:36,630 --> 00:04:42,130 עכשיו, שלא כמו מי עשה את זה, ושלא כמו עותק, ולאחר מכן תמונת infile ו 81 00:04:42,130 --> 00:04:44,370 קובץ outfile שיש שונה ריפוד שונה כיוון שהם 82 00:04:44,370 --> 00:04:46,360 מידות רוחב שונים. 83 00:04:46,360 --> 00:04:46,690 >> על אישור. 84 00:04:46,690 --> 00:04:51,050 אז אולי נוסחה היית לבוא שימושי כאן. 85 00:04:51,050 --> 00:04:55,120 אני אשאיר לך את זה כדי לגלות את זה, אבל להגיד לך את זה, לכתוב את הריפוד, 86 00:04:55,120 --> 00:04:59,360 טוב, זה רק פונקצית fputc פשוטה, עובר בתו 87 00:04:59,360 --> 00:05:02,200 שאתה רוצה לכתוב, ולאחר מכן את מצביע הקובץ שאתה 88 00:05:02,200 --> 00:05:04,280 רוצה לכתוב ל. 89 00:05:04,280 --> 00:05:08,670 אז עכשיו שאנחנו כבר לשנות את גודל אופקי, ולאחר מכן השתמש בריפוד, 90 00:05:08,670 --> 00:05:12,030 זכור כי אתה צריך להעביר את הקובץ שלך מחוון מיקום, כי אתה 91 00:05:12,030 --> 00:05:14,480 לא יכול fread לריפוד. 92 00:05:14,480 --> 00:05:18,230 אז אתה רוצה לוודא כי הקובץ שלך מחוון מיקום בinfile 93 00:05:18,230 --> 00:05:19,980 הוא בנקודה הנכונה. 94 00:05:19,980 --> 00:05:23,970 כי אנחנו גם רוצים לשנות את הגודל בצורה אנכית. 95 00:05:23,970 --> 00:05:27,090 אנחנו לא יכולים פשוט למתוח אותו בצורה אופקית, כי כל הצרכים שורה 96 00:05:27,090 --> 00:05:30,370 להיות מועתק פעמים n. 97 00:05:30,370 --> 00:05:33,050 >> עכשיו, יש כמה שונה דרכים לעשות את זה. 98 00:05:33,050 --> 00:05:39,010 אז אחד, אנחנו יכולים להשתמש בשיטה שכתוב, ב שאנחנו זוכרים את כל פיקסלים 99 00:05:39,010 --> 00:05:42,840 של שורת נתונה במערך, ו אז אנחנו כותבים מערך שכ 100 00:05:42,840 --> 00:05:44,730 פעמים רבות בהתאם לצורך. 101 00:05:44,730 --> 00:05:49,530 או שיש שיטה להעתיק מחדש שבו, אחרי שקראתי בשורה אחת בinfile 102 00:05:49,530 --> 00:05:53,530 ולאחר מכן כותב כי לoutfile, הוספת הריפוד, אנו fseek 103 00:05:53,530 --> 00:05:57,250 בחזרה להתחלה של השורה המקורית, ולאחר מכן לחזור על אופקי 104 00:05:57,250 --> 00:05:58,710 שינוי גודל משם. 105 00:05:58,710 --> 00:06:02,280 ללא קשר לשיטה, אם כי, אתה רוצה שכל פיקסל להיות חוזר ונשנה 106 00:06:02,280 --> 00:06:06,370 n פעמים, ובכל שורה תהיה חזר פעמים n גם כן. 107 00:06:06,370 --> 00:06:09,160 >> עם זה, יהיה לך מפת סיביות גדול מחיים. 108 00:06:09,160 --> 00:06:11,760 השם שלי הוא Zamyla, וזה CS50. 109 00:06:11,760 --> 00:06:19,542