1 00:00:00,000 --> 00:00:09,500 >> [За възпроизвеждане на музика] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA CHAN: Това беше мис Скарлет със светилника. 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 В игра на дъска представа, може да да получат физическо червено изображение. 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 Е, за щастие, имаме резервното в кода на разпределение. 24 00:01:16,940 --> 00:01:21,240 И това ще се докаже доста полезно за нас. 25 00:01:21,240 --> 00:01:29,700 Резервното отваря файл, прочита в тази заглавна 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 пише, че пиксел в outfile. 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 кп резервното whodunit.c. 32 00:01:50,270 --> 00:01:55,320 Това ще създаде копие на резервното име 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 се файл I / O, основно като файлове, 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 FОтваряне на функция. 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 Минавайки в R ще се отвори foo.bmp за четене. 44 00:02:28,620 --> 00:02:35,670 Като има предвид, FОтваряне на с преминаване в w ще отворен 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 A растерна графика е просто подреждане на байта. 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 на растерна информация Header, насам. 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 Padding е много важно, но ние ще стигнем до това по-късно. 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 по-горе, тези са представени като structs. 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 >> OK. 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 на INFILE, следата, на outfile, присъдата. 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 >> OK. 75 00:04:14,840 --> 00:04:20,720 Така че сега нека да разгледаме как ние всъщност може да чете всеки пиксел от файла. 76 00:04:20,720 --> 00:04:23,640 Друг I / O функция файл ще влезе в игра - 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 One, 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 Green мога да го възложи на пълен - всички номер, наистина, между 0 и сл.. 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 I може да има нещо, което проверява дали 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 Така че как можем да имитират това с C? 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 в до Scanline, пиксел по пиксел. 158 00:09:08,500 --> 00:09:11,860 И все пак, вие ще искате да погледнете назад за резервното, ако не сте копирали 159 00:09:11,860 --> 00:09:18,170 вече, и погледнете в неуспешно функция, която отнема данни, указател 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 Padding е само представлявана от 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 И пълнежа, както ще видите в резервното, се изчислява 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 От там, modulos и изваждания с 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 - нашата outfile. 187 00:10:41,710 --> 00:10:47,530 Така че може да бъде само fputc 0, запетая outptr. 188 00:10:47,530 --> 00:10:52,400 >> Така че, докато сме били четене в нашата файл, файл I / O е запазил следите на нашата 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 Ние сме след това прочетете в представа-те 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