1 00:00:00,000 --> 00:00:09,500 >> [MUSIC Playing] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA Chan: Ez Miss Scarlett A gyertyatartó. 3 00:00:12,350 --> 00:00:13,560 Detektívregény? 4 00:00:13,560 --> 00:00:15,030 Nos, meg fogjuk megtudni. 5 00:00:15,030 --> 00:00:20,870 A társasjáték nyom, lehet, hogy adni a fizikai piros képet. 6 00:00:20,870 --> 00:00:24,120 És ez a kép nagyon vörös és foltos, és a feladata, hogy 7 00:00:24,120 --> 00:00:25,490 felfedi a rejtett üzenetet. 8 00:00:25,490 --> 00:00:29,740 És általában te ellátott piros nagyító, vagy egy piros képernyő 9 00:00:29,740 --> 00:00:31,410 azt mutatják, hogy a rejtett üzenetet. 10 00:00:31,410 --> 00:00:33,340 Nos, megyünk, hogy utánozza ezt. 11 00:00:33,340 --> 00:00:37,960 >> A detektívregény, akkor kap egy bitkép úgy néz ki, nagyon pattanásos és vörös, 12 00:00:37,960 --> 00:00:43,430 majd futtassa a detektívregény programot hogy felfedje a rejtett üzenetet. 13 00:00:43,430 --> 00:00:45,650 >> Szóval megtörni ezt a lépést. 14 00:00:45,650 --> 00:00:50,390 Először is, szeretnénk megnyitni a fájlt - A nyom, amit kapott. 15 00:00:50,390 --> 00:00:53,880 És akkor is létrehozhat egy ítéletet bitmap fájlt. 16 00:00:53,880 --> 00:00:58,240 Akkor szeretné frissíteni a bitmap header info az ítélet outfile. 17 00:00:58,240 --> 00:00:59,920 Bővebben később. 18 00:00:59,920 --> 00:01:04,319 És akkor fogsz olvasni a nyom, scanline, pixelenként, 19 00:01:04,319 --> 00:01:07,320 változó pixel színek szükséges, és az írás 20 00:01:07,320 --> 00:01:08,960 ezeket az ítéletet - 21 00:01:08,960 --> 00:01:12,000 pixelenként a ítéletet scanline. 22 00:01:12,000 --> 00:01:13,780 >> Hogyan kezdjük majd erről? 23 00:01:13,780 --> 00:01:16,940 Nos, szerencsére, van copy.c az elosztó kódot. 24 00:01:16,940 --> 00:01:21,240 És ez lesz bizonyítani nagyon hasznos a számunkra. 25 00:01:21,240 --> 00:01:29,700 Copy.c megnyit egy fájlt, beolvassa az adott bemeneti fájl fejlécét, majd frissíti a 26 00:01:29,700 --> 00:01:31,070 outfile fejléc. 27 00:01:31,070 --> 00:01:37,010 És akkor beolvassa minden egyes pixel a scanline, pixelenként, majd 28 00:01:37,010 --> 00:01:42,390 azt írja, hogy a pixel a kimeneti fájl. 29 00:01:42,390 --> 00:01:45,020 >> Tehát az első lépés lehet, hogy , hogy futtassa az alábbi 30 00:01:45,020 --> 00:01:46,420 parancsot a terminál - 31 00:01:46,420 --> 00:01:50,270 cp copy.c whodunit.c. 32 00:01:50,270 --> 00:01:55,320 Ez létrehoz egy példányt copy.c nevű whodunit.c. 33 00:01:55,320 --> 00:01:58,320 Tehát az első lépés, hogy nyissa meg a fájl, nos, van egy pontos 34 00:01:58,320 --> 00:02:00,070 másolata, hogy copy.c. 35 00:02:00,070 --> 00:02:03,360 Úgyhogy hagyjuk, hogy nézd meg ezt. 36 00:02:03,360 --> 00:02:07,860 >> Mi dolgunk ebben Pset is file I / O, alapvetően figyelembe kép, 37 00:02:07,860 --> 00:02:10,229 olvasás, írás, szerkesztéssel. 38 00:02:10,229 --> 00:02:12,650 Hogy először nyit meg egy fájlt? 39 00:02:12,650 --> 00:02:16,800 Nos, fogsz, hogy állapítsa meg a fájlt mutató, és akkor hívja a 40 00:02:16,800 --> 00:02:18,670 funkció fopen. 41 00:02:18,670 --> 00:02:23,150 Át az úton, vagy a nevét, hogy fájlt, és a módot, amit akar 42 00:02:23,150 --> 00:02:24,700 megnyitni a fájlt be 43 00:02:24,700 --> 00:02:28,620 Átadása egy r megnyílik foo.bmp olvasásra. 44 00:02:28,620 --> 00:02:35,670 Mivel fopen átadásával egy w lesz nyitott bar.bmp, írásra a fájlt, és 45 00:02:35,670 --> 00:02:37,020 valójában szerkesztését. 46 00:02:37,020 --> 00:02:41,970 >> Most, hogy már megnyitotta a fájlt, a következő lépés az, hogy frissítse a fejléc információ 47 00:02:41,970 --> 00:02:43,230 A kimeneti fájl. 48 00:02:43,230 --> 00:02:44,610 Mi az a fejléc információra? 49 00:02:44,610 --> 00:02:48,160 Nos, először is tudnunk kell, hogy mi a bitmap az. 50 00:02:48,160 --> 00:02:51,000 A bitmap csak egy egyszerű elrendezése bájt. 51 00:02:51,000 --> 00:02:55,480 És ők kijelentette, ebben a fájlban Itt bmp.h, egy csomó 52 00:02:55,480 --> 00:02:58,610 információ, amit egy bitmap valójában készült. 53 00:02:58,610 --> 00:03:05,730 De ami igazán érdekel, az a bitmap fájl fejlécében, itt, és 54 00:03:05,730 --> 00:03:08,460 A bitmap infó fejlécét, mint itt. 55 00:03:08,460 --> 00:03:13,170 A fejléc áll egy pár változó, hogy nagyon hasznosnak fog bizonyulni. 56 00:03:13,170 --> 00:03:18,400 Van biSizeImage, amely a teljes kép méretét bájtokban. 57 00:03:18,400 --> 00:03:20,890 És ez magában foglalja a pixel és padding. 58 00:03:20,890 --> 00:03:24,210 Kárpitozás nagyon fontos, de a mi lesz később. 59 00:03:24,210 --> 00:03:30,000 >> BiWidth képviseli a szélessége a kép pixel mínusz a kitöltés. 60 00:03:30,000 --> 00:03:34,220 BiHeight ezután szintén a magasságot A kép pixel. 61 00:03:34,220 --> 00:03:38,240 És akkor a BITMAPFILEHEADER és a BITMAPINFOHEADER, ahogy már említettem 62 00:03:38,240 --> 00:03:40,900 korábban, ezek képviselik mint struktúrákat. 63 00:03:40,900 --> 00:03:45,410 Szóval, nem tudja elérni a fájl fejlécében is, de akkor szeretnénk eljutni 64 00:03:45,410 --> 00:03:47,370 azokat a változókat belül. 65 00:03:47,370 --> 00:03:48,170 >> OK. 66 00:03:48,170 --> 00:03:50,600 Szóval hogyan lehet frissíteni a fejléc információra? 67 00:03:50,600 --> 00:03:54,020 Nos, először is azt kell látni, hogy mi kell változtatni bármilyen információt 68 00:03:54,020 --> 00:03:58,480 A bemeneti fájl, a nyom, hogy a outfile, az ítéletet. 69 00:03:58,480 --> 00:04:00,250 Van valami változik ebben az esetben? 70 00:04:00,250 --> 00:04:04,320 Nos, valójában nem, mert mi megyünk hogy csak a változó színek. 71 00:04:04,320 --> 00:04:07,550 Nem fogunk, hogy változik a fájl méret, a képméret, a szélesség, 72 00:04:07,550 --> 00:04:08,310 vagy a magasság. 73 00:04:08,310 --> 00:04:14,010 Szóval minden rendben most a csak a másolás minden egyes pixel. 74 00:04:14,010 --> 00:04:14,840 >> OK. 75 00:04:14,840 --> 00:04:20,720 Most nézzük meg, hogyan is tudja olvasni minden pixel a fájlból. 76 00:04:20,720 --> 00:04:23,640 Egy másik fájl I / O funkció jön szóba - 77 00:04:23,640 --> 00:04:24,700 fread. 78 00:04:24,700 --> 00:04:28,440 Tart a mutatót a struktúra , amely tartalmazni fogja a byte-ok 79 00:04:28,440 --> 00:04:30,110 olvasod. 80 00:04:30,110 --> 00:04:31,890 Szóval olvasod bele. 81 00:04:31,890 --> 00:04:36,090 És akkor át a méret, ami mérete minden eleme, hogy 82 00:04:36,090 --> 00:04:37,360 szeretnénk olvasni. 83 00:04:37,360 --> 00:04:40,640 Itt a funkció sizeof jól jöhet. 84 00:04:40,640 --> 00:04:45,570 Akkor át a számot, ami számát jelenti eleme 85 00:04:45,570 --> 00:04:47,480 méret olvasni. 86 00:04:47,480 --> 00:04:51,180 És végül, inptr, ami a fájl mutatót, hogy te 87 00:04:51,180 --> 00:04:52,530 fog olvasni. 88 00:04:52,530 --> 00:04:58,650 Tehát az összes ilyen elem belsejében inptr és ők fognak adatokat. 89 00:04:58,650 --> 00:05:01,660 >> Nézzünk egy példát. 90 00:05:01,660 --> 00:05:07,590 Ha azt akarom, hogy olvassa be az adatok két kutya, Nos, meg tudom csinálni két módon. 91 00:05:07,590 --> 00:05:15,250 Én sem olvastam két objektum mérete kutya az én inptr, vagy tudok olvasni 92 00:05:15,250 --> 00:05:19,280 az egyik objektum méretének két kutya. 93 00:05:19,280 --> 00:05:23,580 Tehát láthatjuk, hogy attól függően, hogy hogy gondoskodjon mérete és száma, akkor 94 00:05:23,580 --> 00:05:25,840 tudja olvasni az azonos számú bájt. 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> Tehát most, változtassuk meg a pixel színe, mint amire szükségünk van. 97 00:05:33,020 --> 00:05:37,320 Ha megnézzük bmp.h újra, majd látni fogja, hogy az alján 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs egy másik struktúra, ahol a ezek mely három bájt. 99 00:05:42,920 --> 00:05:49,220 Egy, rgbtBlue, rgbtGreen és rgbtRed. 100 00:05:49,220 --> 00:05:52,480 Tehát mindegyik képviseli az összeget kék, a zöld szín mennyiségét, valamint a 101 00:05:52,480 --> 00:05:57,250 mennyiségű vörös ezen belül pixel, ahol a Mindegyik összeget képviseli 102 00:05:57,250 --> 00:05:58,670 hexadecimális szám. 103 00:05:58,670 --> 00:06:04,370 >> Tehát ff0000 lesz egy kék színű, mert megy a kék, 104 00:06:04,370 --> 00:06:05,850 a zöld, a piros. 105 00:06:05,850 --> 00:06:09,300 És akkor minden f a fehér lesz. 106 00:06:09,300 --> 00:06:13,440 Vessünk egy pillantást a smiley.bmp, ami van a terjesztési kódot. 107 00:06:13,440 --> 00:06:15,690 Ha kinyitja azt csak egy kép néző, akkor majd 108 00:06:15,690 --> 00:06:17,080 csak egy piros smiley. 109 00:06:17,080 --> 00:06:20,380 De, hogy egy mélyebb merülés, fogunk látni, hogy a szerkezet 110 00:06:20,380 --> 00:06:22,340 Az ez csak pixel. 111 00:06:22,340 --> 00:06:25,880 Van fehér pixel, majd a piros pixel. 112 00:06:25,880 --> 00:06:31,000 A fehér, ffffff, majd az összes, a red pixel Már színű az Ön számára 113 00:06:31,000 --> 00:06:35,440 itt, és látod, hogy ők 0000FF. 114 00:06:35,440 --> 00:06:39,760 Zero kék, nulla zöld, és a teljes piros. 115 00:06:39,760 --> 00:06:45,350 És mivel smiley nyolc pixel széles, nincs semmi padding. 116 00:06:45,350 --> 00:06:47,360 Rendben van. 117 00:06:47,360 --> 00:06:53,310 >> Tehát, ha én rendelni különböző értékeket egy RGBTRIPLE, és szerettem volna 118 00:06:53,310 --> 00:06:58,350 hogy ez a zöld, akkor én mit tennék a Én nyilvánítják RGBTRIPLE nevű 119 00:06:58,350 --> 00:07:02,660 hármas, majd a hozzáférést minden byte belül struct én 120 00:07:02,660 --> 00:07:04,030 használná a pont operátor. 121 00:07:04,030 --> 00:07:08,430 Így triple.rgbtBlue tudok rendelni, hogy a 0-ra. 122 00:07:08,430 --> 00:07:13,460 Green I hozzárendelheti a teljes - a szám, tényleg, 0 és ff. 123 00:07:13,460 --> 00:07:15,470 És akkor piros, én is akartam mondani, hogy 0-ra. 124 00:07:15,470 --> 00:07:19,160 Így aztán, hogy ad nekem egy zöld pixel. 125 00:07:19,160 --> 00:07:23,030 >> Ezután mi van, ha azt szeretné, hogy ellenőrizze valaminek az értékét? 126 00:07:23,030 --> 00:07:27,250 Tudtam volna valamit, hogy az ellenőrzések hogy a hármas a rgbtBlue értéke 127 00:07:27,250 --> 00:07:31,080 ff majd a print, "érzem magam kék! ", ennek eredményeként. 128 00:07:31,080 --> 00:07:35,640 Nos, ez nem jelenti szükségszerűen azt, hogy a pixel kék, nem igaz? 129 00:07:35,640 --> 00:07:40,060 Mivel a pixel a zöld és a piros értékek is rendelkezhet nem 0 értékeket. 130 00:07:40,060 --> 00:07:43,470 Ez azt jelenti, hogy minden, és minden, ami ez ellenőrzi a van 131 00:07:43,470 --> 00:07:45,610 a teljes kék színű. 132 00:07:45,610 --> 00:07:50,050 De minden képpont is részleges színes értékek, így 133 00:07:50,050 --> 00:07:52,180 következő példa itt. 134 00:07:52,180 --> 00:07:55,400 >> Ez egy kicsit nehezebb, hogy mi ez a kép most. 135 00:07:55,400 --> 00:08:00,320 Ez úgy néz ki, egy kicsit több, mint a clue.bmp, hogy akkor meg kell adni. 136 00:08:00,320 --> 00:08:03,600 Nos, fizikailag, akkor lehet, hogy megoldja ezt, mert van egy csomó piros, a 137 00:08:03,600 --> 00:08:07,040 , kezében egy piros képernyő a képet, hogy hogy a többi szín is megjelennek. 138 00:08:07,040 --> 00:08:10,968 Szóval hogyan lehet utánozni ezt ac? 139 00:08:10,968 --> 00:08:15,640 Nos, lehet, hogy távolítsa el az összes piros a képből teljesen. 140 00:08:15,640 --> 00:08:21,870 És így kell csinálni, hogy mi lenne beállítva minden pixel piros értékét 0-ra. 141 00:08:21,870 --> 00:08:25,020 És így a kép is meg egy kicsit kicsit olyan, mint ez, ahol már nem piros 142 00:08:25,020 --> 00:08:26,300 nélkül. 143 00:08:26,300 --> 00:08:29,390 >> Láthatjuk a rejtett üzenetet, a kicsit világosabban most. 144 00:08:29,390 --> 00:08:31,730 Ez egy mosolygó arc. 145 00:08:31,730 --> 00:08:33,870 Vagy talán mi is egy másik módszerrel. 146 00:08:33,870 --> 00:08:36,480 Talán sikerült azonosítani az összes piros pixel - 147 00:08:36,480 --> 00:08:41,100 vagyis az összes pixel 0 kék, zöld 0, 0 piros - 148 00:08:41,100 --> 00:08:43,169 és a változás azokat, fehér. 149 00:08:43,169 --> 00:08:45,470 És a kép nézhet valami ilyesmi. 150 00:08:45,470 --> 00:08:48,250 Egy kicsit könnyebb látni. 151 00:08:48,250 --> 00:08:51,170 >> Sok más módon feltárni a titkos üzenet is, 152 00:08:51,170 --> 00:08:53,730 foglalkozik a szín manipuláció. 153 00:08:53,730 --> 00:08:57,050 Talán lehet, hogy használja az egyik módszer , amit a fent említett. 154 00:08:57,050 --> 00:08:59,600 És ezen kívül, akkor érdemes növelése néhány szín 155 00:08:59,600 --> 00:09:02,620 és hogy ezeket ki. 156 00:09:02,620 --> 00:09:06,190 >> Most, hogy már megváltoztatta a pixel szín, a következő már csak be kell írni őket 157 00:09:06,190 --> 00:09:08,500 be a scanline, pixelenként. 158 00:09:08,500 --> 00:09:11,860 És ismét, akkor szeretné, hogy nézz vissza a copy.c, ha még nem másolt 159 00:09:11,860 --> 00:09:18,170 már, és nézd meg a fwrite funkcióra, ami megkapja az adatok, a mutató 160 00:09:18,170 --> 00:09:23,230 a struktúra, amely a byte hogy te olvasni, a méret 161 00:09:23,230 --> 00:09:26,610 A tételek a tételek számát, majd a outptr - 162 00:09:26,610 --> 00:09:29,450 a cél az ilyen fájlokat. 163 00:09:29,450 --> 00:09:34,010 >> Miután írni a pixel, akkor is meg kell írni a padding. 164 00:09:34,010 --> 00:09:34,970 Mi az a padding? 165 00:09:34,970 --> 00:09:38,670 Nos, minden rgbt pixel három bájt hosszú. 166 00:09:38,670 --> 00:09:43,670 De a soronkénti egy bitkép kell, hogy legyen több négy bájt. 167 00:09:43,670 --> 00:09:47,650 És ha a pixelek száma nem négy többszöröse, akkor meg kell adni 168 00:09:47,650 --> 00:09:48,880 ez padding. 169 00:09:48,880 --> 00:09:51,420 Kárpitozás csak képviseli 0s. 170 00:09:51,420 --> 00:09:54,380 Szóval, hogyan írunk, vagy olvasd el ezt? 171 00:09:54,380 --> 00:09:59,280 Nos, kiderült, hogy nem lehet valójában fread padding, de akkor 172 00:09:59,280 --> 00:10:00,970 kiszámításához. 173 00:10:00,970 --> 00:10:04,400 >> Ebben az esetben, a nyom, és az ítéletet azonos szélességű, így a 174 00:10:04,400 --> 00:10:05,910 padding ugyanaz. 175 00:10:05,910 --> 00:10:09,370 És a padding, mint látni fogod A copy.c kiszámítani 176 00:10:09,370 --> 00:10:11,790 az alábbi képlettel - 177 00:10:11,790 --> 00:10:16,690 bi.biWidth alkalommal sizeof (RGBTRIPLE) a nekünk, hogy hány bájt a bmp 178 00:10:16,690 --> 00:10:18,280 van minden sorban. 179 00:10:18,280 --> 00:10:21,890 Innen a modulos és kivonás 4 lehet számolni, hogy 180 00:10:21,890 --> 00:10:25,610 sok bájt ki kell egészíteni úgy, hogy a többszöröse byte on 181 00:10:25,610 --> 00:10:27,250 Minden sor négy. 182 00:10:27,250 --> 00:10:30,490 >> Most, hogy megvan a képlet hogy mennyi padding van szükségünk, most már 183 00:10:30,490 --> 00:10:31,610 tudjuk megírni. 184 00:10:31,610 --> 00:10:34,080 Most már említettem korábban, padding csak 0s. 185 00:10:34,080 --> 00:10:39,730 Tehát ebben az esetben, mi csak üzembe char egy, ebben az esetben egy 0, a mi 186 00:10:39,730 --> 00:10:41,710 outptr - a kimeneti fájl. 187 00:10:41,710 --> 00:10:47,530 Annak érdekében, hogy lehet csak fputc 0, vessző outptr. 188 00:10:47,530 --> 00:10:52,400 >> Így, miközben mi már olvasta a mi fájl, file I / O tartotta pályán a mi 189 00:10:52,400 --> 00:10:57,440 helyzetben azok a fájlok, valami nevű fájl helyzetjelző. 190 00:10:57,440 --> 00:10:59,350 Gondold azt, hogy a kurzor. 191 00:10:59,350 --> 00:11:03,550 Alapvetően előleget minden alkalommal hogy fread, de van 192 00:11:03,550 --> 00:11:05,671 az irányítást felette is. 193 00:11:05,671 --> 00:11:11,030 >> A fájl áthelyezésének helyzetjelző, használhatja a funkciót fseek. 194 00:11:11,030 --> 00:11:15,600 Ha a inptr képviseli a fájlt mutató, hogy te keresett, a 195 00:11:15,600 --> 00:11:20,370 összeg a byte-ok száma, amit szeretné mozgatni a kurzort, majd a 196 00:11:20,370 --> 00:11:23,470 kapcsolódik a referenciapont ahol a kurzor. 197 00:11:23,470 --> 00:11:26,770 Ha át az SEEK_CUR, hogy képviseli a jelenlegi 198 00:11:26,770 --> 00:11:28,100 pozíció a fájlban. 199 00:11:28,100 --> 00:11:31,020 Vagy valamilyen más paramétereket. 200 00:11:31,020 --> 00:11:35,400 Tehát érdemes használni fseek hogy kihagyja át a padding a fájlban. 201 00:11:35,400 --> 00:11:39,410 És ismét, ha elakad, ott van egy példát, hogy copy.c. 202 00:11:39,410 --> 00:11:43,260 >> Tehát most már megnyitotta a fájlt, a nyom, és az ítéletet. 203 00:11:43,260 --> 00:11:46,450 Már frissített fejléc info az ítéletet, mert minden 204 00:11:46,450 --> 00:11:48,730 bitmap szüksége van egy fejléc. 205 00:11:48,730 --> 00:11:52,280 Már akkor olvassa el a nyom a scanline, pixelenként, változó 206 00:11:52,280 --> 00:11:55,210 minden színben szükség, és írásban azokat a 207 00:11:55,210 --> 00:11:57,340 ítéletet, pixelenként. 208 00:11:57,340 --> 00:12:01,550 Ha megnyitja ítéletet, akkor láthatjuk, aki a tettes, vagy mi a titok 209 00:12:01,550 --> 00:12:02,850 üzenet. 210 00:12:02,850 --> 00:12:05,550 A nevem Zamyla, és ez detektívregény. 211 00:12:05,550 --> 00:12:12,864