1 00:00:00,000 --> 00:00:02,700 [Powered by Google Translate] [Проходження - Проблема Set 4] 2 00:00:02,700 --> 00:00:05,000 [Zamyla Chan - Гарвардський університет] 3 00:00:05,000 --> 00:00:07,340 [Це CS50. - CS50.TV] 4 00:00:08,210 --> 00:00:11,670 Добре. Привіт всім, і ласкаво просимо Покрокове керівництво 4. 5 00:00:11,670 --> 00:00:14,270 >> Сьогодні наш PSET є криміналістика. 6 00:00:14,270 --> 00:00:18,080 Судова експертиза є дуже весело PSET, що є робота з растровими файлами 7 00:00:18,080 --> 00:00:21,550 щоб дізнатися, хто вчинив злочин. 8 00:00:21,550 --> 00:00:24,200 Тоді ми йдемо, щоб змінити розміри деяких графічних файлів, 9 00:00:24,200 --> 00:00:27,780 Потім ми також збираємося мати справу з дійсно весело частини, яка називається відновлення, 10 00:00:27,780 --> 00:00:31,160 , В якому ми в основному передав карту пам'яті 11 00:00:31,160 --> 00:00:34,350 , В якому хтось випадково видалив усі свої файли, 12 00:00:34,350 --> 00:00:38,860 і ми попросили відновити ці файли. 13 00:00:38,860 --> 00:00:42,910 >> Але спочатку, перш ніж ми отримаємо в PSET, я просто хочу привітати всіх. 14 00:00:42,910 --> 00:00:45,230 Ми збираємося в середині цього курсу. 15 00:00:45,230 --> 00:00:50,070 Вікторина 0, позаду нас, і ми в pset4, так що по суті, ми на півдорозі. 16 00:00:50,070 --> 00:00:55,490 Ми пройшли довгий шлях, якщо ви подивитеся на ваші psets, pset0 і pset1, 17 00:00:55,490 --> 00:00:57,300 так привітати себе про те, 18 00:00:57,300 --> 00:01:00,760 і ми збираємося, щоб потрапити в деякі дійсно цікаві речі. 19 00:01:00,760 --> 00:01:07,070 >> Таким чином, наш інструментарій для цього PSET, знову ж таки, замість того, щоб Суду ням-ї оновлення, 20 00:01:07,070 --> 00:01:13,890 ми можемо просто запустити update50 якщо ви в версії 17.3 і вище приладу. 21 00:01:13,890 --> 00:01:17,380 Так що не забудьте запустити update50 - це набагато простіше, дещо менше символів - 22 00:01:17,380 --> 00:01:20,640 щоб переконатися, що ви перебуваєте на останній версії приладу. 23 00:01:20,640 --> 00:01:25,410 Особливо це важливо, коли ми update50 почати використовувати CS50 перевірки. 24 00:01:25,410 --> 00:01:28,700 Тому переконайтеся, що ви робите це. 25 00:01:28,700 --> 00:01:30,760 >> Для всіх розділів для цього PSET, 26 00:01:30,760 --> 00:01:34,350 ми будемо мати справу з файлами входи і виходи, файловий ввід / вивід 27 00:01:34,350 --> 00:01:38,140 Ми збираємося йти на безліч програм, які мають справу з масивами 28 00:01:38,140 --> 00:01:40,350 вказують на файли тощо, 29 00:01:40,350 --> 00:01:43,050 тому ми хочемо переконатися, що ми дійсно знайоме і зручно 30 00:01:43,050 --> 00:01:47,990 справу з тим, як вхід і вихід в файли. 31 00:01:47,990 --> 00:01:52,080 >> У розподілі код для цієї PSET файл з ім'ям copy.c, 32 00:01:52,080 --> 00:01:55,280 і ось що ми збираємося знайти буде дуже корисним для нас 33 00:01:55,280 --> 00:02:00,340 тому що ми збираємося в кінцевому підсумку фактично копіюєте файл copy.c 34 00:02:00,340 --> 00:02:05,350 і просто змінити його небагато, щоб бути в змозі досягти перші 2 частини поставленого завдання. 35 00:02:05,350 --> 00:02:09,030 >> І тому те, як я вже казав, ми маємо справу з растровими зображеннями, а також JPEG. 36 00:02:09,030 --> 00:02:13,170 Так насправді розуміння структури як ці файли будуть організовані, 37 00:02:13,170 --> 00:02:16,170 як ми можемо насправді переводити 0 і 1 в структурах 38 00:02:16,170 --> 00:02:19,040 і те, що ми дійсно можемо зрозуміти й інтерпретувати і редагувати, 39 00:02:19,040 --> 00:02:21,000 що буде дійсно важливо, 40 00:02:21,000 --> 00:02:25,970 так відбувається в JPEG і растрових файлів і розуміння структури з них. 41 00:02:25,970 --> 00:02:30,780 >> Pset4, як зазвичай, починається з розділу запитань. 42 00:02:30,780 --> 00:02:36,600 Ті, матиме справу з файлового введення / виводу, і ви отримаєте звикли до цього. 43 00:02:36,600 --> 00:02:42,520 Тоді Частина 1 детективний роман, в якому ви дали растровий файл 44 00:02:42,520 --> 00:02:45,630 , Який виглядає ніби як червоні крапки на всьому протязі. 45 00:02:45,630 --> 00:02:52,180 І то в основному те, що ми збираємося зробити, це взяти цей файл і просто змінити його небагато 46 00:02:52,180 --> 00:02:54,010 у версії, що ми можемо читати. 47 00:02:54,010 --> 00:02:56,000 По суті, як тільки ми закінчимо, ми будемо мати той же файл, 48 00:02:56,000 --> 00:03:02,630 крім ми зможемо побачити сховане повідомлення приховано всі ці червоні крапки. 49 00:03:02,630 --> 00:03:07,310 Тоді Resize це програма, яка, враховуючи файлів 50 00:03:07,310 --> 00:03:11,490 , А потім отримала назву файлу, в якому він виводить, а потім присвоюється номер, а також, 51 00:03:11,490 --> 00:03:16,850 насправді, що розмір растрової тим, що ціле значення. 52 00:03:16,850 --> 00:03:19,240 Тоді, нарешті, у нас є Recover PSET. 53 00:03:19,240 --> 00:03:24,160 Нам дано карт пам'яті і потім відновити всі фотографії 54 00:03:24,160 --> 00:03:25,920 , Які були випадково видалені, 55 00:03:25,920 --> 00:03:31,420 але, як ми дізнаємося, насправді не видаляється і видаляється з файлу; 56 00:03:31,420 --> 00:03:38,470 ми тільки частково втратила, де вони були у файлі, але ми збираємося відновити це. 57 00:03:38,470 --> 00:03:44,950 >> Великий. Так відбувається в файл I / O зокрема, це цілий список функцій, які ви будете використовувати. 58 00:03:44,950 --> 00:03:49,840 Ви вже бачили небагато основи Еореп, FREAD, і FWRITE, 59 00:03:49,840 --> 00:03:54,350 але ми збираємося дивитися далі в деякому файлі вводу / виводу функцій, таких як fputc, 60 00:03:54,350 --> 00:03:56,930 , В якому ви просто написати один символ за один раз, 61 00:03:56,930 --> 00:04:02,000 в FSEEK, де ви начебто перемістити індикатор позиції файлу вперед і назад, 62 00:04:02,000 --> 00:04:05,770 і деякі інші. Але ми будемо йти в цьому трохи пізніше, під час PSET. 63 00:04:08,050 --> 00:04:13,100 >> Отже, спочатку просто потрапити в файлі вводу / виводу, перш ніж іти в PSET, 64 00:04:13,100 --> 00:04:19,860 , Щоб відкрити файл, наприклад, те, що ви повинні зробити, це насправді встановити покажчик на файл. 65 00:04:19,860 --> 00:04:22,710 Тому у нас є покажчик на файл *. 66 00:04:22,710 --> 00:04:27,140 У цьому випадку, я дзвоню його в покажчик, тому що це буде мій INFILE. 67 00:04:27,140 --> 00:04:33,340 І тому я збираюся використовувати функцію Еореп, а потім ім'я файлу 68 00:04:33,340 --> 00:04:36,360 , А потім режим, в якому я буду мати справу з файлом. 69 00:04:36,360 --> 00:04:42,080 Так що "R" в даному випадку для читання, "w" для запису, а потім "" для додавання. 70 00:04:42,080 --> 00:04:44,270 Наприклад, коли ви маєте справу з вхідний_файл 71 00:04:44,270 --> 00:04:47,310 і все, що вам потрібно зробити, це прочитати біти і байти, що зберігаються там, 72 00:04:47,310 --> 00:04:50,420 то ви, ймовірно, захочете використовувати "Г" в якості режиму. 73 00:04:50,420 --> 00:04:54,520 Якщо ви хочете насправді писати, почасти зробити новий файл, 74 00:04:54,520 --> 00:04:57,220 те, що ми збираємося зробити, це ми збираємося відкрити новий файл 75 00:04:57,220 --> 00:05:02,410 і використовувати "W" режим запису. 76 00:05:02,410 --> 00:05:07,540 >> Отже, коли ви насправді читання у файлах, структура виглядає таким чином. 77 00:05:07,540 --> 00:05:14,930 Перш за все, включати покажчик на структуру, яка буде містити байт, які ви читаєте. 78 00:05:14,930 --> 00:05:19,830 Так що це буде в кінці розташування байт, які ви читаєте. 79 00:05:19,830 --> 00:05:23,360 Ви тоді збираєтеся вказати розмір, як і в основному, скільки байтів 80 00:05:23,360 --> 00:05:30,100 Ваша програма повинна читати в файл, розміром в основному один елемент, 81 00:05:30,100 --> 00:05:32,620 і тоді ви будете вказувати, скільки елементів ви хочете читати. 82 00:05:32,620 --> 00:05:34,980 І, нарешті, ви повинні знати, де ви читаєте с, 83 00:05:34,980 --> 00:05:37,580 так що це буде вашою в покажчик. 84 00:05:37,580 --> 00:05:41,780 Я кольором, тому що ці FREAD також дуже схожий на FWRITE, 85 00:05:41,780 --> 00:05:47,050 крім вас, хочете, щоб переконатися, що ви використовуєте правильний замовлення, 86 00:05:47,050 --> 00:05:51,960 Переконайтеся, що ви насправді запис або читання з правого файл. 87 00:05:54,910 --> 00:05:58,610 >> Таким чином, те, як і колись, якщо у нас є розмір елемента, а також ряд елементів, 88 00:05:58,610 --> 00:06:00,600 то ми можемо пограти тут небагато. 89 00:06:00,600 --> 00:06:06,810 Скажімо, у мене є собака, структура і так, то я хочу прочитати двох собак одночасно. 90 00:06:06,810 --> 00:06:12,450 Що я можу зробити, це сказати розмір одного елемента буде розмір однієї собаки 91 00:06:12,450 --> 00:06:14,770 і я збираюся насправді читати дві з них. 92 00:06:14,770 --> 00:06:18,290 Крім того, що я міг зробити, це сказати, що я тільки збираюся читати один елемент 93 00:06:18,290 --> 00:06:21,340 і що один елемент буде розміром дві собаки. 94 00:06:21,340 --> 00:06:24,320 Так ось аналогічна, як ви можете видів пограти з розміром і кількістю 95 00:06:24,320 --> 00:06:28,250 в залежності від того, що більш інтуїтивно зрозумілим для вас. 96 00:06:28,250 --> 00:06:30,810 >> Добре. Отже, тепер ми отримаємо в письмовому вигляді файлів. 97 00:06:30,810 --> 00:06:36,880 Якщо ви хочете записати файл, перший аргумент насправді, де ви читаєте с. 98 00:06:36,880 --> 00:06:42,050 Так що в основному дані, які ви збираєтеся писати у файл, 99 00:06:42,050 --> 00:06:44,490 , Який є з покажчика в кінці. 100 00:06:44,490 --> 00:06:47,670 Так що, коли ви маєте справу з PSET, переконайтеся, що ви не заплуталися. 101 00:06:47,670 --> 00:06:50,480 Може бути, є визначення пліч-о-пліч. 102 00:06:50,480 --> 00:06:58,090 Ви можете витягти визначень в керівництві, ввівши чоловіка, а потім FWRITE, наприклад, 103 00:06:58,090 --> 00:06:59,950 в терміналі, чи ви можете звернутися до цього слайду 104 00:06:59,950 --> 00:07:03,570 і переконайтеся, що ви використовуєте правильний. 105 00:07:03,570 --> 00:07:08,700 Отже, ще раз, для FWRITE, коли у вас є файл, який ви хочете записати в, 106 00:07:08,700 --> 00:07:14,290 що це буде останній аргумент, і що це буде покажчик на цей файл. 107 00:07:14,290 --> 00:07:18,670 Отже ось як ми маємо справу з написанням, можливо, кілька байт в той час, 108 00:07:18,670 --> 00:07:21,820 але кажуть, що ви просто хочете написати всього одну характеру. 109 00:07:21,820 --> 00:07:25,940 Як ми побачимо пізніше в цьому, наприклад, в растрові зображення ми повинні його використовувати. 110 00:07:25,940 --> 00:07:32,180 Ось тоді ми можемо використовувати fputc, по суті, просто поклавши один символ за раз, CHR, 111 00:07:32,180 --> 00:07:37,050 в покажчик, і це наш з покажчиків немає. 112 00:07:38,700 --> 00:07:41,560 Так от, коли ми прагнемо або писати у файл, 113 00:07:41,560 --> 00:07:44,690 Файл відстежувати, де ми знаходимося. 114 00:07:44,690 --> 00:07:47,810 Так що це свого роду курсору, індикатор позиції файлу. 115 00:07:47,810 --> 00:07:54,330 І тому, коли ми писати або читати знову в файл, 116 00:07:54,330 --> 00:07:56,760 файл насправді не пам'ятає, де вона є, 117 00:07:56,760 --> 00:07:59,270 і так продовжується від того, де знаходиться курсор. 118 00:07:59,270 --> 00:08:03,970 Це може бути корисно, якщо ви хочете, скажімо, читати в певній кількості, щоб зробити щось 119 00:08:03,970 --> 00:08:06,160 , А потім прочитати в наступному розмірі, 120 00:08:06,160 --> 00:08:10,700 але іноді ми могли б повернутися назад або фактично почати з деякого значення посилання. 121 00:08:10,700 --> 00:08:16,870 Таким чином, то функція FSEEK, що він робить, це дозволяє нам рухатися курсор в певний файл 122 00:08:16,870 --> 00:08:19,680 певна кількість байт. 123 00:08:19,680 --> 00:08:24,260 І те, що ми повинні зробити, це вказати, де посилання значення. 124 00:08:24,260 --> 00:08:31,520 Так що або вона рухається вперед або назад від того, де в даний час знаходиться курсор, 125 00:08:31,520 --> 00:08:35,750 або ми можемо вказати, що він просто повинен рухатися в від початку файлу 126 00:08:35,750 --> 00:08:37,090 або в кінці файлу. 127 00:08:37,090 --> 00:08:41,230 І тому ви можете передати в негативних чи позитивних значень до суми, 128 00:08:41,230 --> 00:08:44,960 і що буде вид переміщення курсору вперед або назад. 129 00:08:46,170 --> 00:08:51,920 >> Перш ніж ми перейдемо в інший psets, будь-які питання про файл I / O? 130 00:08:53,860 --> 00:08:59,990 Добре. Як ми заглибимося в приклади, не соромтеся, щоб зупинити мене питання. 131 00:08:59,990 --> 00:09:06,930 >> Таким чином, в детективний роман, ви передали файл зображення схожі на цю червону на слайді, 132 00:09:06,930 --> 00:09:14,510 і, схоже, це - букет з червоних крапок - і ви дійсно не знаю, що там написано. 133 00:09:14,510 --> 00:09:23,310 Якщо у вас косоокість, Ви можете бути в змозі бачити легким голубуватим кольором в центрі. 134 00:09:23,310 --> 00:09:26,270 По суті, це коли текст буде збережений. 135 00:09:26,270 --> 00:09:30,270 Існував вбивство, яке сталося, і ми повинні з'ясувати, хто це зробив. 136 00:09:30,270 --> 00:09:36,760 Для того щоб зробити це, ми повинні виду перетворити це зображення в зручному для читання форматі. 137 00:09:36,760 --> 00:09:42,740 Якщо ви, хлопці, ніколи не стикалися з цим, іноді було б мало набори 138 00:09:42,740 --> 00:09:48,510 де ви б збільшувальне скло з червоною плівкою. Будь? Так. 139 00:09:48,510 --> 00:09:52,770 Таким чином, ви б руками щось подібне до цього, ви б збільшувальним склом 140 00:09:52,770 --> 00:09:58,130 з червоним фільм по ній, ви б поставити його над зображенням, 141 00:09:58,130 --> 00:10:03,410 , І ви зможете побачити повідомлення приховано в ньому. 142 00:10:03,410 --> 00:10:07,080 Ми не маємо збільшувальне скло з червоною плівкою, так що замість цього ми збираємося види створити наш власний 143 00:10:07,080 --> 00:10:09,060 У цьому PSET. 144 00:10:09,060 --> 00:10:15,760 І тому користувач буде вводити детективний роман, то ключ,. BMP, 145 00:10:15,760 --> 00:10:18,800 так що це INFILE, що це червона крапка повідомлення, 146 00:10:18,800 --> 00:10:23,550 а потім вони говорять verdict.bmp буде наш вихідний файл. 147 00:10:23,550 --> 00:10:27,900 Таким чином, він збирається створити нову растрових зображень схожий на ключі один 148 00:10:27,900 --> 00:10:32,600 крім як в зручному для читання форматі, де ми можемо побачити сховане повідомлення. 149 00:10:32,600 --> 00:10:37,550 >> Оскільки ми збираємося мати справу з редагування і роботи з растровими зображеннями якийсь, 150 00:10:37,550 --> 00:10:42,400 ми збираємося виду занурення в в структурі цих растрових файлів. 151 00:10:42,400 --> 00:10:48,130 Ми пішли на це небагато в лекції, але давайте подивимося на них ще трохи. 152 00:10:48,130 --> 00:10:51,740 Растрові зображення, по суті тільки розташування байтів 153 00:10:51,740 --> 00:10:55,790 де ми вказали, які байти означає, що. 154 00:10:55,790 --> 00:11:00,540 Так от ніби як карту растрових зображень 155 00:11:00,540 --> 00:11:08,550 кажуть, що вона починається з деякого файли заголовків, починає з деякою інформацією в там. 156 00:11:08,550 --> 00:11:16,540 Ви бачите, що близько Байт номер 14 розмір вказується в растрові зображення, 157 00:11:16,540 --> 00:11:18,520 і це продовжується. 158 00:11:18,520 --> 00:11:23,810 Але те, що ми дійсно зацікавлені в тут, починаючи приблизно з байта номер 54. 159 00:11:23,810 --> 00:11:26,060 У нас є ці RGB трійок. 160 00:11:26,060 --> 00:11:30,760 Те, що це збирається зробити, це містити фактичні пікселів, колір значення. 161 00:11:30,760 --> 00:11:35,950 Все, що вище, що в заголовку деяку інформацію 162 00:11:35,950 --> 00:11:41,240 відповідного розміру зображення, ширину зображення, а висота. 163 00:11:41,240 --> 00:11:44,930 Коли ми йдемо в заповнення пізніше, ми побачимо, чому розмір зображення 164 00:11:44,930 --> 00:11:48,670 може відрізнятися від ширини або висоти. 165 00:11:48,670 --> 00:11:54,240 Отже, щоб представити ці - ці растрові зображення являють собою послідовності байтів - 166 00:11:54,240 --> 00:11:59,370 що ми можемо зробити, це сказати добре, я буду пам'ятати, що в індексі 14, 167 00:11:59,370 --> 00:12:03,380 ось де розмір, наприклад, але замість того, що ми збираємося зробити, щоб зробити це простіше 168 00:12:03,380 --> 00:12:06,020 буде описати його структуру. 169 00:12:06,020 --> 00:12:08,880 І так у нас є дві структури зробили для нас, BITMAPFILEHEADER 170 00:12:08,880 --> 00:12:10,440 і BITMAPINFOHEADER, 171 00:12:10,440 --> 00:12:14,840 і тому, коли ми читаємо в цей файл, за замовчуванням він збирається йти в порядку, 172 00:12:14,840 --> 00:12:22,360 і так, щоб вона також збирається заповнити в таких змінних, як biWidth і biSize. 173 00:12:25,270 --> 00:12:31,230 І, нарешті, кожен піксель представлений трьома байтами. 174 00:12:31,230 --> 00:12:35,500 По-перше, це кількість синього в піксель, другий це кількість зелених, 175 00:12:35,500 --> 00:12:41,120 І, нарешті, кількість червоного, де 0 це практично не синій або зелений чи ні жодної червоної 176 00:12:41,120 --> 00:12:43,720 , А потім і далі є максимальним значенням. 177 00:12:43,720 --> 00:12:46,800 Ці шістнадцяткові значення. 178 00:12:46,800 --> 00:12:53,870 Отже, якщо ми маємо ff0000, те, що відповідає максимальною кількістю синього 179 00:12:53,870 --> 00:12:58,890 і то не зелені і не червоні, так те, що дасть нам синьо пікселів. 180 00:12:58,890 --> 00:13:04,190 Тоді, якщо у нас є всі Ф.Ф. по всіх напрямах, то це означає, що у нас є білий піксель. 181 00:13:04,190 --> 00:13:11,370 Це свого роду противагу Зазвичай, коли ми говоримо RGB. Це насправді відбувається BGR. 182 00:13:12,750 --> 00:13:18,990 >> Тому, якщо ми насправді виглядають в приклад растрового зображення - дозвольте мені витягнути один тут. 183 00:13:31,560 --> 00:13:33,830 Це трохи малий. 184 00:13:39,890 --> 00:13:47,840 Я масштабування, і ми бачимо, що це нечітко. Схоже, блоки кольору. 185 00:13:47,840 --> 00:13:50,110 У вас є білі блоки, а потім червоні блоки. 186 00:13:50,110 --> 00:13:53,700 Якщо ви граєте в Microsoft Paint, наприклад, ви могли б зробити щось на зразок цього 187 00:13:53,700 --> 00:13:58,960 на основному тільки живопис певні квадрати в певному порядку. 188 00:13:58,960 --> 00:14:08,060 Отже, що це означає в растрових полягає в наступному. 189 00:14:08,060 --> 00:14:15,710 Тут ми маємо перші білі пікселі, що всі 6 є F, а потім у нас є червоні пікселі, 190 00:14:15,710 --> 00:14:19,910 зазначено 0000ff. 191 00:14:19,910 --> 00:14:27,940 І так послідовність байт, що ми маємо показує, як растрові зображення буде виглядати. 192 00:14:27,940 --> 00:14:32,230 Так що я зробив тут просто написано всі ці байти, а потім пофарбовані в червоний 193 00:14:32,230 --> 00:14:37,550 так що ви можете бачити вигляд, якщо ви косоокість небагато, як цей вид вказує на усміхнене обличчя. 194 00:14:40,180 --> 00:14:46,390 >> Таким чином, щоб робота растрового зображення, я собі це в основному у вигляді сітки. 195 00:14:46,390 --> 00:14:54,940 І так за замовчуванням, кожен рядок у таблиці повинна бути кратною 4 байт. 196 00:15:00,520 --> 00:15:07,060 Якщо ми подивимося на растрові зображення, ви заповнення кожного значення. 197 00:15:07,060 --> 00:15:17,370 Наприклад, у вас може бути корисним тут, тут зелена, синя тут, 198 00:15:17,370 --> 00:15:24,950 але ви повинні переконатися, що зображення заповнюється декількома з чотирьох байтів. 199 00:15:24,950 --> 00:15:32,200 Так що якщо я хочу, щоб мій образ, щоб бути в трьох кварталах широкий, то я мав би покласти порожні значення 200 00:15:32,200 --> 00:15:35,640 В останній, щоб зробити його кратним чотирьом. 201 00:15:35,640 --> 00:15:39,530 Так от я хотів би додати в те, що ми називаємо оббивка. 202 00:15:39,530 --> 00:15:43,750 Я просто хочу, щоб вказати, що там з х. 203 00:15:44,920 --> 00:15:54,160 Зараз кажуть, що ми хочемо зображення, яке знаходиться в 7 пікселів довжиною, наприклад. 204 00:15:54,160 --> 00:15:59,550 У нас є 1, 2, 3, 4, 5, 6, 7, 205 00:16:04,750 --> 00:16:07,000 і все це заповнюється кольором. 206 00:16:07,000 --> 00:16:10,620 Таким чином, що растрові зображення працюємо, що нам потрібно 8-й. 207 00:16:10,620 --> 00:16:12,460 Зараз у нас є 1, 2, 3, 4, 5, 6, 7. 208 00:16:12,460 --> 00:16:19,360 Нам потрібно 8 осередків для растрового зображення правильно читати. 209 00:16:19,360 --> 00:16:25,600 Отже, що ми повинні зробити, це додати в тільки трохи оббивка 210 00:16:25,600 --> 00:16:29,430 щоб переконатися, що все ширини рівномірне 211 00:16:29,430 --> 00:16:34,260 і що всі ширини кратною 4. 212 00:16:42,110 --> 00:16:47,310 І ось я вже зазначалося раніше, заповнення у вигляді х або хвиляста лінія, 213 00:16:47,310 --> 00:16:53,880 але в реальній растрових зображень оббивка вказується шістнадцятковий 0. 214 00:16:53,880 --> 00:16:57,340 Так що був би один символ, 0. 215 00:16:58,980 --> 00:17:06,329 Що може стати в нагоді, є XXD команди. 216 00:17:06,329 --> 00:17:11,220 Що він робить насправді показує, як подібне до того, що я робив раніше з смайлик 217 00:17:11,220 --> 00:17:15,630 Коли я насправді роздрукувати те, що кожен колір буде на піксель 218 00:17:15,630 --> 00:17:21,800 , А потім кольором його, коли ви запускаєте XXD за допомогою наступних команд, 219 00:17:21,800 --> 00:17:28,670 то воно буде насправді роздрукувати те, що кольори для тих, хто пікселів. 220 00:17:28,670 --> 00:17:33,810 Те, що ви повинні зробити, це тут я вказую, як-S 54 221 00:17:33,810 --> 00:17:36,530 говорить, що я збираюся почати на 54-му байті 222 00:17:36,530 --> 00:17:40,820 тому що до цього, пам'ятайте, якщо ми оглянемося на карті растрових зображень, 223 00:17:40,820 --> 00:17:42,690 Ось і все заголовки тощо. 224 00:17:42,690 --> 00:17:46,280 Але те, що ми дійсно дбаємо про те, фактичні пікселів, які вказують на колір. 225 00:17:46,280 --> 00:17:52,700 Таким чином, додавши в цей прапор,-и 54, то ми можемо побачити значення кольору. 226 00:17:52,700 --> 00:17:56,020 І не турбуйтеся про складні прапорами тощо. 227 00:17:56,020 --> 00:18:05,020 У специфікації поставленого завдання, ви будете мати вказівки, як використовувати XXD для відображення пікселів. 228 00:18:07,070 --> 00:18:15,590 Так що якщо ви бачите тут, це частково виглядає як зелене поле, ця маленька річ. 229 00:18:15,590 --> 00:18:23,610 Я кольором 00ff00 в основному говорять не синій, багато зеленого, а не червоного кольору. 230 00:18:23,610 --> 00:18:26,370 Так що відповідає зелений колір. 231 00:18:26,370 --> 00:18:31,920 Як ви бачите тут, ми бачимо зелений прямокутник. 232 00:18:31,920 --> 00:18:36,660 Цей зелений прямокутник знаходиться всього в 3 пікселів в ширину, так що те, що ми повинні зробити, 233 00:18:36,660 --> 00:18:44,350 щоб переконатися, що зображення ділиться на 4 широкий додати в додаткових накладок. 234 00:18:44,350 --> 00:18:49,460 І так, то це, як ви бачите ці 0s тут. 235 00:18:49,460 --> 00:18:54,510 Це насправді буде результат вашої Resize PSET, 236 00:18:54,510 --> 00:19:01,350 по суті приймаючи невеликі растрові, а потім збільшуючи його на 4. 237 00:19:01,350 --> 00:19:09,380 І що ж ми бачимо, що насправді це зображення знаходиться в 12 пікселів в ширину, але 12 є кратним 4, 238 00:19:09,380 --> 00:19:12,940 і тому ми насправді не бачу ніякої 0s в кінці, тому що не потрібно додавати 239 00:19:12,940 --> 00:19:19,070 тому що він повністю заповнюється. Він не має більше місця. 240 00:19:20,720 --> 00:19:23,470 >> Добре. Будь-які питання про оббивка? 241 00:19:25,150 --> 00:19:27,460 Добре. Cool. 242 00:19:27,460 --> 00:19:32,520 >> Як я згадував раніше, растрові зображення просто послідовність байтів. 243 00:19:32,520 --> 00:19:39,170 І те, що у нас є, замість того, щоб відслідковувати, які саме числа байт 244 00:19:39,170 --> 00:19:47,050 відповідає певному елементу, ми фактично створили структуру для представлення цього. 245 00:19:47,050 --> 00:19:50,930 Отже, що ми маємо RGBTRIPLE структури. 246 00:19:50,930 --> 00:19:54,590 Всякий раз, коли у вас є екземпляр RGB трійки, 247 00:19:54,590 --> 00:20:00,970 тому що це типу визначають структуру, то ви можете отримати доступ до rgbtBlue змінної, 248 00:20:00,970 --> 00:20:09,520 Аналогічно зелений і червоний змінних, в якому буде вказано, скільки синього, зеленого і червоного, 249 00:20:09,520 --> 00:20:11,580 відповідно, у вас є. 250 00:20:11,580 --> 00:20:16,800 >> Так що, якщо у нас є синя набір змінних 0, зелені встановлено далі, 251 00:20:16,800 --> 00:20:22,060 , Що є максимальним значенням ви можете мати, а потім червоний змінна встановлена ​​в 0, 252 00:20:22,060 --> 00:20:27,870 Потім, якого кольору буде ця трійка RGB представляють? >> [Студент] Green. 253 00:20:27,870 --> 00:20:29,150 Зелений. Саме так. 254 00:20:29,150 --> 00:20:34,480 Це буде корисно знати, що всякий раз, коли у вас є екземпляр RGB трійки, 255 00:20:34,480 --> 00:20:41,340 Ви можете фактично отримати доступ кількість кольорів - синій, зелений і червоний - окремо. 256 00:20:43,350 --> 00:20:54,900 >> Тепер, коли ми говорили про структуру, давайте поглянемо на файл BMP. 257 00:20:54,900 --> 00:20:57,870 Ці структури для вас. 258 00:20:57,870 --> 00:21:01,820 Тут ми маємо BITMAPFILEHEADER структури. 259 00:21:01,820 --> 00:21:07,610 Цікавим є той розмір. 260 00:21:07,610 --> 00:21:12,660 Пізніше, у нас є інформація заголовка, який має кілька речей, які цікаві для нас, 261 00:21:12,660 --> 00:21:15,480 а саме: розмір, ширину і висоту. 262 00:21:15,480 --> 00:21:19,170 Як ми підемо в пізніше, коли ви читаєте в в файл, 263 00:21:19,170 --> 00:21:25,500 він автоматично зчитує, тому що ми створили, щоб бути те ж саме. 264 00:21:25,500 --> 00:21:31,990 Так biSize буде містити право байт, які відповідають фактичним розміром зображення. 265 00:21:34,700 --> 00:21:40,500 А то ось, нарешті, як ми вже говорили, у нас є RGBTRIPLE ЬурейеЕ структури. 266 00:21:40,500 --> 00:21:46,840 У нас є rgbtBlue, зелений і червоний, пов'язаних з ним. 267 00:21:48,210 --> 00:21:49,340 >> Великий. Добре. 268 00:21:49,340 --> 00:21:56,360 Тепер, коли ми розуміємо, растрові зображення небагато, розуміємо, що у нас є файл заголовка 269 00:21:56,360 --> 00:22:00,790 і інформація заголовків, пов'язаних з ним, а потім після цього, у нас є цікаві речі 270 00:22:00,790 --> 00:22:05,110 квітів, і ці кольори представлені RGBTRIPLE структури, 271 00:22:05,110 --> 00:22:12,710 а ті, в свою чергу, є три значення, пов'язані з синього, зеленого і червоного. 272 00:22:12,710 --> 00:22:17,270 >> Отже, тепер ми можемо вид думаєте про Відновлення небагато. 273 00:22:17,270 --> 00:22:20,130 Вибачте. Подумайте про те, детективний роман. 274 00:22:20,130 --> 00:22:25,750 Коли у нас є ключ файл, те, що ми хочемо зробити, це прочитати в її піксель за пікселем 275 00:22:25,750 --> 00:22:33,860 а то якось змінити ті пікселі, так що ми можемо вивести його в зручному для читання форматі. 276 00:22:33,860 --> 00:22:41,020 І так, щоб вивести його, ми збираємося написати піксель за пікселем в verdict.bmp файл. 277 00:22:41,020 --> 00:22:45,120 Це почасти багато чого зробити. Ми розуміємо, що. 278 00:22:45,120 --> 00:22:49,860 Отже, що ми зробили, ми фактично надав вам copy.c. 279 00:22:49,860 --> 00:22:57,610 Що copy.c робить, це просто робить точну копію даного растровий файл, а потім виводить його. 280 00:22:57,610 --> 00:23:01,900 Таким чином, це вже відкриває файл для вас, говориться в піксель за пікселем, 281 00:23:01,900 --> 00:23:04,510 а потім записує його в у вихідний файл. 282 00:23:04,510 --> 00:23:07,080 >> Давайте подивимося на це. 283 00:23:13,390 --> 00:23:18,290 Це забезпечення належного використання, 284 00:23:18,290 --> 00:23:22,640 отримання файлів тут. 285 00:23:22,640 --> 00:23:29,940 Що це робить він задає вхідний файл, те, що ми пройшли в Росії в вхідний_файл тут, 286 00:23:29,940 --> 00:23:34,750 яка є нашим другим аргументом командного рядка. 287 00:23:34,750 --> 00:23:37,640 Перевірок, щоб переконатися, що ми можемо відкрити файл. 288 00:23:38,960 --> 00:23:44,860 Перевіряє, щоб переконатися, що ми можемо зробити новий вихідний файл тут. 289 00:23:45,630 --> 00:23:53,270 Потім, що вона робить тут, це тільки в основному починає читати, щоб растровий файл з самого початку. 290 00:23:53,270 --> 00:23:56,700 На початку, як ми знаємо, містить BITMAPFILEHEADER, 291 00:23:56,700 --> 00:24:03,200 і тому ці послідовності бітів буде прямо заповнити BITMAPFILEHEADER. 292 00:24:03,200 --> 00:24:07,940 Отже, що ми маємо тут кажуть, що BITMAPFILEHEADER BF - 293 00:24:07,940 --> 00:24:13,150 Це наша нова змінна типу BITMAPFILEHEADER - 294 00:24:13,150 --> 00:24:22,560 ми збираємося покласти всередину BF те, що ми читаємо в покажчик, який є нашим INFILE. 295 00:24:22,560 --> 00:24:23,970 Скільки ми читаємо? 296 00:24:23,970 --> 00:24:32,160 Ми читаємо в скільки байт ми повинні міститися всі BITMAPFILEHEADER. 297 00:24:32,160 --> 00:24:34,660 Крім того, це те, що ми робимо для інформації заголовка. 298 00:24:34,660 --> 00:24:39,010 Таким чином, ми продовжуємо уздовж нашого файлу в INFILE, 299 00:24:39,010 --> 00:24:44,360 і ми читаємо ці біти і байти, і ми підключити їх безпосередньо в 300 00:24:44,360 --> 00:24:47,880 в цих випадках змінні, які ми робимо. 301 00:24:49,370 --> 00:24:53,800 Тут ми лише переконавшись, що растрового зображення растрового зображення. 302 00:24:57,670 --> 00:25:01,030 >> Тепер у нас є вихідний файл, вірно? 303 00:25:01,030 --> 00:25:04,420 Так як він стоїть, коли ми створюємо, це по суті порожній. 304 00:25:04,420 --> 00:25:07,710 Таким чином, ми в основному створюємо новий растровий з нуля. 305 00:25:07,710 --> 00:25:12,280 Що ми робимо це, ми повинні переконатися, що ми копіюємо в заголовку файлу 306 00:25:12,280 --> 00:25:16,850 і інформаційний заголовок так само, як вхідний_файл має. 307 00:25:16,850 --> 00:25:22,850 Що ми робимо це ми пишемо - і пам'ятайте, що БФ змінну 308 00:25:22,850 --> 00:25:29,300 тип BITMAPFILEHEADER, так що ми робимо, ми просто використовуємо, що зміст 309 00:25:29,300 --> 00:25:34,980 для запису у вихідний файл. 310 00:25:36,550 --> 00:25:38,510 Ось, пам'ятаю, ми говорили про оббивка, 311 00:25:38,510 --> 00:25:47,820 , Як це важливо, щоб переконатися, що кількість пікселів, яке у нас є, кратного 4. 312 00:25:47,820 --> 00:25:52,790 Це дуже корисна формула для розрахунку, скільки у вас є оббивка 313 00:25:52,790 --> 00:25:57,670 з урахуванням ширини вашого файлу. 314 00:25:57,670 --> 00:26:04,120 Я хочу вас, хлопці, пам'ятайте, що в copy.c у нас є формула для розрахунку заповнення. 315 00:26:04,120 --> 00:26:07,970 Добре? Так що все це пам'ятаю. Великий. 316 00:26:07,970 --> 00:26:14,050 Отже, що робить наступний copy.c він перебирає всі Scanlines. 317 00:26:14,050 --> 00:26:23,730 Він проходить через рядки, а потім зберігає кожна трійка, що він читає 318 00:26:23,730 --> 00:26:26,920 а потім записує його у вихідний файл. 319 00:26:26,920 --> 00:26:33,120 Таким чином, то тут ми читаємо тільки один RGB потрійні в той час, 320 00:26:33,120 --> 00:26:39,860 , А потім покласти в той же трійку у вихідний файл. 321 00:26:41,120 --> 00:26:48,340 Хитрість у тому, що оббивка не RGB трійки, 322 00:26:48,340 --> 00:26:55,200 і тому ми не можемо просто читати, що оббивка кількість трійок RGB. 323 00:26:55,200 --> 00:27:01,460 Що ми повинні зробити, це насправді просто перемістити наші позиції у файлі індикатор, пересувати курсор, 324 00:27:01,460 --> 00:27:06,840 у вигляді пропустити всі відступи, так що ми на наступному рядку. 325 00:27:06,840 --> 00:27:12,990 А те, що це робить копію показує вам, як ви можете додати оббивка. 326 00:27:12,990 --> 00:27:14,990 Отже, ми підрахували, скільки оббивка нам потрібно, 327 00:27:14,990 --> 00:27:18,220 так що це означає, що ми повинні оббивка кількість 0s. 328 00:27:18,220 --> 00:27:24,510 Що це робить цикл, який ставить оббивка кількість 0s в нашій вихідний_файл. 329 00:27:24,510 --> 00:27:31,170 І, нарешті, ви закриваєте обидва файли. Ви закриваєте INFILE, а також вихідний_файл. 330 00:27:31,170 --> 00:27:34,870 >> Так от, як copy.c робіт, 331 00:27:34,870 --> 00:27:37,430 і це буде дуже корисно. 332 00:27:39,720 --> 00:27:43,750 Замість того щоб просто насправді прямого копіювання і вставки 333 00:27:43,750 --> 00:27:46,800 або просто дивлячись на нього, і набравши в те, що ви хочете, 334 00:27:46,800 --> 00:27:49,440 Ви можете просто хочу, щоб виконати цю команду в терміналі, 335 00:27:49,440 --> 00:27:54,520 ср copy.c whodunit.c, який створить новий файл, whodunit.c, 336 00:27:54,520 --> 00:27:58,330 , Який містить ті ж змісту, як копіювання робить. 337 00:27:58,330 --> 00:28:03,880 Отже, що ми можемо зробити, це використовувати його в якості основи, на якій будується і редагувати 338 00:28:03,880 --> 00:28:06,900 для наших детективний роман файл. 339 00:28:08,500 --> 00:28:14,670 >> Це наші з-DOS, щоб зробити для детективний роман, але те, що робить copy.c 340 00:28:14,670 --> 00:28:16,730 насправді дбає про більшість з них для нас. 341 00:28:16,730 --> 00:28:21,900 Так що всі ми повинні зробити, це змінити наступний пікселів по мірі необхідності 342 00:28:21,900 --> 00:28:25,920 насправді зробити файл для читання. 343 00:28:25,920 --> 00:28:32,960 Пам'ятайте, що для даного пікселя потрійний, так що для даної змінної типу RGBTRIPLE, 344 00:28:32,960 --> 00:28:35,990 Ви можете отримати доступ сині, зелені та червоні значення. 345 00:28:35,990 --> 00:28:38,670 Це збирається згодяться, тому що, якщо ви можете отримати до них доступ, 346 00:28:38,670 --> 00:28:41,770 це означає, що ви також можете перевірити їх, 347 00:28:41,770 --> 00:28:45,430 і це означає, що ви також можете змінити їх. 348 00:28:45,430 --> 00:28:49,430 >> Тому, коли ми повернулися в наш червоно наприклад збільшувальне скло, 349 00:28:49,430 --> 00:28:53,390 В основному, це діє як свого роду фільтр для нас. 350 00:28:53,390 --> 00:28:58,160 Отже, що ми хочемо зробити, це ми хочемо, щоб фільтрувати всі з трійок, які входячи 351 00:28:58,160 --> 00:29:01,240 Є кілька різних способів зробити це. 352 00:29:01,240 --> 00:29:07,100 В принципі, ви можете мати будь-який тип фільтру Ви хочете. 353 00:29:07,100 --> 00:29:09,890 Може бути, ви хочете змінити всі червоні пікселі 354 00:29:09,890 --> 00:29:13,570 або, може бути, ви хочете змінити іншого кольору пікселя на інший колір. 355 00:29:13,570 --> 00:29:15,400 Це залежить від вас. 356 00:29:15,400 --> 00:29:19,580 Пам'ятайте, що ви можете перевірити, який колір пікселя 357 00:29:19,580 --> 00:29:23,000 а потім ви можете змінити його, як ви проходите. 358 00:29:24,410 --> 00:29:26,420 >> Добре. Так ось детективний роман. 359 00:29:26,420 --> 00:29:32,760 Як тільки ви запустите детективний роман, ви будете знати, хто винуватець злочину був. 360 00:29:32,760 --> 00:29:35,540 >> Тепер ми збираємося йти змінити. 361 00:29:35,540 --> 00:29:37,990 Ми будемо ще мати справу з растровими зображеннями. 362 00:29:37,990 --> 00:29:40,750 Те, що ми збираємося робити це ми будемо мати вхідні растрові 363 00:29:40,750 --> 00:29:45,890 а потім ми збираємося пройти в ряд, а потім отримати вихідний файл растрового 364 00:29:45,890 --> 00:29:51,380 де це в основному наші вхідний_файл масштабується с. 365 00:29:54,670 --> 00:30:01,450 Скажімо мій файл був тільки один піксель великий. 366 00:30:01,450 --> 00:30:09,100 Тоді, якщо моя п було 3 роки, масштабування на 3, то я хотів би повторити, що піксель п число разів, 367 00:30:09,100 --> 00:30:14,410 так 3 рази, а потім і зменшіть його 3 рази, а також. 368 00:30:14,410 --> 00:30:17,840 Таким чином, ви бачите, що я його масштабування по вертикалі, і по горизонталі. 369 00:30:17,840 --> 00:30:19,680 >> А то ось приклад. 370 00:30:19,680 --> 00:30:27,590 Якщо у вас є п = 2, ви побачите, що перший синіх пікселів там повторюється два рази 371 00:30:27,590 --> 00:30:30,930 горизонтально, так і вертикально у два рази. 372 00:30:30,930 --> 00:30:38,040 А те, що продовжується, і тому у вас є пряме масштабування вихідного зображення на два. 373 00:30:40,920 --> 00:30:47,600 >> Так от, якщо б ми докладно псевдокод для цього, ми хочемо відкрити файл. 374 00:30:47,600 --> 00:30:49,880 А потім, знаючи, що якщо ми повернемося сюди, 375 00:30:49,880 --> 00:30:54,540 ми бачимо, що ширина вихідний файл буде відрізнятися від ширини INFILE. 376 00:30:54,540 --> 00:30:56,130 Що це значить? 377 00:30:56,130 --> 00:31:01,230 Це означає, що наша інформація заголовка зміниться. 378 00:31:01,230 --> 00:31:03,790 І те, що ми хочемо зробити, це обновити інформацію заголовка, 379 00:31:03,790 --> 00:31:11,820 знаючи, що коли ми читаємо у файли, якщо ви працюєте на copy.c рамки, 380 00:31:11,820 --> 00:31:17,570 у нас вже є змінна, яка вказує, який розмір і тому подібні речі. 381 00:31:17,570 --> 00:31:24,060 Тому, як тільки у вас є, що те, що ви можете зробити, це змінити ці конкретні змінні. 382 00:31:24,060 --> 00:31:29,380 Пам'ятайте, якщо у вас є структура, як отримати доступ до змінних в цьому. 383 00:31:29,380 --> 00:31:32,080 Ви можете використовувати оператор точки, правильно? 384 00:31:32,080 --> 00:31:36,420 Таким чином, те, використовуючи це, ви знаєте, що вам потрібно змінити заголовок інформації. 385 00:31:36,480 --> 00:31:41,030 Отже, ось тільки список фактичних елементів, які будуть зміни у вашому файлі. 386 00:31:41,030 --> 00:31:45,180 Розмір файлу буде мінятися, зображення, а також ширини і висоти. 387 00:31:45,180 --> 00:31:50,080 Так от повертаючись до карти растрових зображень, 388 00:31:50,080 --> 00:31:57,730 дивитися на це заголовок файлу або інформація заголовок, що містить цю інформацію 389 00:31:57,730 --> 00:32:00,920 , А потім змінити при необхідності. 390 00:32:05,010 --> 00:32:12,470 Знову ж таки, говорять CP copy.c Зміна розміру. 391 00:32:12,470 --> 00:32:19,270 Це означає, що тепер Зміна розміру містить все, що міститься всередині копію 392 00:32:19,270 --> 00:32:24,490 тому що копія дає нам спосіб читання, щоб кожен рядок піксель за пікселем. 393 00:32:24,490 --> 00:32:29,860 Тільки тепер, замість того, щоб просто змінюючи значення, як ми це робили в детективний роман, 394 00:32:29,860 --> 00:32:37,980 те, що ми хочемо зробити, це ми хочемо написати в кілька пікселів 395 00:32:37,980 --> 00:32:43,580 Відтоді, як наша п більше 1. 396 00:32:43,580 --> 00:32:47,110 >> Тоді те, що ми хочемо зробити, це ми хочемо, щоб розтягнути його по горизонталі на п, 397 00:32:47,110 --> 00:32:50,490 а також розтягнути його по вертикалі на п. 398 00:32:50,490 --> 00:32:52,710 Як ми можемо це зробити? 399 00:32:52,710 --> 00:32:56,890 Скажіть ваше п 2 і у вас є ця даного INFILE. 400 00:32:56,890 --> 00:32:58,730 Курсор почне в першому, 401 00:32:58,730 --> 00:33:03,530 і що ви хочете робити, якщо п 2, ви хочете роздрукувати в 2-х з них. 402 00:33:03,530 --> 00:33:05,490 Так що ви друкуєте в 2 з них. 403 00:33:05,490 --> 00:33:10,830 Тоді ваш курсор буде переходити до наступного пікселя, який є червоний, 404 00:33:10,830 --> 00:33:18,400 і це буде роздрукувати 2 з тих червоних, додаючи його на те, що він робив раніше. 405 00:33:18,400 --> 00:33:26,280 Потім курсор переміщається до наступного пікселів і зробити в 2-х з них. 406 00:33:26,280 --> 00:33:37,180 Якщо ви подивитеся на copy.c рамки, що вона робить тут 407 00:33:37,180 --> 00:33:42,830 воно створює новий екземпляр RGB трійка, нова змінна називається трійка. 408 00:33:42,830 --> 00:33:50,500 А от коли він читає в ній, він читає з INFILE 1 RGBTRIPLE 409 00:33:50,500 --> 00:33:53,470 і зберігає його всередині, що потрійна змінної. 410 00:33:53,470 --> 00:33:57,590 І тоді у вас дійсно є змінна, що представляє конкретного пікселя. 411 00:33:57,590 --> 00:34:05,290 Потім, коли ви пишете, що ви можете зробити, це закривати FWRITE заяву в цикл 412 00:34:05,290 --> 00:34:11,080 , Який записує його в свої вихідний_файл стільки разів, скільки необхідно. 413 00:34:17,449 --> 00:34:20,100 Це досить просто. 414 00:34:20,200 --> 00:34:27,590 Просто в основному, повторюють процес написання п число раз масштабувати його по горизонталі. 415 00:34:27,590 --> 00:34:32,969 >> Але тоді ми повинні пам'ятати, що наші оббивка буде мінятися. 416 00:34:47,350 --> 00:34:53,020 Раніше, скажімо, у нас було щось довжини 3. 417 00:34:53,020 --> 00:35:00,130 Тоді ми просто додамо в тому, скільки оббивка? Ще один, щоб зробити його кратним 4. 418 00:35:00,130 --> 00:35:10,480 Але сказати, що ми масштабування даного зображення, п = 2. 419 00:35:10,480 --> 00:35:16,300 Отже, скільки синіх пікселів б ми в кінці? Ми б 6. 420 00:35:16,300 --> 00:35:21,470 1, 2, 3, 4, 5, 6. Добре. 421 00:35:21,470 --> 00:35:26,580 6 не кратно 4. Що найближчого числа, кратного 4? Це буде 8. 422 00:35:26,580 --> 00:35:33,200 Таким чином, ми фактично будемо мати 2 символи оббивка там. 423 00:35:33,200 --> 00:35:38,720 >> Хтось пам'ятає, якщо у нас є формула для розрахунку оббивка 424 00:35:38,720 --> 00:35:41,350 і де це може бути? 425 00:35:41,350 --> 00:35:45,160 [Нерозбірливо відповідь студента] >> Так, copy.c. Право. 426 00:35:45,160 --> 00:35:49,800 Існує формула в copy.c порахувати, скільки у вас є оббивка 427 00:35:49,800 --> 00:35:53,810 даної конкретної ширини растрових зображень. 428 00:35:53,810 --> 00:36:02,950 Отже, що це буде корисно, коли потрібно додати певну кількість оббивка 429 00:36:02,950 --> 00:36:06,160 насправді з'ясувати, скільки оббивка вам потрібно додати. 430 00:36:10,820 --> 00:36:15,850 Але, зверніть увагу, однак, те, що ви хочете, щоб переконатися, що ви використовуєте правильний розмір. 431 00:36:15,850 --> 00:36:21,410 Тільки будьте обережні, тому що ви в основному будемо мати справу з двома растрових зображень. 432 00:36:21,410 --> 00:36:23,410 Ви хочете, щоб переконатися, що ви використовуєте правильний. 433 00:36:23,410 --> 00:36:26,820 Коли ви розрахунку оббивка для вихідного файлу, який ви хочете використовувати ширину вихідний_файл 434 00:36:26,820 --> 00:36:29,860 , А не ширини попереднього. 435 00:36:29,860 --> 00:36:37,240 >> Великий. Таке піклується про розтягуванні цілому растрового зображення по горизонталі. 436 00:36:37,240 --> 00:36:41,290 Але те, що ми хочемо зробити, насправді розтягнути його як вертикально, так. 437 00:36:41,290 --> 00:36:48,760 Це буде трохи складніше, тому що коли ми закінчили копіювання рядків 438 00:36:48,760 --> 00:36:51,580 і писати цей рядок, наш курсор буде в кінці. 439 00:36:51,580 --> 00:36:56,210 Таким чином, якщо ми читаємо знову, то вона просто буде читати в наступному рядку. 440 00:36:56,210 --> 00:37:03,660 Отже, що ми хочемо зробити, це вид знайти спосіб копіювання цих рядків знову 441 00:37:03,660 --> 00:37:12,500 або просто вид, що приймає рядок, а потім переписувати його заново. 442 00:37:14,380 --> 00:37:17,940 Як я начебто згадував, існує кілька різних способів зробити це. 443 00:37:17,940 --> 00:37:23,040 Що ви можете зробити, це, як ви проходите через читання і особливо Scanline 444 00:37:23,040 --> 00:37:28,560 і змінюючи її по мірі необхідності, то вигляд магазину всі ці пікселі в масиві. 445 00:37:28,560 --> 00:37:36,350 Тоді в подальшому ви знаєте, що вам потрібно роздрукувати цей масив знову, 446 00:37:36,350 --> 00:37:39,830 і тому ви можете просто використовувати цей масив, щоб зробити це. 447 00:37:39,830 --> 00:37:44,500 Ще один спосіб зробити це можна скопіювати на один рядок вниз, 448 00:37:44,500 --> 00:37:47,950 розумію, що вам необхідно скопіювати це знову, так насправді, наведіть курсор, 449 00:37:47,950 --> 00:37:50,950 і це буде методом FSEEK. 450 00:37:50,950 --> 00:37:56,410 Ви можете перемістити курсор всі шляхи назад і повторіть процес копіювання знову. 451 00:37:56,410 --> 00:38:03,960 >> Так що, якщо наша масштабування числа п, то скільки разів ми повинні повернутися 452 00:38:03,960 --> 00:38:10,500 і переписати лінію? >> [Студент] п - 1. >> Так, цілком. п - 1. 453 00:38:10,500 --> 00:38:14,390 Ми зробили це один раз уже, так що потім ми хочемо повторити процес повернення 454 00:38:14,390 --> 00:38:17,460 п - 1 кількість разів. 455 00:38:22,730 --> 00:38:25,860 Добре. Так що у вас є функції зміни розміру. 456 00:38:25,860 --> 00:38:34,360 >> Тепер ми можемо потрапити в дуже цікавий, мій улюблений PSET, який є відновлення. 457 00:38:34,360 --> 00:38:39,580 Замість того, растрові зображення, на цей раз ми маємо справу з JPEG. 458 00:38:39,580 --> 00:38:43,370 Ми фактично не дав свій файл, просто з JPEG, 459 00:38:43,370 --> 00:38:46,600 нам дають в основному сирої формат карт пам'яті. 460 00:38:46,600 --> 00:38:51,790 І тому вона містить небагато інформації і сміття значення на початку, 461 00:38:51,790 --> 00:38:57,240 а потім він починає і має купу файлів JPEG. 462 00:38:57,240 --> 00:39:03,430 Тим не менш, ми вручили карту, де ми видалили фотографії; 463 00:39:03,430 --> 00:39:08,300 по суті, ми забули, де фотографії знаходяться в межах карти. 464 00:39:08,300 --> 00:39:12,770 Так ось наше завдання в Відновлення повинен пройти через цю карту формату 465 00:39:12,770 --> 00:39:16,500 і знайти ці фотографії ще раз. 466 00:39:16,500 --> 00:39:23,990 >> На щастя, структура файлів JPEG і картотеки трохи корисним. 467 00:39:23,990 --> 00:39:28,850 Це, безумовно, могло б бути трохи складніше, якщо б не було в даному форматі. 468 00:39:28,850 --> 00:39:40,160 Кожен файл JPEG насправді починається з двох можливих послідовностей, перерахованих вище. 469 00:39:40,160 --> 00:39:42,970 В основному, коли у вас є новий файл JPEG, 470 00:39:42,970 --> 00:39:52,720 вона починається або з послідовністю FFD8 ffe0 або інший, FFD8 ffe1. 471 00:39:52,720 --> 00:39:59,530 Інша корисна річ, щоб знати, що зображення у форматі JPEG зберігаються безперервно. 472 00:39:59,530 --> 00:40:03,380 Тому, коли один файл JPEG закінчується, а інший починається. 473 00:40:03,380 --> 00:40:07,070 Так що це не будь-які проміжні значення там. 474 00:40:07,070 --> 00:40:15,510 Коли ви дійдете до початку JPEG, якщо ви вже читали JPEG, 475 00:40:15,510 --> 00:40:21,800 Ви знаєте, що ви потрапили в кінець попереднього і початок наступного. 476 00:40:21,800 --> 00:40:25,890 >> Для виду візуалізувати це, я зробив схему. 477 00:40:25,890 --> 00:40:36,910 Ще одна річ, про формат JPEG, що ми можемо читати їх в послідовності 512 байт за один раз, 478 00:40:36,910 --> 00:40:39,380 Аналогічно з початком карт. 479 00:40:39,380 --> 00:40:43,370 Ми не потрібно перевіряти кожен байт, тому що це відстій. 480 00:40:43,370 --> 00:40:48,200 Тому замість того, що ми можемо зробити насправді тільки що прочитав в 512 байт, в той час, 481 00:40:48,200 --> 00:40:54,700 , А потім, замість перевірки в між тими, хто ці маленькі шматочки, 482 00:40:54,700 --> 00:40:58,640 ми можемо просто перевірити початку 512 байт. 483 00:40:58,640 --> 00:41:02,570 По суті, в цій картині, що ви бачите на початку карти, 484 00:41:02,570 --> 00:41:08,700 у вас є цінності, які насправді не належать до фактичних форматі JPEG себе. 485 00:41:08,700 --> 00:41:15,830 Але те, що у мене є зірки, щоб вказати одне з двох вихідних послідовностей для JPEG. 486 00:41:15,830 --> 00:41:19,910 Тому, коли ви бачите зірки, ви знаєте, що у вас є файл JPEG. 487 00:41:19,910 --> 00:41:25,030 А потім кожен файл JPEG буде кратним 512 байт 488 00:41:25,030 --> 00:41:27,880 але не обов'язково те ж саме кілька. 489 00:41:27,880 --> 00:41:32,050 Таким чином, що ви знаєте, що ви потрапили іншого JPEG, якщо ви натиснете іншу зірку, 490 00:41:32,050 --> 00:41:39,090 інший, починаючи послідовність байтів. 491 00:41:39,090 --> 00:41:43,330 А що у вас тут у вас є файл JPEG червоною триває, поки ви натиснете зірки, 492 00:41:43,330 --> 00:41:45,150 про що свідчить новий колір. 493 00:41:45,150 --> 00:41:48,510 Ви продовжуєте, а потім ви потрапляєте іншої зірки, ви потрапили іншого JPEG, 494 00:41:48,510 --> 00:41:50,590 Ви продовжуєте весь шлях до кінця. 495 00:41:50,590 --> 00:41:53,180 Ви знаходитесь на останньої картини тут, рожевий. 496 00:41:53,180 --> 00:41:58,220 Ви йти до кінця, поки не упретеся в кінець файлу характер. 497 00:41:58,220 --> 00:42:00,820 Це буде дуже корисно. 498 00:42:00,820 --> 00:42:03,170 >> Кілька основний винос тут: 499 00:42:03,170 --> 00:42:06,670 Картотеці не починається з JPEG, 500 00:42:06,670 --> 00:42:13,350 але як тільки починається JPEG, всі зображення у форматі JPEG зберігаються пліч-о-пліч один з одним. 501 00:42:17,520 --> 00:42:20,420 >> Деякі псевдокод для відновлення. 502 00:42:20,420 --> 00:42:22,570 По-перше, ми збираємося відкрити нашу картотеку, 503 00:42:22,570 --> 00:42:27,500 і це буде за допомогою нашого файлового введення / виводу. 504 00:42:27,500 --> 00:42:32,430 Ми збираємося повторити наступний процес, поки ми не досягли кінця файлу. 505 00:42:32,430 --> 00:42:36,450 Ми збираємося читати 512 байт за один раз. 506 00:42:36,450 --> 00:42:39,180 І те, що я сказав тут, що ми збираємося зберігати його в буфер, 507 00:42:39,180 --> 00:42:46,230 так в основному триматися за тих 512 байт, поки ми точно знаємо, що з ними робити. 508 00:42:46,230 --> 00:42:50,300 Тоді те, що ми хочемо зробити, це ми хочемо перевірити, чи можемо ми потрапили зірка чи ні. 509 00:42:50,300 --> 00:42:57,960 Якщо ми потрапили зірки, якби ми потрапили одного з вихідних послідовностей, 510 00:42:57,960 --> 00:42:59,980 Потім ми знаємо, що ми потрапили в новий файл JPEG. 511 00:42:59,980 --> 00:43:08,860 Що ми хочемо зробити, це ми збираємося хочете створити новий файл у нашому каталозі pset4 512 00:43:08,860 --> 00:43:14,480 продовжувати робити, що файл. 513 00:43:14,480 --> 00:43:18,220 А крім того, якщо ми вже зробили JPEG і раніше, 514 00:43:18,220 --> 00:43:25,620 Потім ми хочемо закінчити цей файл і підштовхнути її до pset4 папку, 515 00:43:25,620 --> 00:43:29,780 де ми будемо мати, що файл зберігається, тому що якщо ми не вказуємо, що ми закінчили, що JPEG файлів, 516 00:43:29,780 --> 00:43:37,290 тоді ми будемо в основному мають невизначену суму. JPEG, ніколи не закінчиться. 517 00:43:37,290 --> 00:43:40,840 Таким чином, ми хочемо переконатися, що, коли ми читаємо в в файл JPEG і писати, що, 518 00:43:40,840 --> 00:43:46,590 Ми хочемо спеціально близько, що для того, щоб відкрити наступну. 519 00:43:46,590 --> 00:43:48,430 Ми хочемо перевірити кілька речей. 520 00:43:48,430 --> 00:43:52,880 Ми хочемо перевірити, перебуваємо ми на початку нового JPEG з нашим буфером 521 00:43:52,880 --> 00:43:56,780 а також, якщо ми вже знайшли JPEG до 522 00:43:56,780 --> 00:44:03,930 тому що це змінить ваш процес небагато. 523 00:44:03,930 --> 00:44:07,880 Так от після того як ви пройти весь шлях і ви потрапили в кінець файлу, 524 00:44:07,880 --> 00:44:11,570 то що ви хочете зробити, ви хочете, щоб закрити всі файли, які в даний момент відкрито. 525 00:44:11,570 --> 00:44:14,100 Це, ймовірно, буде останній файл JPEG, що у вас є, 526 00:44:14,100 --> 00:44:18,930 а також картотеки, що ви займалися. 527 00:44:21,940 --> 00:44:28,670 >> Остання перешкода, яке нам потрібно було вирішити, як насправді зробити файл JPEG 528 00:44:28,670 --> 00:44:31,950 і як насправді штовхати його в папку. 529 00:44:33,650 --> 00:44:39,850 PSET вимагає, щоб кожен JPEG, що ви знайшли б у наступному форматі, 530 00:44:39,850 --> 00:44:43,990 де у вас є номер. JPG. 531 00:44:43,990 --> 00:44:50,750 Номер, навіть якщо це 0, ми називаємо це 000.jpg. 532 00:44:50,750 --> 00:44:55,730 Всякий раз, коли ви знаходите JPEG в програму, 533 00:44:55,730 --> 00:44:58,040 Ви збираєтеся хочете назвати його в порядок, в якому він був знайдений. 534 00:44:58,040 --> 00:44:59,700 Що це значить? 535 00:44:59,700 --> 00:45:03,530 Ми повинні виду відстежувати, як багато ми знайшли 536 00:45:03,530 --> 00:45:08,680 і те, що число кожного JPEG повинно бути. 537 00:45:08,680 --> 00:45:13,800 Тут ми збираємося скористатися Sprintf функції. 538 00:45:13,800 --> 00:45:17,480 Як і в Printf, які тільки частково відбитки значення з в термінал, 539 00:45:17,480 --> 00:45:23,910 Sprintf друкує файл з в папку. 540 00:45:23,910 --> 00:45:30,870 І що ж це буде робити, якщо у мене було Sprintf, назву, а потім рядок є, 541 00:45:30,870 --> 00:45:36,660 було б роздрукувати 2.jpg. 542 00:45:36,660 --> 00:45:41,020 Якщо припустити, що я закрив файли правильно, 543 00:45:41,020 --> 00:45:47,210 , Який буде містити файл, який я писала з. 544 00:45:47,210 --> 00:45:50,320 Але справа в тому, що код, який я тут 545 00:45:50,320 --> 00:45:53,360 не цілком задовольняє те, що PSET вимагається. 546 00:45:53,360 --> 00:46:02,410 PSET вимагає, щоб другий файл JPEG повинні бути названі 002, а не тільки 2. 547 00:46:02,410 --> 00:46:09,160 Тому, коли ви друкуєте з назви, то, можливо, ви захочете змінити заповнювач небагато. 548 00:46:09,160 --> 00:46:18,140 >> Хтось пам'ятає, як ми дозволити зайві прогалини, коли ми щось надрукувати? 549 00:46:18,140 --> 00:46:22,530 Так. >> [Студент] Ви ставите 3 між знаком відсотка і 2. >> Так, цілком. 550 00:46:22,530 --> 00:46:25,610 Ви будете ставити 3 в даному випадку, тому що ми хочемо простір для 3. 551 00:46:25,610 --> 00:46:32,590 % 3d, ймовірно, дасть вам 002.jpg замість 2. 552 00:46:32,590 --> 00:46:40,120 Перший аргумент у Sprintf функції насправді масив символів, 553 00:46:40,120 --> 00:46:42,520 які ми раніше знали як рядки. 554 00:46:42,520 --> 00:46:50,700 Ті, воля, вид більше схожий на тимчасове зберігання, просто зберігати результуючу рядок. 555 00:46:50,700 --> 00:46:54,950 Ви не будете дійсно мати справу з цим, але ви повинні включити його. 556 00:46:54,950 --> 00:47:00,710 >> Знаючи, що кожне ім'я файлу має номер, який займає три символи, 557 00:47:00,710 --> 00:47:06,770 і потім. JPG, як довго цей масив може бути? 558 00:47:09,070 --> 00:47:14,310 Викиньте номер. Скільки символів у заголовку, в назві? 559 00:47:18,090 --> 00:47:26,320 Таким чином, є 3 хештегі, період, JPG. >> [Студент] 7. >> 7. Не зовсім. 560 00:47:26,320 --> 00:47:32,000 Ми збираємося хочемо 8, тому що ми хочемо, щоб забезпечити нульовий термінатор, а також. 561 00:47:45,340 --> 00:47:49,730 >> Нарешті, щоб витягнути процес, що ви будете робити для відновлення, 562 00:47:49,730 --> 00:47:55,420 у вас є початок інформації. 563 00:47:55,420 --> 00:48:02,460 Ви продовжуєте, поки не знайдете початку файлу JPEG, 564 00:48:02,460 --> 00:48:07,900 і це може бути або один з двох стартових послідовностей. 565 00:48:07,900 --> 00:48:12,510 Ви продовжуйте читати. Кожна риса тут представляє 512 байт. 566 00:48:12,510 --> 00:48:22,630 Ви продовжуйте читати, продовжуйте читати, поки ви не стикаєтеся інший пуску. 567 00:48:22,630 --> 00:48:29,790 Якщо у вас є, що ви в кінцевому поточного JPEG - в даному випадку, це червоний, 568 00:48:29,790 --> 00:48:31,030 так що ви хочете, щоб покінчити з цим. 569 00:48:31,030 --> 00:48:35,540 Ви хочете, щоб Sprintf ім'я, що у вашій папці pset4, 570 00:48:35,540 --> 00:48:41,580 то ви хочете, щоб відкрити нову JPEG, а потім продовжуйте читати 571 00:48:41,580 --> 00:48:46,370 поки ви не стикаєтеся наступному. 572 00:48:46,370 --> 00:48:49,040 Читайте далі, продовжуйте читання, 573 00:48:49,040 --> 00:48:56,290 і, нарешті, в кінці кінців, ви збираєтеся досягти до кінця файлу, 574 00:48:56,290 --> 00:49:00,360 і так що ви хочете, щоб закрити останню JPEG, що ви працюєте, 575 00:49:00,360 --> 00:49:08,380 Sprintf, що у вашому pset4 папку, а потім подивитися на всі фотографії, які ви отримали. 576 00:49:08,380 --> 00:49:12,050 Ті картинки, насправді фотографій CS50 персоналу, 577 00:49:12,050 --> 00:49:16,430 і так це коли частина бонусу задоволення від PSET приходить в 578 00:49:16,430 --> 00:49:26,310 є те, що ви змагаєтеся в розділах знайти ТФ у фотографії 579 00:49:26,310 --> 00:49:34,610 і сфотографуватися з ними, щоб довести, що ви зробили PSET 580 00:49:34,610 --> 00:49:37,030 і тому ви можете побачити, які співробітники мають у своїх картинах. 581 00:49:37,030 --> 00:49:41,510 І тоді ви робите знімки з персоналом. Іноді вам доведеться переслідувати їх вниз. 582 00:49:41,510 --> 00:49:44,680 Ймовірно, деякі з них будуть намагатися втекти від вас. 583 00:49:44,680 --> 00:49:47,320 Ви сфотографуватися з ними. 584 00:49:47,320 --> 00:49:51,190 Це продовжується. Це не через коли PSET пов'язано. 585 00:49:51,190 --> 00:49:53,340 Терміни будуть оголошені в специфікації. 586 00:49:53,340 --> 00:49:58,060 Тоді разом з розділу, в залежності від розділу приймає саму фотографій 587 00:49:58,060 --> 00:50:04,430 з самого співробітників переможе досить дивний приз. 588 00:50:04,430 --> 00:50:08,890 Це свого роду стимул, щоб отримати pset4 закінчена якомога швидше 589 00:50:08,890 --> 00:50:10,820 тому що тоді ви можете приступити до справи 590 00:50:10,820 --> 00:50:14,570 полювання на всі різні CS50 співробітників. 591 00:50:14,570 --> 00:50:17,500 Це не обов'язково, хоча, так що як тільки ви отримаєте фотографії, 592 00:50:17,500 --> 00:50:20,310 Потім ви закінчите з pset4. 593 00:50:20,310 --> 00:50:23,970 >> І я закінчив з Покрокове керівництво 4, так що спасибі всім, хто прийшов. 594 00:50:23,970 --> 00:50:29,330 Успіхів вам у криміналістиці. [Оплески] 595 00:50:29,330 --> 00:50:31,000 [CS50.TV]