1 00:00:00,000 --> 00:00:09,500 >> [MUSIC PLAYBACK] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA CHAN: Bolo to slečna Scarlett s svietnika. 3 00:00:12,350 --> 00:00:13,560 Detektívka? 4 00:00:13,560 --> 00:00:15,030 Dobre, ideme to zistiť. 5 00:00:15,030 --> 00:00:20,870 V doskové hry Clue, môžete byť fyzické červený obraz. 6 00:00:20,870 --> 00:00:24,120 A že obraz je veľmi červené a fľakatý, a vašou úlohou je 7 00:00:24,120 --> 00:00:25,490 odhaliť skryté posolstvo. 8 00:00:25,490 --> 00:00:29,740 A zvyčajne ste za predpokladu, s červenou zväčšovacie sklo, alebo červené obrazovky 9 00:00:29,740 --> 00:00:31,410 ukazujú, že skryté posolstvo. 10 00:00:31,410 --> 00:00:33,340 No, budeme napodobňovať. 11 00:00:33,340 --> 00:00:37,960 >> V detektívka, že ste daný rastrový obrázok ktorý vyzerá veľmi uhrovitý a červenej, 12 00:00:37,960 --> 00:00:43,430 a potom spustite program detektívka odhaliť skryté posolstvo. 13 00:00:43,430 --> 00:00:45,650 >> Takže poďme rozbiť to na schodoch. 14 00:00:45,650 --> 00:00:50,390 Po prvé, budete chcieť otvoriť súbor - vodítko, ktoré ste dostali. 15 00:00:50,390 --> 00:00:53,880 A potom tiež vytvoriť Verdikt bitmapový obrázok. 16 00:00:53,880 --> 00:00:58,240 Potom chcete aktualizovať bitmapu header info na verdikt outFile. 17 00:00:58,240 --> 00:00:59,920 Viac o tom neskôr. 18 00:00:59,920 --> 00:01:04,319 A potom budete čítať do stopa, scanline, pixel po pixeli, 19 00:01:04,319 --> 00:01:07,320 meniace sa farby pixelu ako potrebné, a písanie 20 00:01:07,320 --> 00:01:08,960 tie, do verdiktu - 21 00:01:08,960 --> 00:01:12,000 pixel po pixeli do verdikt scanline. 22 00:01:12,000 --> 00:01:13,780 >> Ako začneme ísť o to? 23 00:01:13,780 --> 00:01:16,940 No, našťastie, máme copy.c v distribučnej kódu. 24 00:01:16,940 --> 00:01:21,240 A toto dokázať veľmi užitočné pre nás. 25 00:01:21,240 --> 00:01:29,700 Copy.c otvorí súbor, prečíta, že Infil v záhlaví, a potom aktualizuje 26 00:01:29,700 --> 00:01:31,070 outfile v záhlaví. 27 00:01:31,070 --> 00:01:37,010 A potom sa to číta každý pixel v scanline, pixel po pixeli, a potom 28 00:01:37,010 --> 00:01:42,390 píše, že pixel do outFile. 29 00:01:42,390 --> 00:01:45,020 >> Takže, môže váš prvý krok bolo spustiť nasledujúce 30 00:01:45,020 --> 00:01:46,420 Príkaz v termináli - 31 00:01:46,420 --> 00:01:50,270 cp copy.c whodunit.c. 32 00:01:50,270 --> 00:01:55,320 Tým sa vytvorí kópia copy.c menoval whodunit.c. 33 00:01:55,320 --> 00:01:58,320 Takže naše prvý krok k otvoreniu súbor, dobre, tam je presný 34 00:01:58,320 --> 00:02:00,070 Replika, ktorá v copy.c. 35 00:02:00,070 --> 00:02:03,360 Tak som ťa nechať, aby sa na to. 36 00:02:03,360 --> 00:02:07,860 >> Čo máme čo do činenia s týmto pset sa súbor I / O, v podstate s súbory, 37 00:02:07,860 --> 00:02:10,229 čítanie, písanie, ich editáciu. 38 00:02:10,229 --> 00:02:12,650 Ako si najprv otvorte súbor? 39 00:02:12,650 --> 00:02:16,800 No, budete deklarovať súbor ukazovateľ, a potom zavoláte 40 00:02:16,800 --> 00:02:18,670 Funkcie fopen. 41 00:02:18,670 --> 00:02:23,150 Prejsť na ceste, alebo názov, ktorý súbor, a potom režim, ktorý chcete 42 00:02:23,150 --> 00:02:24,700 otvoriť tento súbor palcov 43 00:02:24,700 --> 00:02:28,620 Odovzdávanie v r sa otvorí foo.bmp pre čítanie. 44 00:02:28,620 --> 00:02:35,670 Vzhľadom k tomu, fopen s kolesom v w otvorené bar.bmp, pre písanie súbor a 45 00:02:35,670 --> 00:02:37,020 vlastne úprav. 46 00:02:37,020 --> 00:02:41,970 >> Takže teraz, že sme otvorili súbor, naša Ďalším krokom je aktualizovať informácie záhlaví 47 00:02:41,970 --> 00:02:43,230 outFile. 48 00:02:43,230 --> 00:02:44,610 Čo je to info hlavičky? 49 00:02:44,610 --> 00:02:48,160 No, najprv musíme vedieť, čo je bitmapa. 50 00:02:48,160 --> 00:02:51,000 Raster je len jednoduchý usporiadanie bytov. 51 00:02:51,000 --> 00:02:55,480 A oni sú deklarované v tomto súbore tu, bmp.h, s partiou 52 00:02:55,480 --> 00:02:58,610 informácie o tom, čo bitmapy je v skutočnosti vyrobená z 53 00:02:58,610 --> 00:03:05,730 Ale to, čo naozaj záleží, je záhlavie bitmapový obrázok, tu, a 54 00:03:05,730 --> 00:03:08,460 bitmap info záhlavie, sem. 55 00:03:08,460 --> 00:03:13,170 Záhlavie sa skladá z niekoľkých Premenné, ktoré sa ukážu ako veľmi užitočné. 56 00:03:13,170 --> 00:03:18,400 K dispozícii je biSizeImage, ktorý je Celková veľkosť obrazu v bajtoch. 57 00:03:18,400 --> 00:03:20,890 A to zahŕňa pixelov a polstrovanie. 58 00:03:20,890 --> 00:03:24,210 Polstrovanie je veľmi dôležité, ale dostaneme sa k tomu neskôr. 59 00:03:24,210 --> 00:03:30,000 >> BiWidth predstavuje šírku obrázku v pixeloch mínus polstrovanie. 60 00:03:30,000 --> 00:03:34,220 BiHeight je potom tiež výšku obrazu v pixeloch. 61 00:03:34,220 --> 00:03:38,240 A potom BITMAPFILEHEADER a BITMAPINFOHEADER, ako som sa zmienil 62 00:03:38,240 --> 00:03:40,900 skôr, ktoré sú zastúpené ako štruktúr. 63 00:03:40,900 --> 00:03:45,410 Takže, nie je možné získať prístup k hlavičku súboru sama o sebe, ale budete chcieť, aby sa na 64 00:03:45,410 --> 00:03:47,370 tieto premenné vnútri. 65 00:03:47,370 --> 00:03:48,170 >> OK. 66 00:03:48,170 --> 00:03:50,600 Tak ako sme sa aktualizovať informácie hlavičky? 67 00:03:50,600 --> 00:03:54,020 No, najprv musíme zistiť, či sme potrebujete zmeniť akékoľvek informácie od 68 00:03:54,020 --> 00:03:58,480 Infil, vodítko, aby outfile, verdikt. 69 00:03:58,480 --> 00:04:00,250 Je niečo meniť v tomto prípade? 70 00:04:00,250 --> 00:04:04,320 No, vlastne, pretože ideme byť len zmenou farby. 71 00:04:04,320 --> 00:04:07,550 Nebudeme sa zmenou súboru veľkosť, veľkosť obrazu, šírka, 72 00:04:07,550 --> 00:04:08,310 alebo výšky. 73 00:04:08,310 --> 00:04:14,010 Takže ste v poriadku, teraz by len kopírovanie každý pixel. 74 00:04:14,010 --> 00:04:14,840 >> OK. 75 00:04:14,840 --> 00:04:20,720 Takže teraz sa poďme pozrieť na to, ako sme sa vlastne môže prečítať každý pixel zo súboru. 76 00:04:20,720 --> 00:04:23,640 Ďalší súbor I / O funkcie príde do hry - 77 00:04:23,640 --> 00:04:24,700 fread. 78 00:04:24,700 --> 00:04:28,440 Trvá na ukazovateľ na struct ktorý bude obsahovať bajtov, ktoré 79 00:04:28,440 --> 00:04:30,110 čítate. 80 00:04:30,110 --> 00:04:31,890 Takže čítate do toho. 81 00:04:31,890 --> 00:04:36,090 A potom sa prejsť do veľkosti, ktorá je veľkosť každého prvku, ktorý 82 00:04:36,090 --> 00:04:37,360 chcete prečítať. 83 00:04:37,360 --> 00:04:40,640 Tu funkcia sizeof príde vhod. 84 00:04:40,640 --> 00:04:45,570 Potom môžete prejsť v počte, ktorý predstavuje počet prvkov 85 00:04:45,570 --> 00:04:47,480 Veľkosť na čítanie. 86 00:04:47,480 --> 00:04:51,180 A nakoniec, inptr, ktorý je súbor ukazovateľ, ktorý ste 87 00:04:51,180 --> 00:04:52,530 bude čítať z 88 00:04:52,530 --> 00:04:58,650 Takže všetky tieto prvky sú vo vnútri inptr a idú k dátam. 89 00:04:58,650 --> 00:05:01,660 >> Pozrime sa na malý príklad. 90 00:05:01,660 --> 00:05:07,590 Ak chcem, aby si do dátových dvoma psami, No, môžem to urobiť jedným z dvoch spôsobov. 91 00:05:07,590 --> 00:05:15,250 Môžem buď čítať v dvoch objektoch o veľkosti pes z môjho inptr, alebo môžem prečítať 92 00:05:15,250 --> 00:05:19,280 v jednom objekte o veľkosti dvoch psov. 93 00:05:19,280 --> 00:05:23,580 Takže vidíte, že v závislosti na spôsobe že si dojednať veľkosť a počet, vás 94 00:05:23,580 --> 00:05:25,840 môže čítať v rovnakom počte bajtov. 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> Takže teraz, poďme zmeniť farba pixelu, ako potrebujeme. 97 00:05:33,020 --> 00:05:37,320 Ak sa pozriete na bmp.h znova, uvidíte, že na dne 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs sú ďalšie struct, kde sa skladá z troch bajtov. 99 00:05:42,920 --> 00:05:49,220 Jeden, rgbtBlue, rgbtGreen, a rgbtRed. 100 00:05:49,220 --> 00:05:52,480 Takže každý z nich predstavuje čiastku modré, množstvo zelene, a 101 00:05:52,480 --> 00:05:57,250 množstvo červenej vnútri tohto pixelu, ak každá suma je zastúpená 102 00:05:57,250 --> 00:05:58,670 hexadecimálne číslo. 103 00:05:58,670 --> 00:06:04,370 >> Takže FF0000 bude modrá farba, , Pretože to ide od modrej, 104 00:06:04,370 --> 00:06:05,850 na zelenú až po červenú. 105 00:06:05,850 --> 00:06:09,300 A potom f je bude biela. 106 00:06:09,300 --> 00:06:13,440 Poďme sa pozrieť na smiley.bmp, ktoré máte v distribučnom kódu. 107 00:06:13,440 --> 00:06:15,690 Ak ho otvoriť len v obraze divák, potom budete 108 00:06:15,690 --> 00:06:17,080 len vidieť červený smajlík. 109 00:06:17,080 --> 00:06:20,380 Ale s hlbší ponor do, my budeme vidieť, že štruktúra 110 00:06:20,380 --> 00:06:22,340 ze je to len pixelov. 111 00:06:22,340 --> 00:06:25,880 Máme biele pixely, a potom červené pixelov. 112 00:06:25,880 --> 00:06:31,000 Biela, ffffff, a potom všetci červené pixely som farebné v pre vás 113 00:06:31,000 --> 00:06:35,440 tu, a uvidíte, že sú to 0000FF. 114 00:06:35,440 --> 00:06:39,760 Zero modrá, zelená nula, a plná červená. 115 00:06:39,760 --> 00:06:45,350 A pretože smiley je osem pixelov, nemáme žiadnu výplň. 116 00:06:45,350 --> 00:06:47,360 Dobrá. 117 00:06:47,360 --> 00:06:53,310 >> Takže ak by som mal priradiť rôzne hodnoty na RGBTRIPLE a chcel som, aby 118 00:06:53,310 --> 00:06:58,350 aby to zelené, potom to, čo budem robiť, je Chcel by som vyhlásiť RGBTRIPLE, s názvom 119 00:06:58,350 --> 00:07:02,660 trojlôžková, a potom prístup k každý byte v rámci tohto struct Aj 120 00:07:02,660 --> 00:07:04,030 by pomocou operátora bodka. 121 00:07:04,030 --> 00:07:08,430 Takže triple.rgbtBlue, môžem priradiť, že na 0. 122 00:07:08,430 --> 00:07:13,460 Zelená môžem priradiť ju k plnej - akýkoľvek číslo, naozaj, medzi 0 a nasl. 123 00:07:13,460 --> 00:07:15,470 A potom červená, ja som tiež chcel povedať 0.. 124 00:07:15,470 --> 00:07:19,160 Tak to mi dáva zelenú pixel. 125 00:07:19,160 --> 00:07:23,030 >> Ďalej, čo keď chcem skontrolovať hodnota niečo? 126 00:07:23,030 --> 00:07:27,250 Mohol by som mať niečo, čo kontroluje či rgbtBlue hodnota trojitého je 127 00:07:27,250 --> 00:07:31,080 ff a potom vytlačiť, "Cítim sa blue! ", ako výsledok. 128 00:07:31,080 --> 00:07:35,640 No, to nemusí nutne znamenať, že pixel je modrá, nie? 129 00:07:35,640 --> 00:07:40,060 Vzhľadom k tomu, zelenej a červenej hodnoty pixelu by mohol mať tiež non-0 hodnoty. 130 00:07:40,060 --> 00:07:43,470 Všetko, čo to znamená, a to všetko to je kontrola je 131 00:07:43,470 --> 00:07:45,610 pre plnú modrú farbu. 132 00:07:45,610 --> 00:07:50,050 Ale všetky pixelov môže mať aj čiastočná farebné hodnoty, ako je táto, 133 00:07:50,050 --> 00:07:52,180 Ďalší príklad tu. 134 00:07:52,180 --> 00:07:55,400 >> Je to trochu ťažšie vidieť čo tento obraz je teraz. 135 00:07:55,400 --> 00:08:00,320 Vyzerá to trochu ako clue.bmp, ktoré budete mať. 136 00:08:00,320 --> 00:08:03,600 Teraz, fyzicky, môžete to vyriešiť, pretože tam je veľa červenej, ktoré 137 00:08:03,600 --> 00:08:07,040 drží červenú obrazovku do obrazu tak, že sa môžu objaviť ďalšie farby. 138 00:08:07,040 --> 00:08:10,968 Tak ako sme sa napodobňovať to s c? 139 00:08:10,968 --> 00:08:15,640 No, mohli by sme odstrániť všetky červené z obrazu úplne. 140 00:08:15,640 --> 00:08:21,870 A tak k tomu, že by sme nastaviť každý pixelu red hodnotu 0.. 141 00:08:21,870 --> 00:08:25,020 A tak obraz bude vyzerať trochu trochu ako to, kde máme žiadnu červenú 142 00:08:25,020 --> 00:08:26,300 vôbec. 143 00:08:26,300 --> 00:08:29,390 >> Môžeme vidieť skrytú správu s trochu viac teraz jasne. 144 00:08:29,390 --> 00:08:31,730 Je to ďalšie smajlíky. 145 00:08:31,730 --> 00:08:33,870 Alebo možno by sme mohli použiť inú metódu. 146 00:08:33,870 --> 00:08:36,480 Možno, že by sme mohli identifikovať všetky červené pixely - 147 00:08:36,480 --> 00:08:41,100 to znamená, že všetky pixely s 0 modrá, 0 zelenej a 0 červená - 148 00:08:41,100 --> 00:08:43,169 a zmeniť tie na bielu. 149 00:08:43,169 --> 00:08:45,470 A náš obraz môže vyzerať niečo také. 150 00:08:45,470 --> 00:08:48,250 Trochu lepšie vidieť. 151 00:08:48,250 --> 00:08:51,170 >> Existuje mnoho iných spôsobov, ako odkryť tajné správy, rovnako, 152 00:08:51,170 --> 00:08:53,730 zaoberajúce sa manipuláciou farieb. 153 00:08:53,730 --> 00:08:57,050 Možno, že môžete použiť jednu z metód že som sa zmienil vyššie. 154 00:08:57,050 --> 00:08:59,600 A navyše, možno budete chcieť zlepšiť niektoré farby 155 00:08:59,600 --> 00:09:02,620 a priniesť tie von. 156 00:09:02,620 --> 00:09:06,190 >> Takže teraz, že sme zmenili pixel farba, ďalšie len treba im napísať 157 00:09:06,190 --> 00:09:08,500 sa do scanline, pixel po pixeli. 158 00:09:08,500 --> 00:09:11,860 A ešte raz, budete chcieť pozrieť späť na copy.c, ak ste kopírovať 159 00:09:11,860 --> 00:09:18,170 to už, a pozrieť sa na fwrite funkcie, ktoré sa údaje, ukazovateľ 160 00:09:18,170 --> 00:09:23,230 na struct, ktorý obsahuje bajtov že čítate z, veľkosti 161 00:09:23,230 --> 00:09:26,610 položky, počet kusov, a potom outptr - 162 00:09:26,610 --> 00:09:29,450 určenie týchto súborov. 163 00:09:29,450 --> 00:09:34,010 >> Potom, čo píšete v pixeloch, budete si musieť vybrať tiež musieť napísať do polstrovanie. 164 00:09:34,010 --> 00:09:34,970 Čo je polstrovanie? 165 00:09:34,970 --> 00:09:38,670 No, každý rgbt pixel je tri bajtov. 166 00:09:38,670 --> 00:09:43,670 Ale scanline pre bitmapový obraz musí byť násobkom štyroch bajtov. 167 00:09:43,670 --> 00:09:47,650 A v prípade, že počet pixelov nie je násobkom štyroch, potom musíme pridať 168 00:09:47,650 --> 00:09:48,880 tento polstrovanie. 169 00:09:48,880 --> 00:09:51,420 Polstrovanie je len zastúpená 0s. 170 00:09:51,420 --> 00:09:54,380 Tak, ako sme sa písať, alebo čítať to? 171 00:09:54,380 --> 00:09:59,280 No, ukázalo sa, že nemôžete vlastne fread polstrovanie, ale môžete 172 00:09:59,280 --> 00:10:00,970 výpočtu. 173 00:10:00,970 --> 00:10:04,400 >> V tomto prípade, vodítko a verdikt majú rovnakú šírku, takže 174 00:10:04,400 --> 00:10:05,910 polstrovanie je rovnaký. 175 00:10:05,910 --> 00:10:09,370 A padding, ako uvidíte v copy.c, sa vypočíta 176 00:10:09,370 --> 00:10:11,790 s nižšie vzorca - 177 00:10:11,790 --> 00:10:16,690 bi.biWidth krát sizeof (RGBTRIPLE) bude dať nám, koľko bajtov bmp 178 00:10:16,690 --> 00:10:18,280 má v každom riadku. 179 00:10:18,280 --> 00:10:21,890 Odtiaľ módulos a rozdiely so 4 možno vypočítať, ako 180 00:10:21,890 --> 00:10:25,610 veľa bytov musia byť pridané tak, aby násobok bajtov na 181 00:10:25,610 --> 00:10:27,250 každý riadok je štyri. 182 00:10:27,250 --> 00:10:30,490 >> Teraz, keď máme vzorec pre koľko padding potrebujeme, teraz 183 00:10:30,490 --> 00:10:31,610 môžeme napísať. 184 00:10:31,610 --> 00:10:34,080 Teraz som sa zmienil predtým, polstrovanie je len 0s. 185 00:10:34,080 --> 00:10:39,730 Takže v tomto prípade, my sme len uvedenie char, v tomto prípade 0, do nášho 186 00:10:39,730 --> 00:10:41,710 outptr - naše outfile. 187 00:10:41,710 --> 00:10:47,530 Takže to môže byť len fputc 0, čiarka outptr. 188 00:10:47,530 --> 00:10:52,400 >> Takže, keď sme čítali v našich súbor, súbor I / O udržuje prehľad o našich 189 00:10:52,400 --> 00:10:57,440 pozície v týchto súboroch s niečím tzv ukazovateľ pozície v súbore. 190 00:10:57,440 --> 00:10:59,350 Ber to ako kurzor. 191 00:10:59,350 --> 00:11:03,550 V podstate, to postupuje zakaždým že sme fread, ale máme 192 00:11:03,550 --> 00:11:05,671 kontrolu nad ním, taky. 193 00:11:05,671 --> 00:11:11,030 >> Ak chcete presunúť ukazovateľ pozície v súbore, môžete použiť funkciu fseek. 194 00:11:11,030 --> 00:11:15,600 V prípade, že inptr predstavuje súbor ukazovateľ, že ste hľadanie v, 195 00:11:15,600 --> 00:11:20,370 suma je počet bajtov, ktoré chcete presunúť kurzor, a potom od 196 00:11:20,370 --> 00:11:23,470 sa vzťahuje k referenčnému bodu z miesta, kde je kurzor. 197 00:11:23,470 --> 00:11:26,770 Ak odovzdáte v SEEK_CUR, že predstavuje prúd 198 00:11:26,770 --> 00:11:28,100 pozície v súbore. 199 00:11:28,100 --> 00:11:31,020 Alebo môžete použiť niektoré ďalšie parametre. 200 00:11:31,020 --> 00:11:35,400 Takže, môžeme chcieť použiť fseek preskočiť na čalúnenie súboru v. 201 00:11:35,400 --> 00:11:39,410 A opäť, ak ste prilepené, je tu príkladom, ktorý v copy.c. 202 00:11:39,410 --> 00:11:43,260 >> Takže teraz sme otvorili súbor, stopa, a verdikt. 203 00:11:43,260 --> 00:11:46,450 Aktualizovali sme informácie, záhlavie pre náš verdikt, pretože každý 204 00:11:46,450 --> 00:11:48,730 bitmap potrebuje hlavičky. 205 00:11:48,730 --> 00:11:52,280 My sme potom si prečítajte na vodítko je scanline, pixel po pixeli, zmenou 206 00:11:52,280 --> 00:11:55,210 každá farba je to nevyhnutné, a písanie tých, do 207 00:11:55,210 --> 00:11:57,340 Verdikt, pixel po pixeli. 208 00:11:57,340 --> 00:12:01,550 Po otvorení verdikt, môžete vidieť, kto vinník, alebo to, čo tajomstvo 209 00:12:01,550 --> 00:12:02,850 Správa je. 210 00:12:02,850 --> 00:12:05,550 Volám sa Zamyla, a to detektívka. 211 00:12:05,550 --> 00:12:12,864