1 00:00:00,000 --> 00:00:09,500 >> [MUSIC PŘEHRÁVÁNÍ] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA CHAN: Bylo to slečna Scarlett s svícnu. 3 00:00:12,350 --> 00:00:13,560 Detektivka? 4 00:00:13,560 --> 00:00:15,030 Dobře, jdeme to zjistit. 5 00:00:15,030 --> 00:00:20,870 V deskové hry Clue, můžete být fyzické červený obraz. 6 00:00:20,870 --> 00:00:24,120 A že obraz je velmi červené a flekatý, a vaším úkolem je 7 00:00:24,120 --> 00:00:25,490 odhalit skryté poselství. 8 00:00:25,490 --> 00:00:29,740 A obvykle jste za předpokladu, s červenou zvětšovací sklo, nebo červené obrazovky 9 00:00:29,740 --> 00:00:31,410 ukazují, že skryté poselství. 10 00:00:31,410 --> 00:00:33,340 No, budeme napodobovat. 11 00:00:33,340 --> 00:00:37,960 >> V detektivka, že jste daný rastrový obrázek který vypadá velmi uhrovitý a červené, 12 00:00:37,960 --> 00:00:43,430 a poté spusťte program detektivka odhalit skryté poselství. 13 00:00:43,430 --> 00:00:45,650 >> Takže pojďme rozbít to na schodech. 14 00:00:45,650 --> 00:00:50,390 Za prvé, budete chtít otevřít soubor - vodítko, které jste dostali. 15 00:00:50,390 --> 00:00:53,880 A pak také vytvořit Verdikt bitmapový obrázek. 16 00:00:53,880 --> 00:00:58,240 Pak chcete aktualizovat bitmapu header info na verdikt outFile. 17 00:00:58,240 --> 00:00:59,920 Více o tom později. 18 00:00:59,920 --> 00:01:04,319 A pak budete číst do stopa, scanline, pixel po pixelu, 19 00:01:04,319 --> 00:01:07,320 měnící se barvy pixelu jako nutné, a psaní 20 00:01:07,320 --> 00:01:08,960 ty, do verdiktu - 21 00:01:08,960 --> 00:01:12,000 pixel po pixelu do verdikt scanline. 22 00:01:12,000 --> 00:01:13,780 >> Jak začneme jít o to? 23 00:01:13,780 --> 00:01:16,940 No, naštěstí, máme copy.c v distribuční kódu. 24 00:01:16,940 --> 00:01:21,240 A tohle dokázat velmi užitečné pro nás. 25 00:01:21,240 --> 00:01:29,700 Copy.c otevře soubor, přečte, že infile 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 pak se to čte každý pixel v scanline, pixel po pixelu, a pak 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áš první krok bylo spustit následující 30 00:01:45,020 --> 00:01:46,420 Příkaz v terminálu - 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 se vytvoří kopie copy.c jmenoval whodunit.c. 33 00:01:55,320 --> 00:01:58,320 Takže naše první krok k otevření soubor, dobře, tam je přesný 34 00:01:58,320 --> 00:02:00,070 Replika, která v copy.c. 35 00:02:00,070 --> 00:02:03,360 Tak jsem tě nechat, aby se na to. 36 00:02:03,360 --> 00:02:07,860 >> Co máme co do činění s tímto pset se soubor I / O, v podstatě s soubory, 37 00:02:07,860 --> 00:02:10,229 čtení, psaní, jejich editaci. 38 00:02:10,229 --> 00:02:12,650 Jak si nejprve otevřete soubor? 39 00:02:12,650 --> 00:02:16,800 No, budete deklarovat soubor ukazatel, a pak zavoláte 40 00:02:16,800 --> 00:02:18,670 Funkce fopen. 41 00:02:18,670 --> 00:02:23,150 Projít na cestě, nebo název, který soubor, a pak režim, který chcete 42 00:02:23,150 --> 00:02:24,700 otevřít tento soubor palců 43 00:02:24,700 --> 00:02:28,620 Předávání v r se otevře foo.bmp pro čtení. 44 00:02:28,620 --> 00:02:35,670 Vzhledem k tomu, fopen s kolem v w otevřené bar.bmp, pro psaní soubor a 45 00:02:35,670 --> 00:02:37,020 vlastně úprav. 46 00:02:37,020 --> 00:02:41,970 >> Takže teď, že jsme otevřeli soubor, naše Dalším krokem je aktualizovat informace záhlaví 47 00:02:41,970 --> 00:02:43,230 outFile. 48 00:02:43,230 --> 00:02:44,610 Co je to info záhlaví? 49 00:02:44,610 --> 00:02:48,160 No, nejprve musíme vědět, co je bitmapa. 50 00:02:48,160 --> 00:02:51,000 Rastr je jen jednoduchý uspořádání bytů. 51 00:02:51,000 --> 00:02:55,480 A oni jsou deklarovány v tomto souboru zde, bmp.h, s partou 52 00:02:55,480 --> 00:02:58,610 informace o tom, co bitmapy je ve skutečnosti vyrobena z. 53 00:02:58,610 --> 00:03:05,730 Ale to, co opravdu záleží, je záhlaví bitmapový obrázek, tady, a 54 00:03:05,730 --> 00:03:08,460 bitmap info záhlaví, sem. 55 00:03:08,460 --> 00:03:13,170 Záhlaví se skládá z několika Proměnné, které se ukáží jako velmi užitečné. 56 00:03:13,170 --> 00:03:18,400 K dispozici je biSizeImage, který je Celková velikost obrazu v bajtech. 57 00:03:18,400 --> 00:03:20,890 A to zahrnuje pixelů a polstrování. 58 00:03:20,890 --> 00:03:24,210 Polstrování je velmi důležité, ale dostaneme se k tomu později. 59 00:03:24,210 --> 00:03:30,000 >> BiWidth představuje šířku obrázku v pixelech minus polstrování. 60 00:03:30,000 --> 00:03:34,220 BiHeight je pak také výšku obrazu v pixelech. 61 00:03:34,220 --> 00:03:38,240 A pak BITMAPFILEHEADER a BITMAPINFOHEADER, jak jsem se zmínil 62 00:03:38,240 --> 00:03:40,900 dříve, které jsou zastoupeny jako struktur. 63 00:03:40,900 --> 00:03:45,410 Takže, není možné získat přístup k hlavičku souboru sama o sobě, ale budete chtít, aby se na 64 00:03:45,410 --> 00:03:47,370 tyto proměnné uvnitř. 65 00:03:47,370 --> 00:03:48,170 >> OK. 66 00:03:48,170 --> 00:03:50,600 Tak jak jsme se aktualizovat informace záhlaví? 67 00:03:50,600 --> 00:03:54,020 No, nejprve musíme zjistit, zda jsme potřebujete změnit jakékoli informace od 68 00:03:54,020 --> 00:03:58,480 infile, vodítko, aby outfile, verdikt. 69 00:03:58,480 --> 00:04:00,250 Je něco měnit v tomto případě? 70 00:04:00,250 --> 00:04:04,320 No, vlastně, protože jedeme být jen změnou barvy. 71 00:04:04,320 --> 00:04:07,550 Nebudeme se změnou souboru velikost, velikost obrazu, šířka, 72 00:04:07,550 --> 00:04:08,310 nebo výšky. 73 00:04:08,310 --> 00:04:14,010 Takže jste v pořádku, teď by jen kopírování každý pixel. 74 00:04:14,010 --> 00:04:14,840 >> OK. 75 00:04:14,840 --> 00:04:20,720 Takže teď se pojďme podívat na to, jak jsme se vlastně může přečíst každý pixel ze souboru. 76 00:04:20,720 --> 00:04:23,640 Další soubor I / O funkce přijde do hry - 77 00:04:23,640 --> 00:04:24,700 fread. 78 00:04:24,700 --> 00:04:28,440 Trvá na ukazatel na struct který bude obsahovat bajtů, které 79 00:04:28,440 --> 00:04:30,110 čtete. 80 00:04:30,110 --> 00:04:31,890 Takže čtete do toho. 81 00:04:31,890 --> 00:04:36,090 A pak se projít do velikosti, která je velikost každého prvku, který 82 00:04:36,090 --> 00:04:37,360 chcete přečíst. 83 00:04:37,360 --> 00:04:40,640 Zde funkce sizeof přijde vhod. 84 00:04:40,640 --> 00:04:45,570 Pak můžete projít v počtu, který představuje počet prvků 85 00:04:45,570 --> 00:04:47,480 Velikost ke čtení. 86 00:04:47,480 --> 00:04:51,180 A nakonec, inptr, který je soubor ukazatel, který jste 87 00:04:51,180 --> 00:04:52,530 bude číst z. 88 00:04:52,530 --> 00:04:58,650 Takže všechny tyto prvky jsou uvnitř inptr a jdou k datům. 89 00:04:58,650 --> 00:05:01,660 >> Podívejme se na malý příklad. 90 00:05:01,660 --> 00:05:07,590 Pokud chci, aby si do datových dvěma psy, No, můžu to udělat jedním ze dvou způsobů. 91 00:05:07,590 --> 00:05:15,250 Můžu buď číst ve dvou objektech o velikosti pes z mého inptr, nebo mohu přečíst 92 00:05:15,250 --> 00:05:19,280 v jednom objektu o velikosti dvou psů. 93 00:05:19,280 --> 00:05:23,580 Takže vidíte, že v závislosti na způsobu že si sjednat velikost a počet, vás 94 00:05:23,580 --> 00:05:25,840 může číst ve stejném počtu bajtů. 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> Takže teď, pojďme změnit barva pixelu, jak potřebujeme. 97 00:05:33,020 --> 00:05:37,320 Podíváte-li se na bmp.h znovu, uvidíte, že na dně 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs jsou další struct, kde se skládá ze tří bajtů. 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 představuje částku modré, množství zeleně, a 101 00:05:52,480 --> 00:05:57,250 množství červené uvnitř tohoto pixelu, pokud každá částka je zastoupena 102 00:05:57,250 --> 00:05:58,670 hexadecimální číslo. 103 00:05:58,670 --> 00:06:04,370 >> Takže FF0000 bude modrá barva, , protože to jde od modré, 104 00:06:04,370 --> 00:06:05,850 na zelenou až po červenou. 105 00:06:05,850 --> 00:06:09,300 A pak f je bude bílá. 106 00:06:09,300 --> 00:06:13,440 Pojďme se podívat na smiley.bmp, které máte v distribučním kódu. 107 00:06:13,440 --> 00:06:15,690 Pokud ho otevřít jen v obraze divák, pak budete 108 00:06:15,690 --> 00:06:17,080 jen vidět červený smajlík. 109 00:06:17,080 --> 00:06:20,380 Ale s hlubší ponor do, my budeme vidět, že struktura 110 00:06:20,380 --> 00:06:22,340 ze je to jen pixelů. 111 00:06:22,340 --> 00:06:25,880 Máme bílé pixely, a pak červené pixelů. 112 00:06:25,880 --> 00:06:31,000 Bílá, ffffff, a pak všichni červené pixely jsem barevné v pro vás 113 00:06:31,000 --> 00:06:35,440 tady, a uvidíte, že jsou 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 protože smiley je osm pixelů, nemáme žádnou výplň. 116 00:06:45,350 --> 00:06:47,360 Dobrá. 117 00:06:47,360 --> 00:06:53,310 >> Takže pokud bych měl přiřadit různé hodnoty na RGBTRIPLE a chtěl jsem, aby 118 00:06:53,310 --> 00:06:58,350 aby to zelené, pak to, co budu dělat, je Chtěl bych prohlásit RGBTRIPLE, s názvem 119 00:06:58,350 --> 00:07:02,660 třílůžkový, a pak přístup k každý byte v rámci tohoto struct I 120 00:07:02,660 --> 00:07:04,030 by pomocí operátoru tečka. 121 00:07:04,030 --> 00:07:08,430 Takže triple.rgbtBlue, mohu přiřadit, že na 0. 122 00:07:08,430 --> 00:07:13,460 Zelená mohu přiřadit ji k plné - jakýkoli číslo, opravdu, mezi 0 a násl. 123 00:07:13,460 --> 00:07:15,470 A pak červená, já jsem také chtěl říct 0.. 124 00:07:15,470 --> 00:07:19,160 Tak to mi dává zelenou pixel. 125 00:07:19,160 --> 00:07:23,030 >> Dále, co když chci zkontrolovat hodnota něco? 126 00:07:23,030 --> 00:07:27,250 Mohl bych mít něco, co kontroluje zda rgbtBlue hodnota trojitého je 127 00:07:27,250 --> 00:07:31,080 ff a pak vytisknout, "Cítím se blue! ", jako výsledek. 128 00:07:31,080 --> 00:07:35,640 No, to nemusí nutně znamenat, že pixel je modrá, ne? 129 00:07:35,640 --> 00:07:40,060 Vzhledem k tomu, zelené a červené hodnoty pixelu by mohl mít také non-0 hodnoty. 130 00:07:40,060 --> 00:07:43,470 Vše, co to znamená, a to vše to je kontrola je 131 00:07:43,470 --> 00:07:45,610 pro plnou modrou barvu. 132 00:07:45,610 --> 00:07:50,050 Ale všechny pixelů může mít i částečná barevné hodnoty, jako je tato, 133 00:07:50,050 --> 00:07:52,180 Další příklad zde. 134 00:07:52,180 --> 00:07:55,400 >> Je to trochu těžší vidět co tento obraz je nyní. 135 00:07:55,400 --> 00:08:00,320 Vypadá to trochu jako clue.bmp, které budete mít. 136 00:08:00,320 --> 00:08:03,600 Nyní, fyzicky, můžete to vyřešit, protože tam je spousta červené, které 137 00:08:03,600 --> 00:08:07,040 drží červenou obrazovku do obrazu tak, že se mohou objevit další barvy. 138 00:08:07,040 --> 00:08:10,968 Tak jak jsme se napodobovat to s c? 139 00:08:10,968 --> 00:08:15,640 No, mohli bychom odstranit všechny červené z obrazu úplně. 140 00:08:15,640 --> 00:08:21,870 A tak k tomu, že bychom nastavit každý pixelu red hodnotu 0.. 141 00:08:21,870 --> 00:08:25,020 A tak obraz bude vypadat trochu trochu jako to, kde máme žádnou červenou 142 00:08:25,020 --> 00:08:26,300 vůbec. 143 00:08:26,300 --> 00:08:29,390 >> Můžeme vidět skrytou zprávu s trochu více nyní jasně. 144 00:08:29,390 --> 00:08:31,730 Je to další smajlíky. 145 00:08:31,730 --> 00:08:33,870 Nebo možná bychom mohli použít jinou metodu. 146 00:08:33,870 --> 00:08:36,480 Možná, že bychom mohli identifikovat všechny červené pixely - 147 00:08:36,480 --> 00:08:41,100 to znamená, že všechny pixely s 0 modrá, 0 zelené a 0 červená - 148 00:08:41,100 --> 00:08:43,169 a změnit ty na bílou. 149 00:08:43,169 --> 00:08:45,470 A náš obraz může vypadat něco takového. 150 00:08:45,470 --> 00:08:48,250 Trochu lépe vidět. 151 00:08:48,250 --> 00:08:51,170 >> Existuje mnoho jiných způsobů, jak odkrýt tajné zprávy, stejně, 152 00:08:51,170 --> 00:08:53,730 zabývající se manipulací barev. 153 00:08:53,730 --> 00:08:57,050 Možná, že můžete použít jednu z metod že jsem se zmínil výše. 154 00:08:57,050 --> 00:08:59,600 A navíc, možná budete chtít zlepšit některé barvy 155 00:08:59,600 --> 00:09:02,620 a přinést ty ven. 156 00:09:02,620 --> 00:09:06,190 >> Takže teď, že jsme změnili pixel barva, další jen je třeba jim napsat 157 00:09:06,190 --> 00:09:08,500 se do scanline, pixel po pixelu. 158 00:09:08,500 --> 00:09:11,860 A ještě jednou, budete chtít podívat zpět na copy.c, pokud jste kopírovat 159 00:09:11,860 --> 00:09:18,170 to už, a podívat se na fwrite funkce, které se údaje, ukazatel 160 00:09:18,170 --> 00:09:23,230 na struct, který obsahuje bajtů že čtete z, velikosti 161 00:09:23,230 --> 00:09:26,610 položky, počet kusů, a pak outptr - 162 00:09:26,610 --> 00:09:29,450 určení těchto souborů. 163 00:09:29,450 --> 00:09:34,010 >> Poté, co píšete v pixelech, budete si muset vybrat také muset napsat do polstrování. 164 00:09:34,010 --> 00:09:34,970 Co je polstrování? 165 00:09:34,970 --> 00:09:38,670 No, každý rgbt pixel je tři bajtů. 166 00:09:38,670 --> 00:09:43,670 Ale scanline pro bitmapový obraz musí být násobkem čtyř bajtů. 167 00:09:43,670 --> 00:09:47,650 A v případě, že počet pixelů není násobkem čtyř, pak musíme přidat 168 00:09:47,650 --> 00:09:48,880 tento polstrování. 169 00:09:48,880 --> 00:09:51,420 Polstrování je jen zastoupena 0s. 170 00:09:51,420 --> 00:09:54,380 Tak, jak jsme se psát, nebo číst to? 171 00:09:54,380 --> 00:09:59,280 No, ukázalo se, že nemůžete vlastně fread polstrování, 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 případě, vodítko a verdikt mají stejnou šířku, takže 174 00:10:04,400 --> 00:10:05,910 polstrování je stejný. 175 00:10:05,910 --> 00:10:09,370 A padding, jak uvidíte v copy.c, se vypočítá 176 00:10:09,370 --> 00:10:11,790 s níže vzorce - 177 00:10:11,790 --> 00:10:16,690 bi.biWidth krát sizeof (RGBTRIPLE) bude dát nám, kolik bajtů bmp 178 00:10:16,690 --> 00:10:18,280 má v každém řádku. 179 00:10:18,280 --> 00:10:21,890 Odtud módulos a rozdíly se 4 lze vypočítat, jak 180 00:10:21,890 --> 00:10:25,610 mnoho bytů musí být přidány tak, aby násobek bajtů na 181 00:10:25,610 --> 00:10:27,250 každý řádek je čtyři. 182 00:10:27,250 --> 00:10:30,490 >> Nyní, když máme vzorec pro kolik padding potřebujeme, nyní 183 00:10:30,490 --> 00:10:31,610 můžeme napsat. 184 00:10:31,610 --> 00:10:34,080 Teď jsem se zmínil dříve, polstrování je jen 0s. 185 00:10:34,080 --> 00:10:39,730 Takže v tomto případě, my jsme jen uvedení char, v tomto případě 0, do našeho 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 být jen fputc 0, čárka outptr. 188 00:10:47,530 --> 00:10:52,400 >> Takže, když jsme četli v našich soubor, soubor I / O udržuje přehled o našich 189 00:10:52,400 --> 00:10:57,440 pozice v těchto souborech s něčím tzv. ukazatel pozice v souboru. 190 00:10:57,440 --> 00:10:59,350 Ber to jako kurzor. 191 00:10:59,350 --> 00:11:03,550 V podstatě, to postupuje pokaždé že jsme 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 >> Chcete-li přesunout ukazatel pozice v souboru, můžete použít funkci fseek. 194 00:11:11,030 --> 00:11:15,600 V případě, že inptr představuje soubor ukazatel, že jste hledání v, 195 00:11:15,600 --> 00:11:20,370 částka je počet bajtů, které chcete přesunout kurzor, a poté od 196 00:11:20,370 --> 00:11:23,470 se vztahuje k referenčnímu bodu z místa, kde je kurzor. 197 00:11:23,470 --> 00:11:26,770 Pokud předáte v SEEK_CUR, že představuje proud 198 00:11:26,770 --> 00:11:28,100 pozice v souboru. 199 00:11:28,100 --> 00:11:31,020 Nebo můžete použít některé další parametry. 200 00:11:31,020 --> 00:11:35,400 Takže, můžeme chtít použít fseek přeskočit na čalounění souboru v. 201 00:11:35,400 --> 00:11:39,410 A opět, pokud jste přilepená, je tu příkladem, který v copy.c. 202 00:11:39,410 --> 00:11:43,260 >> Takže teď jsme otevřeli soubor, stopa, a verdikt. 203 00:11:43,260 --> 00:11:46,450 Aktualizovali jsme informace, záhlaví pro náš verdikt, protože každý 204 00:11:46,450 --> 00:11:48,730 bitmap potřebuje záhlaví. 205 00:11:48,730 --> 00:11:52,280 My jsme potom si přečtěte na vodítko je scanline, pixel po pixelu, změnou 206 00:11:52,280 --> 00:11:55,210 každá barva je to nezbytné, a psaní těch, do 207 00:11:55,210 --> 00:11:57,340 Verdikt, pixel po pixelu. 208 00:11:57,340 --> 00:12:01,550 Po otevření verdikt, můžete vidět, kdo viník, nebo to, co tajemství 209 00:12:01,550 --> 00:12:02,850 Zpráva je. 210 00:12:02,850 --> 00:12:05,550 Jmenuji se Zamyla, a to detektivka. 211 00:12:05,550 --> 00:12:12,864