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 Whodunit? 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 >> Во whodunit, ти си даде bitmap слика што изгледа многу петна и црвена, 12 00:00:37,960 --> 00:00:43,430 а потоа извршете ја whodunit програма да се открие скриен порака. 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 А потоа, исто така, создаде Пресудата bitmap датотека. 16 00:00:53,880 --> 00:00:58,240 Тогаш ќе сакате да го обновите на bitmap заглавието информации за пресудата 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 пишува дека пиксели во 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 cp 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 е датотека 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 функција fopen. 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 Додека fopen со донесување на 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 Битмапа е само едноставна уредување на бајти. 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 Но, она што навистина се грижат за е bitmap датотека насловот, токму тука, и 54 00:03:05,730 --> 00:03:08,460 на bitmap инфо насловот, овде. 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 порано, оние се застапени како 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 Таа ги зема во покажувач на struct која ќе содржат бајти кои 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 се уште struct, каде тие се составени од три бајти. 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 тројна, а потоа да се пристапи секој бајт во рамките на таа struct јас 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 и понатаму. 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 ff, а потоа печати, "Јас сум чувство сини! ", како резултат. 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 во на scanline, пиксел од пиксел. 158 00:09:08,500 --> 00:09:11,860 И уште еднаш, ќе сакате да се погледне назад да copy.c, ако не сте го копирале 159 00:09:11,860 --> 00:09:18,170 тоа веќе, и се погледне на запишување функција, кој се земаат податоци, покажувач 160 00:09:18,170 --> 00:09:23,230 на struct, која содржи бајти дека сте читање од, големината на 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 за bitmap слика мора да биде повеќе од четири бајти. 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 Соочи е само претставени од 0-ти. 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 Од таму, 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 Сега, јас напоменав претходно, Соочи е само 0-ти. 185 00:10:34,080 --> 00:10:39,730 Значи во тој случај, ние сме само ставање char, во овој случај 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, и ова беше whodunit. 211 00:12:05,550 --> 00:12:12,864