1 00:00:00,000 --> 00:00:09,500 >> [Музика грає] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA Чан: Це була міс Скарлетт з підсвічником. 3 00:00:12,350 --> 00:00:13,560 Детективний роман? 4 00:00:13,560 --> 00:00:15,030 Ну, ми збираємося з'ясувати. 5 00:00:15,030 --> 00:00:20,870 У настільної гри Clue, ви, можливо, бути приділена фізичної червоний зображення. 6 00:00:20,870 --> 00:00:24,120 І, що зображення дуже корисний і плямисті, і ваше завдання, щоб 7 00:00:24,120 --> 00:00:25,490 виявити приховані повідомлення. 8 00:00:25,490 --> 00:00:29,740 І, як правило, ви забезпечені червоний збільшувальне скло, або червоний екран 9 00:00:29,740 --> 00:00:31,410 показують, що приховане послання. 10 00:00:31,410 --> 00:00:33,340 Ну, ми збираємося, щоб імітувати, що. 11 00:00:33,340 --> 00:00:37,960 >> У детективний роман, вам дають растрове зображення , Який виглядає дуже плямистим і червоний, 12 00:00:37,960 --> 00:00:43,430 а потім запустити програму детективний роман виявити приховане повідомлення. 13 00:00:43,430 --> 00:00:45,650 >> Так давайте розберемо це в кроків. 14 00:00:45,650 --> 00:00:50,390 По-перше, ви хочете, щоб відкрити файл - ознака того, що ви отримали. 15 00:00:50,390 --> 00:00:53,880 А потім ще й створити Вирок растровий файл. 16 00:00:53,880 --> 00:00:58,240 Тоді ви хочете оновити растрове зображення заголовок інформацію для Вирок OUTFILE. 17 00:00:58,240 --> 00:00:59,920 Детальніше про це пізніше. 18 00:00:59,920 --> 00:01:04,319 А потім ви збираєтеся читати в ключ, Scanline, піксель за пікселем, 19 00:01:04,319 --> 00:01:07,320 зміни кольору пікселів, як необхідно, і лист 20 00:01:07,320 --> 00:01:08,960 ті, у вироку - 21 00:01:08,960 --> 00:01:12,000 піксель за пікселем в Вирок Scanline. 22 00:01:12,000 --> 00:01:13,780 >> Як ми починаємо йти з цього приводу? 23 00:01:13,780 --> 00:01:16,940 Ну, на щастя, у нас є copy.c в коді розподілу. 24 00:01:16,940 --> 00:01:21,240 І це збирається довести досить корисні для нас. 25 00:01:21,240 --> 00:01:29,700 Copy.c відкриває файл, зчитує, що Тема INFILE, а потім оновлює 26 00:01:29,700 --> 00:01:31,070 Тема OUTFILE в. 27 00:01:31,070 --> 00:01:37,010 А потім він читає кожен піксель в Scanline, піксель за пікселем, а потім 28 00:01:37,010 --> 00:01:42,390 пише, що піксель у вихідний файл. 29 00:01:42,390 --> 00:01:45,020 >> Отже, ваш перший крок міг би в тому, щоб запустити наступне 30 00:01:45,020 --> 00:01:46,420 Команда в терміналі - 31 00:01:46,420 --> 00:01:50,270 ср copy.c whodunit.c. 32 00:01:50,270 --> 00:01:55,320 Це створить копію copy.c імені whodunit.c. 33 00:01:55,320 --> 00:01:58,320 Таким чином, наш перший крок, щоб відкрити файл, ну, є точна 34 00:01:58,320 --> 00:02:00,070 копія, що в copy.c. 35 00:02:00,070 --> 00:02:03,360 Тому я залишаю вас подивитися на це. 36 00:02:03,360 --> 00:02:07,860 >> Те, що ми маємо справу з таким PSET буде файловий ввід / вивід, в основному приймаючи файли, 37 00:02:07,860 --> 00:02:10,229 читання, письмо, їх редагування. 38 00:02:10,229 --> 00:02:12,650 Як ви вперше відкриваєте файл? 39 00:02:12,650 --> 00:02:16,800 Ну, ви збираєтеся оголосити файл покажчик, а потім ви називаєте 40 00:02:16,800 --> 00:02:18,670 Функція Еореп. 41 00:02:18,670 --> 00:02:23,150 Перейдіть в дорозі, або ім'я, що файл, а потім режим, який ви хочете 42 00:02:23,150 --> 00:02:24,700 для відкриття цього файлу дюйма 43 00:02:24,700 --> 00:02:28,620 Пас в г відкриє foo.bmp для читання. 44 00:02:28,620 --> 00:02:35,670 У той час як Еореп з проходженням в З будуть відкритий bar.bmp, для запису файлу і 45 00:02:35,670 --> 00:02:37,020 насправді редагування. 46 00:02:37,020 --> 00:02:41,970 >> Так що тепер ми відкрили файл, наш Наступним кроком є ​​оновлення інформації заголовка 47 00:02:41,970 --> 00:02:43,230 для OUTFILE. 48 00:02:43,230 --> 00:02:44,610 Що таке інформаційна заголовок? 49 00:02:44,610 --> 00:02:48,160 Ну, по-перше, ми повинні знати, що растрове зображення. 50 00:02:48,160 --> 00:02:51,000 Растрове зображення простий розташування байтів. 51 00:02:51,000 --> 00:02:55,480 І вони оголошені в цьому файлі тут, bmp.h, з купою 52 00:02:55,480 --> 00:02:58,610 Інформація про те, що растрове зображення насправді складається з. 53 00:02:58,610 --> 00:03:05,730 Але те, що ми дійсно дбаємо про те, заголовок графічного файлу, прямо тут, і 54 00:03:05,730 --> 00:03:08,460 растровое інформації заголовка, тут. 55 00:03:08,460 --> 00:03:13,170 Заголовок складається з декількох змінні, які виявляться дуже корисними. 56 00:03:13,170 --> 00:03:18,400 Існує biSizeImage, яка є Загальний розмір зображення в байтах. 57 00:03:18,400 --> 00:03:20,890 І це включає в себе пікселів і відступи. 58 00:03:20,890 --> 00:03:24,210 Заповнення дуже важливо, але ми повернемося до цього пізніше. 59 00:03:24,210 --> 00:03:30,000 >> BiWidth представляє ширину зображення в пікселях мінус заповнення. 60 00:03:30,000 --> 00:03:34,220 BiHeight потім також висота зображення в пікселях. 61 00:03:34,220 --> 00:03:38,240 І тоді BITMAPFILEHEADER і BITMAPINFOHEADER, як я вже говорив 62 00:03:38,240 --> 00:03:40,900 раніше, тих, представлені як структури. 63 00:03:40,900 --> 00:03:45,410 Таким чином, ви не можете отримати доступ заголовок файлу Сам, але ви хочете, щоб дістатися до 64 00:03:45,410 --> 00:03:47,370 ці змінні всередині. 65 00:03:47,370 --> 00:03:48,170 >> ОК. 66 00:03:48,170 --> 00:03:50,600 Так як же ми оновлюємо інформацію заголовка? 67 00:03:50,600 --> 00:03:54,020 Ну, по-перше, ми повинні бачити чи ми потрібно змінити будь-яку інформацію від 68 00:03:54,020 --> 00:03:58,480 вхідний_файл, ключ, щоб вихідний_файл, вирок. 69 00:03:58,480 --> 00:04:00,250 Що-небудь змінюється в цьому випадку? 70 00:04:00,250 --> 00:04:04,320 Ну, насправді не, тому що ми збираємося бути тільки змінюючи кольору. 71 00:04:04,320 --> 00:04:07,550 Ми не збираємося бути зміни файлу розмір, розмір зображення, ширина, 72 00:04:07,550 --> 00:04:08,310 або висота. 73 00:04:08,310 --> 00:04:14,010 Так що ти в порядку на даний момент по просто копіювання кожного пікселя. 74 00:04:14,010 --> 00:04:14,840 >> ОК. 75 00:04:14,840 --> 00:04:20,720 А тепер давайте подивимося, як ми насправді можете прочитати кожен піксель з файлу. 76 00:04:20,720 --> 00:04:23,640 Ще один файл функція введення / виведення вступить в гру - 77 00:04:23,640 --> 00:04:24,700 FREAD. 78 00:04:24,700 --> 00:04:28,440 Вона займає в покажчик на структури , Який буде містити байти, 79 00:04:28,440 --> 00:04:30,110 ви читаєте. 80 00:04:30,110 --> 00:04:31,890 Таким чином, ви читаєте в це. 81 00:04:31,890 --> 00:04:36,090 А потім ви проходите в розмірі, який є розмір кожного елемента, який ви 82 00:04:36,090 --> 00:04:37,360 хочете читати. 83 00:04:37,360 --> 00:04:40,640 Тут функція SizeOf знадобиться. 84 00:04:40,640 --> 00:04:45,570 Потім проходите в числа, які означає кількість елементів 85 00:04:45,570 --> 00:04:47,480 Розмір читати. 86 00:04:47,480 --> 00:04:51,180 І, нарешті, inptr, який файл покажчик, який ви 87 00:04:51,180 --> 00:04:52,530 буду читати с. 88 00:04:52,530 --> 00:04:58,650 Так всі ці елементи знаходяться всередині inptr і вони збираються даних. 89 00:04:58,650 --> 00:05:01,660 >> Давайте подивимося на невеликий приклад. 90 00:05:01,660 --> 00:05:07,590 Якщо я хочу прочитати в даних двох собак, ну, я можу зробити це одним із двох способів. 91 00:05:07,590 --> 00:05:15,250 Я можу або читати в двох об'єктів розміром собака з моєї inptr, або я можу читати 92 00:05:15,250 --> 00:05:19,280 в одному об'єкті розмір двох собак. 93 00:05:19,280 --> 00:05:23,580 Отже, ви бачите, що залежно від способу що ви влаштовуєте розмір і кількість, вам 94 00:05:23,580 --> 00:05:25,840 можна прочитати в те ж число байтів. 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> Так що тепер, давайте змінимо кольору пікселя, як нам потрібно. 97 00:05:33,020 --> 00:05:37,320 Якщо ви подивитеся на bmp.h знову, то ви побачите, що на дні 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs є ще одним структура, де вони складаються з трьох байтів. 99 00:05:42,920 --> 00:05:49,220 Один з них, rgbtBlue, rgbtGreen і rgbtRed. 100 00:05:49,220 --> 00:05:52,480 Таким чином, кожен з них являє собою суму блакиті, кількість зеленим, а 101 00:05:52,480 --> 00:05:57,250 кількість червоного всередині цього пікселя, де кожна сума представлена 102 00:05:57,250 --> 00:05:58,670 шістнадцяткове число. 103 00:05:58,670 --> 00:06:04,370 >> Так ff0000 буде синій колір, тому що він йде від синього, 104 00:06:04,370 --> 00:06:05,850 на зелений, на червоний. 105 00:06:05,850 --> 00:06:09,300 А потім все е буде білий. 106 00:06:09,300 --> 00:06:13,440 Давайте поглянемо на smiley.bmp, який у вас є у вашому коді розподілу. 107 00:06:13,440 --> 00:06:15,690 Якщо ви відкриєте його в просто зображення глядач, то ви будете 108 00:06:15,690 --> 00:06:17,080 просто бачите червоний смайлик. 109 00:06:17,080 --> 00:06:20,380 Але, приймаючи більш глибоке занурення в, ми будемо бачити, що структура 110 00:06:20,380 --> 00:06:22,340 з це всього лише пікселів. 111 00:06:22,340 --> 00:06:25,880 У нас є білі пікселі, а потім червоні пікселів. 112 00:06:25,880 --> 00:06:31,000 Білий, FFFFFF, а потім все червоні пікселів Я пофарбовані в для вас 113 00:06:31,000 --> 00:06:35,440 тут, і ви бачите, що вони 0000ff. 114 00:06:35,440 --> 00:06:39,760 Нульовий синій, нульовий зелений і повний червоний. 115 00:06:39,760 --> 00:06:45,350 А так як смайлик у вісім пікселів в ширину, ми не маємо ніякого заповнення. 116 00:06:45,350 --> 00:06:47,360 Добре. 117 00:06:47,360 --> 00:06:53,310 >> Так що, якщо б я мав призначити різні значення до RGBTRIPLE, і я хотів 118 00:06:53,310 --> 00:06:58,350 зробити його зеленим, то, що я хотів би зробити це Я б оголосити RGBTRIPLE, названий 119 00:06:58,350 --> 00:07:02,660 потрійний, а потім, щоб отримати доступ кожен байт в межах цієї структури I 120 00:07:02,660 --> 00:07:04,030 буде використовувати оператор точки. 121 00:07:04,030 --> 00:07:08,430 Так triple.rgbtBlue, я можу призначати що в 0. 122 00:07:08,430 --> 00:07:13,460 Зелений я можу призначити його на повний - будь число, дійсно, від 0 до FF. 123 00:07:13,460 --> 00:07:15,470 А потім червоний, я також збираюся сказати 0. 124 00:07:15,470 --> 00:07:19,160 Отже, що дає мені зелений піксель. 125 00:07:19,160 --> 00:07:23,030 >> Далі, те, що, якщо я хочу, щоб перевірити значення чогось? 126 00:07:23,030 --> 00:07:27,250 Я міг мати те, що перевіряє Чи має значення rgbtBlue потрійний є 127 00:07:27,250 --> 00:07:31,080 і далі, а потім роздрукувати, "Я відчуваю себе синій ", в якості результату. 128 00:07:31,080 --> 00:07:35,640 Тепер, це не обов'язково означає, що піксель синього кольору, чи не так? 129 00:07:35,640 --> 00:07:40,060 Тому що зелені та червоні значення пікселя також може мати трохи-0 значення. 130 00:07:40,060 --> 00:07:43,470 Все, що це означає, і все, що це перевірка на це 131 00:07:43,470 --> 00:07:45,610 для повного синього кольору. 132 00:07:45,610 --> 00:07:50,050 Але всі пікселі також може мати часткове колірні значення, як це 133 00:07:50,050 --> 00:07:52,180 Наступний приклад тут. 134 00:07:52,180 --> 00:07:55,400 >> Це трохи складніше побачити що цей образ зараз. 135 00:07:55,400 --> 00:08:00,320 Це виглядає трохи більше, як clue.bmp, що вам буде надана. 136 00:08:00,320 --> 00:08:03,600 Тепер, фізично, ви можете вирішити цю проблему, тому що є багато корисного, по 137 00:08:03,600 --> 00:08:07,040 піднявши червоний екран з зображенням так які можуть з'явитися інші кольори. 138 00:08:07,040 --> 00:08:10,968 Так як же нам імітувати це з с? 139 00:08:10,968 --> 00:08:15,640 Ну, ми могли б видалити всі червоні із зображення повністю. 140 00:08:15,640 --> 00:08:21,870 І так робити, що ми кожного набір червоний значення пікселя в 0. 141 00:08:21,870 --> 00:08:25,020 І тому зображення буде виглядати трохи трохи, як це, де нас немає ніякої червоний 142 00:08:25,020 --> 00:08:26,300 б то не було. 143 00:08:26,300 --> 00:08:29,390 >> Ми можемо побачити прихований повідомлення про трохи більш ясно тепер. 144 00:08:29,390 --> 00:08:31,730 Це ще один смайлик. 145 00:08:31,730 --> 00:08:33,870 Або, може бути, ми могли б використовувати інший метод. 146 00:08:33,870 --> 00:08:36,480 Може бути, ми могли б визначити всі червоні пікселів - 147 00:08:36,480 --> 00:08:41,100 тобто, всі пікселі з 0 синій, 0 зелений, і 0 червоний - 148 00:08:41,100 --> 00:08:43,169 і змінити ті на білий. 149 00:08:43,169 --> 00:08:45,470 І наше зображення може виглядати щось на зразок цього. 150 00:08:45,470 --> 00:08:48,250 Трохи легше побачити. 151 00:08:48,250 --> 00:08:51,170 >> Є багато інших способів розкрити Секретне повідомлення, а також, 152 00:08:51,170 --> 00:08:53,730 справа з колірною маніпуляції. 153 00:08:53,730 --> 00:08:57,050 Може бути, ви могли б використовувати один з методів що я вже згадував вище. 154 00:08:57,050 --> 00:08:59,600 І крім того, ви можете для підвищення деяких квітів 155 00:08:59,600 --> 00:09:02,620 і притягнути винних поза. 156 00:09:02,620 --> 00:09:06,190 >> Так що тепер ми змінили піксель колір, потім ми просто потрібно записати їх 157 00:09:06,190 --> 00:09:08,500 в до рядка розгорнення, піксель за пікселем. 158 00:09:08,500 --> 00:09:11,860 І ще раз, ви хочете, щоб озирнутися назад щоб copy.c, якщо ви не скопіювали 159 00:09:11,860 --> 00:09:18,170 це вже, і подивитися на FWRITE Функція, яка приймає дані, покажчик 160 00:09:18,170 --> 00:09:23,230 до структури, яка містить байт що ви читаєте з, розміру 161 00:09:23,230 --> 00:09:26,610 елементи, кількість елементів, а потім outptr - 162 00:09:26,610 --> 00:09:29,450 призначення цих файлів. 163 00:09:29,450 --> 00:09:34,010 >> Після написання в пікселях, ви будете також повинні написати в оббивці. 164 00:09:34,010 --> 00:09:34,970 Що таке оббивка? 165 00:09:34,970 --> 00:09:38,670 Ну, кожен rgbt пікселів три байта. 166 00:09:38,670 --> 00:09:43,670 Але, Scanline для растрового зображення Повинно бути кратна чотирьом байтам. 167 00:09:43,670 --> 00:09:47,650 І якщо кількість пікселів НЕ кратно чотирьом, то нам потрібно додати 168 00:09:47,650 --> 00:09:48,880 це оббивка. 169 00:09:48,880 --> 00:09:51,420 Заповнення просто представлена ​​0s. 170 00:09:51,420 --> 00:09:54,380 Отже, як ми пишемо, або читати це? 171 00:09:54,380 --> 00:09:59,280 Ну, виходить, що ви не можете фактично FREAD оббивка, але ви можете 172 00:09:59,280 --> 00:10:00,970 обчислити його. 173 00:10:00,970 --> 00:10:04,400 >> У цьому випадку, ключ і вирок мають однакову ширину, так 174 00:10:04,400 --> 00:10:05,910 оббивка те ж саме. 175 00:10:05,910 --> 00:10:09,370 І оббивка, як ви побачите в copy.c, розраховується 176 00:10:09,370 --> 00:10:11,790 з наведеної нижче формулою - 177 00:10:11,790 --> 00:10:16,690 bi.biWidth раз SizeOf (RGBTRIPLE) буде дати нам, скільки байтів BMP 178 00:10:16,690 --> 00:10:18,280 має в кожному рядку. 179 00:10:18,280 --> 00:10:21,890 Звідти, модулів і відрахування з 4 можна розрахувати як 180 00:10:21,890 --> 00:10:25,610 кількість байтів повинні бути додані так, щоб кратним байт на 181 00:10:25,610 --> 00:10:27,250 кожна рядок є чотири. 182 00:10:27,250 --> 00:10:30,490 >> Тепер, коли у нас є формула для скільки оббивка нам потрібно, тепер 183 00:10:30,490 --> 00:10:31,610 ми можемо записати його. 184 00:10:31,610 --> 00:10:34,080 Тепер, я вже говорив, оббивка знаходиться всього 0s. 185 00:10:34,080 --> 00:10:39,730 Так що в цьому випадку ми просто покласти символ, в даному випадку 0, в нашій 186 00:10:39,730 --> 00:10:41,710 outptr - наш вихідний файл. 187 00:10:41,710 --> 00:10:47,530 Так що може бути просто fputc 0, кома outptr. 188 00:10:47,530 --> 00:10:52,400 >> Так, в той час як ми читали в наших , Файл введення / виведення стежив за нашою 189 00:10:52,400 --> 00:10:57,440 Положення в цих файлах з чимось називається індикатор позиції файлу. 190 00:10:57,440 --> 00:10:59,350 Думайте про нього, як курсор. 191 00:10:59,350 --> 00:11:03,550 В основному, це кошти, кожен раз, коли що ми FREAD, але у нас є 192 00:11:03,550 --> 00:11:05,671 контроль над ним, теж. 193 00:11:05,671 --> 00:11:11,030 >> Для переміщення індикатор позиції файлу, Ви можете використовувати функцію FSEEK. 194 00:11:11,030 --> 00:11:15,600 Де inptr представляє файл покажчик, який ви шукаєте в, 195 00:11:15,600 --> 00:11:20,370 сума кількість байт, що ви хочете, щоб перемістити курсор, а потім з 196 00:11:20,370 --> 00:11:23,470 відноситься до опорної точці звідки курсор знаходиться. 197 00:11:23,470 --> 00:11:26,770 Якщо ви передаєте в SEEK_CUR, що являє собою струм 198 00:11:26,770 --> 00:11:28,100 положення у файлі. 199 00:11:28,100 --> 00:11:31,020 Або ви можете використовувати деякі інші параметри. 200 00:11:31,020 --> 00:11:35,400 Таким чином, ми, можливо, захочете використовувати FSEEK пропустити над прокладанням файлу в. 201 00:11:35,400 --> 00:11:39,410 І знову ж, якщо ви застрягли, є приклад, що в copy.c. 202 00:11:39,410 --> 00:11:43,260 >> Так що тепер ми відкрили файл, розгадка, і вирок. 203 00:11:43,260 --> 00:11:46,450 Ми оновили інформацію заголовка для наш вердикт, тому що кожен 204 00:11:46,450 --> 00:11:48,730 бітова карта потребує заголовок. 205 00:11:48,730 --> 00:11:52,280 Ми то читайте в розгадка'S Scanline, піксель за пікселем, зміна 206 00:11:52,280 --> 00:11:55,210 кожен колір у міру необхідності, і писати ті, в 207 00:11:55,210 --> 00:11:57,340 Вирок, піксель за пікселем. 208 00:11:57,340 --> 00:12:01,550 Як тільки ви відкриваєте вирок, ви можете бачити, хто злочинець, або в чому секрет 209 00:12:01,550 --> 00:12:02,850 повідомлення. 210 00:12:02,850 --> 00:12:05,550 Мене звуть Zamyla, і це було детективний роман. 211 00:12:05,550 --> 00:12:12,864