1 00:00:00,000 --> 00:00:09,500 >> [Glazba svira] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA Chan: Bilo je Miss Scarlett sa svijećnjaka. 3 00:00:12,350 --> 00:00:13,560 Tko je uradio? 4 00:00:13,560 --> 00:00:15,030 Pa, idemo saznati. 5 00:00:15,030 --> 00:00:20,870 U igra na ploči Clue, možda dati fizički crvenu sliku. 6 00:00:20,870 --> 00:00:24,120 I ta slika je jako crvena i točkicama, a vaš je zadatak 7 00:00:24,120 --> 00:00:25,490 otkriti skrivene poruke. 8 00:00:25,490 --> 00:00:29,740 I obično ste dobili crveni povećalo, ili crveni zaslon 9 00:00:29,740 --> 00:00:31,410 otkrivaju da je skrivenu poruku. 10 00:00:31,410 --> 00:00:33,340 Pa, idemo oponaša. 11 00:00:33,340 --> 00:00:37,960 >> U Tko je uradio, ti si dao bitmap slike da izgleda vrlo točkicama i crvena, 12 00:00:37,960 --> 00:00:43,430 a zatim pokrenuti Tko je uradio programa otkriti skrivenu poruku. 13 00:00:43,430 --> 00:00:45,650 >> Tako ćemo razbiti to u koracima. 14 00:00:45,650 --> 00:00:50,390 Prvo, želite otvoriti datoteku - trag da ti je dano. 15 00:00:50,390 --> 00:00:53,880 I onda se stvoriti Presuda bitmap datoteke. 16 00:00:53,880 --> 00:00:58,240 Zatim želite ažurirati bitmapa header informacije za presudu outfile. 17 00:00:58,240 --> 00:00:59,920 Više o tome kasnije. 18 00:00:59,920 --> 00:01:04,319 I onda ćeš čitati u trag, scanline, piksel po piksel, 19 00:01:04,319 --> 00:01:07,320 mijenjanje piksela boje kao potrebno, i pisanje 20 00:01:07,320 --> 00:01:08,960 onima u presudi - 21 00:01:08,960 --> 00:01:12,000 piksel po piksel u Presuda scanline. 22 00:01:12,000 --> 00:01:13,780 >> Kako ćemo početi doći do toga? 23 00:01:13,780 --> 00:01:16,940 Pa, na svu sreću, imamo copy.c u distribucijskom koda. 24 00:01:16,940 --> 00:01:21,240 A to će dokazati vrlo korisno za nas. 25 00:01:21,240 --> 00:01:29,700 Copy.c otvara datoteku, navodi se u tom infile je zaglavlje, a zatim ažurira 26 00:01:29,700 --> 00:01:31,070 outfile je header. 27 00:01:31,070 --> 00:01:37,010 I onda čita svaki piksel scanline, piksel po piksel, a zatim 28 00:01:37,010 --> 00:01:42,390 piše da je piksel u outfile. 29 00:01:42,390 --> 00:01:45,020 >> Dakle, prvi korak bi mogao biti pokrenuti slijedeće 30 00:01:45,020 --> 00:01:46,420 naredbu u terminal - 31 00:01:46,420 --> 00:01:50,270 k.č. copy.c whodunit.c. 32 00:01:50,270 --> 00:01:55,320 To će stvoriti kopiju copy.c zove whodunit.c. 33 00:01:55,320 --> 00:01:58,320 Dakle, naš prvi korak za otvaranje file, dobro, tu je točna 34 00:01:58,320 --> 00:02:00,070 replika da je u copy.c. 35 00:02:00,070 --> 00:02:03,360 Dakle, ja ću vas ostaviti da pogledate kako. 36 00:02:03,360 --> 00:02:07,860 >> Ono što imamo posla s ovim pset se file I / O, u osnovi uzimanje datoteke, 37 00:02:07,860 --> 00:02:10,229 čitanje, pisanje, uređivanjem. 38 00:02:10,229 --> 00:02:12,650 Kako ste prvi put otvorili datoteku? 39 00:02:12,650 --> 00:02:16,800 Pa, što ćemo proglasiti datoteku pointer, a onda nazvati 40 00:02:16,800 --> 00:02:18,670 Funkcija fopen. 41 00:02:18,670 --> 00:02:23,150 Prolaze na putu, ili ime onoga datoteku, a zatim je način rada koji želite 42 00:02:23,150 --> 00:02:24,700 otvoriti tu datoteku u. 43 00:02:24,700 --> 00:02:28,620 Prolazak u r će otvoriti foo.bmp za čitanje. 44 00:02:28,620 --> 00:02:35,670 Dok fopen u prolazu u W otvoren bar.bmp, za pisanje datoteku i 45 00:02:35,670 --> 00:02:37,020 zapravo uređivanje. 46 00:02:37,020 --> 00:02:41,970 >> Dakle, sada kada smo otvorili datoteku, naš Sljedeći korak je da se ažuriraju informacije u zaglavlju 47 00:02:41,970 --> 00:02:43,230 za outfile. 48 00:02:43,230 --> 00:02:44,610 Što je info header? 49 00:02:44,610 --> 00:02:48,160 Pa, prvo moramo znati ono bitova. 50 00:02:48,160 --> 00:02:51,000 Bitmap je samo jednostavan raspored bajtova. 51 00:02:51,000 --> 00:02:55,480 I oni su proglasili u ovoj datoteci Ovdje, bmp.h, s gomilom 52 00:02:55,480 --> 00:02:58,610 Informacije o tome što bitmapa zapravo je napravljena od. 53 00:02:58,610 --> 00:03:05,730 No, ono što mi je stvarno stalo je header bitmap datoteka, upravo ovdje, a 54 00:03:05,730 --> 00:03:08,460 bitmap info header, ovamo. 55 00:03:08,460 --> 00:03:13,170 Zaglavlje se sastoji od nekoliko varijabli koje će se pokazati vrlo korisnim. 56 00:03:13,170 --> 00:03:18,400 Tu je biSizeImage, koji je Ukupna veličina slike u bajtove. 57 00:03:18,400 --> 00:03:20,890 A to uključuje i piksela i padding. 58 00:03:20,890 --> 00:03:24,210 Postava je vrlo važno, ali ćemo kasnije vratiti na to. 59 00:03:24,210 --> 00:03:30,000 >> BiWidth predstavlja širinu slike u pikselima minus padding. 60 00:03:30,000 --> 00:03:34,220 BiHeight je onda i visina slike u pikselima. 61 00:03:34,220 --> 00:03:38,240 A onda BITMAPFILEHEADER i BITMAPINFOHEADER, kao što sam spomenuo 62 00:03:38,240 --> 00:03:40,900 ranije, oni su zastupljeni kao tvorevina. 63 00:03:40,900 --> 00:03:45,410 Dakle, ne možete pristupiti datoteke zaglavlja Sama, ali ćete želite doći do 64 00:03:45,410 --> 00:03:47,370 one varijable unutra. 65 00:03:47,370 --> 00:03:48,170 >> OK. 66 00:03:48,170 --> 00:03:50,600 Pa kako ćemo ažurirati informacije u zaglavlju? 67 00:03:50,600 --> 00:03:54,020 Pa, prvo moramo vidjeti da li smo potrebno promijeniti bilo koje informacije iz 68 00:03:54,020 --> 00:03:58,480 infile, trag, da se outfile, presuda. 69 00:03:58,480 --> 00:04:00,250 Jesu li promjene u tom slučaju? 70 00:04:00,250 --> 00:04:04,320 Pa, zapravo ne, jer ćemo da se samo mijenjaju boje. 71 00:04:04,320 --> 00:04:07,550 Nećemo da se mijenja datoteku veličina, veličina slike, širina, 72 00:04:07,550 --> 00:04:08,310 ili visina. 73 00:04:08,310 --> 00:04:14,010 Dakle, ti si u redu za sada od strane samo kopiranje svaki piksel. 74 00:04:14,010 --> 00:04:14,840 >> OK. 75 00:04:14,840 --> 00:04:20,720 Tako sada pogledajmo koliko smo zapravo možete pročitati svaki piksel iz spisa. 76 00:04:20,720 --> 00:04:23,640 Još jedan file I / O funkcija će doći u igru ​​- 77 00:04:23,640 --> 00:04:24,700 fread. 78 00:04:24,700 --> 00:04:28,440 Potrebno je u pokazivaču na struct koji će sadržavati bajtova koje 79 00:04:28,440 --> 00:04:30,110 što čitate. 80 00:04:30,110 --> 00:04:31,890 Pa što čitate u to. 81 00:04:31,890 --> 00:04:36,090 I onda vam prođe u veličini, što je veličina svakog elementa koji 82 00:04:36,090 --> 00:04:37,360 žele čitati. 83 00:04:37,360 --> 00:04:40,640 Ovdje, funkcija sizeof će doći u ruci. 84 00:04:40,640 --> 00:04:45,570 Tada ćete proći u broju, koji predstavlja broj elemenata 85 00:04:45,570 --> 00:04:47,480 veličina čitati. 86 00:04:47,480 --> 00:04:51,180 I onda napokon, inptr, što je file pointer koji ste 87 00:04:51,180 --> 00:04:52,530 će čitati iz. 88 00:04:52,530 --> 00:04:58,650 Dakle, svi ti elementi su unutar inptr i oni će podacima. 89 00:04:58,650 --> 00:05:01,660 >> Pogledajmo malo primjer. 90 00:05:01,660 --> 00:05:07,590 Ako želim čitati u podatkovnim dva psa, dobro, ne mogu to učiniti na jedan od dva načina. 91 00:05:07,590 --> 00:05:15,250 I bilo možete pročitati u dva objekta veličine Pas iz mog inptr, ili mogu pročitati 92 00:05:15,250 --> 00:05:19,280 u jedan objekt veličine dva psa. 93 00:05:19,280 --> 00:05:23,580 Pa vidite da je, ovisno o načinu da li organizirati veličinu i broj, te 94 00:05:23,580 --> 00:05:25,840 možete pročitati u istom broju bajtova. 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> Pa sad, idemo promijeniti piksela u boji kao što moramo. 97 00:05:33,020 --> 00:05:37,320 Ako ponovno pogledate bmp.h, a zatim vidjet ćete da je na dnu 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs su drugi rekonstruirati gdje je oni su se sastojale od tri bajta. 99 00:05:42,920 --> 00:05:49,220 Jedan, rgbtBlue, rgbtGreen i rgbtRed. 100 00:05:49,220 --> 00:05:52,480 Dakle, svaki od njih predstavlja iznos plave, količina zelene i 101 00:05:52,480 --> 00:05:57,250 Količina crvene unutar ove piksela, gdje svaki iznos koji je zastupao 102 00:05:57,250 --> 00:05:58,670 heksadecimalni broj. 103 00:05:58,670 --> 00:06:04,370 >> Dakle ff0000 će biti plave boje, jer ide od plave, 104 00:06:04,370 --> 00:06:05,850 u zeleno, crveno. 105 00:06:05,850 --> 00:06:09,300 I onda sve f-a će biti bijela. 106 00:06:09,300 --> 00:06:13,440 Idemo pogledati smiley.bmp, koji imate u svom distribucijskom kodu. 107 00:06:13,440 --> 00:06:15,690 Ako ga otvoriti u samo slike Gledatelj, onda ćete 108 00:06:15,690 --> 00:06:17,080 samo vidjeti crveni smješka. 109 00:06:17,080 --> 00:06:20,380 No, dublji zaron u, mi ćemo vidim da je struktura 110 00:06:20,380 --> 00:06:22,340 od njega se samo piksela. 111 00:06:22,340 --> 00:06:25,880 Imamo bijelih piksela, a zatim crvene piksela. 112 00:06:25,880 --> 00:06:31,000 Bijeli, FFFFFF, a zatim sve crvene piksela sam obojena u za vas 113 00:06:31,000 --> 00:06:35,440 ovdje, i vidjet ćete da su oni 0000FF. 114 00:06:35,440 --> 00:06:39,760 Zero plava, zelena nula, i puna crvena. 115 00:06:39,760 --> 00:06:45,350 A budući smiley je širok osam piksela, nemamo nikakvu podstavu. 116 00:06:45,350 --> 00:06:47,360 U redu. 117 00:06:47,360 --> 00:06:53,310 >> Dakle, ako su se dodijeliti različite vrijednosti na RGBTRIPLE i ja htjela 118 00:06:53,310 --> 00:06:58,350 bude zelena, onda ono što ću učiniti je Ja bih izjaviti RGBTRIPLE, pod nazivom 119 00:06:58,350 --> 00:07:02,660 trostruki, a zatim se pristupiti svaki Bajt unutar tog struct I. 120 00:07:02,660 --> 00:07:04,030 će koristiti operator dot. 121 00:07:04,030 --> 00:07:08,430 Dakle triple.rgbtBlue, ja mogu dodijeliti da na 0. 122 00:07:08,430 --> 00:07:13,460 Zelena mogu dodijeliti full - bilo broj, zapravo, između 0 i FF. 123 00:07:13,460 --> 00:07:15,470 I onda crveni, ja ću reći: 0.. 124 00:07:15,470 --> 00:07:19,160 Tako, dakle, da mi daje zeleno piksela. 125 00:07:19,160 --> 00:07:23,030 >> Dalje, što ako želim provjeriti vrijednost nečega? 126 00:07:23,030 --> 00:07:27,250 Mogao sam imati nešto što provjerava li trostruki je rgbtBlue vrijednost 127 00:07:27,250 --> 00:07:31,080 ff a zatim print "Osjećam plava! ", kao rezultat. 128 00:07:31,080 --> 00:07:35,640 Sada, to ne mora nužno značiti koji pixel je plava, zar ne? 129 00:07:35,640 --> 00:07:40,060 Budući da je piksel je zelena i crvena vrijednosti mogao bi imati ne-0 vrijednosti. 130 00:07:40,060 --> 00:07:43,470 Sve što to znači, a sve to to provjere je 131 00:07:43,470 --> 00:07:45,610 za punu plavom bojom. 132 00:07:45,610 --> 00:07:50,050 No, svi segmenti također može imati djelomičnu Vrijednosti boja, kao što su to 133 00:07:50,050 --> 00:07:52,180 Sljedeći primjer ovdje. 134 00:07:52,180 --> 00:07:55,400 >> To je malo teže vidjeti što se ova slika je sada. 135 00:07:55,400 --> 00:08:00,320 To izgleda malo više kao clue.bmp da ćete dobiti. 136 00:08:00,320 --> 00:08:03,600 Sada, fizički, što bi moglo riješiti, jer ima puno crvene, po 137 00:08:03,600 --> 00:08:07,040 drži se crveni ekran na slici tako da su druge boje može se pojaviti. 138 00:08:07,040 --> 00:08:10,968 Pa kako ćemo oponašati ovo sa c? 139 00:08:10,968 --> 00:08:15,640 Pa, mogli bismo uklonili sve crveno iz slike u cijelosti. 140 00:08:15,640 --> 00:08:21,870 I tako učiniti da bismo postaviti svaki Pixel crveni vrijednost na 0.. 141 00:08:21,870 --> 00:08:25,020 I tako je slika će izgledati malo malo kao što je ovaj, gdje nemamo crveno 142 00:08:25,020 --> 00:08:26,300 god. 143 00:08:26,300 --> 00:08:29,390 >> Možemo vidjeti skrivenu poruku o malo jasnije sada. 144 00:08:29,390 --> 00:08:31,730 To je još jedan smješko. 145 00:08:31,730 --> 00:08:33,870 Ili možda bismo mogli koristiti neku drugu metodu. 146 00:08:33,870 --> 00:08:36,480 Možda bi se mogla identificirati sve crvene piksela - 147 00:08:36,480 --> 00:08:41,100 to je, sve u piksela 0 plava, zelena 0 i 0 crvena - 148 00:08:41,100 --> 00:08:43,169 i promijeniti one na bijelo. 149 00:08:43,169 --> 00:08:45,470 I naša slika može izgledati nešto kao što je ovaj. 150 00:08:45,470 --> 00:08:48,250 Malo lakše vidjeti. 151 00:08:48,250 --> 00:08:51,170 >> Postoji mnogo drugih načina da se otkriju Tajna poruka, kao i, 152 00:08:51,170 --> 00:08:53,730 bave manipulacije boji. 153 00:08:53,730 --> 00:08:57,050 Možda možete koristiti jednu od metoda koje sam spomenuo gore. 154 00:08:57,050 --> 00:08:59,600 A osim toga, možda želite kako bi se poboljšala neke boje 155 00:08:59,600 --> 00:09:02,620 i dovesti one out. 156 00:09:02,620 --> 00:09:06,190 >> Dakle, sada kada smo promijenili piksel u boji, uz samo mi treba da ih pisati 157 00:09:06,190 --> 00:09:08,500 u na scanline, piksel po piksel. 158 00:09:08,500 --> 00:09:11,860 A opet, da ćete želite da se osvrnemo da copy.c, ako niste kopirali 159 00:09:11,860 --> 00:09:18,170 to je već, i pogled na fwrite funkcija, koji uzima podatke, pokazivač 160 00:09:18,170 --> 00:09:23,230 na struct koji sadrži bajtova to čitaš iz, veličini 161 00:09:23,230 --> 00:09:26,610 stavke, broj predmeta, a zatim outptr - 162 00:09:26,610 --> 00:09:29,450 odredište tim dokumentima. 163 00:09:29,450 --> 00:09:34,010 >> Nakon što ste napisali u pikselima, vi ćete Također morate pisati u padding. 164 00:09:34,010 --> 00:09:34,970 Što je padding? 165 00:09:34,970 --> 00:09:38,670 Pa, svaki rgbt piksela je tri bajta. 166 00:09:38,670 --> 00:09:43,670 No, scanline za skenirana slika mora biti višekratnik od četiri bajta. 167 00:09:43,670 --> 00:09:47,650 A ako je broj piksela nije višekratnik broja četiri, onda moramo dodati 168 00:09:47,650 --> 00:09:48,880 nadopuna. 169 00:09:48,880 --> 00:09:51,420 Padding samo zastupa 0s. 170 00:09:51,420 --> 00:09:54,380 Dakle, kako ćemo pisati, ili pročitati ovo? 171 00:09:54,380 --> 00:09:59,280 Pa, ispada da se ne mogu zapravo fread padding, ali možete 172 00:09:59,280 --> 00:10:00,970 izračunati to. 173 00:10:00,970 --> 00:10:04,400 >> U ovom slučaju, trag i presuda imaju istu širinu, tako 174 00:10:04,400 --> 00:10:05,910 Podstava je isti. 175 00:10:05,910 --> 00:10:09,370 I padding, kao što ćete vidjeti u copy.c, izračunava 176 00:10:09,370 --> 00:10:11,790 s donjom formulom - 177 00:10:11,790 --> 00:10:16,690 bi.biWidth puta sizeof (RGBTRIPLE) će daju nam koliko je bajtova BMP 178 00:10:16,690 --> 00:10:18,280 ima u svakom retku. 179 00:10:18,280 --> 00:10:21,890 Od tamo, modulos i oduzimanja s 4 može izračunati koliko 180 00:10:21,890 --> 00:10:25,610 mnogi bajtova mora dodati da višekratnik broja bajtova na 181 00:10:25,610 --> 00:10:27,250 svaki redak je četiri. 182 00:10:27,250 --> 00:10:30,490 >> Sada kada imamo formulu za koliko padding trebamo, sada 183 00:10:30,490 --> 00:10:31,610 možemo to napisati. 184 00:10:31,610 --> 00:10:34,080 Sad, što sam spomenuo prije, padding je samo 0s. 185 00:10:34,080 --> 00:10:39,730 Dakle, u tom slučaju, mi samo stavljajući ugljen koji se u ovom slučaju 0, u našem 186 00:10:39,730 --> 00:10:41,710 outptr - naš outfile. 187 00:10:41,710 --> 00:10:47,530 Tako da samo može biti fputc 0, zarez outptr. 188 00:10:47,530 --> 00:10:52,400 >> Dakle, dok sam čitao u našu file, file I / O je pratila naše 189 00:10:52,400 --> 00:10:57,440 položaj u tim dokumentima s nečim zove Pokazivač položaja sliku. 190 00:10:57,440 --> 00:10:59,350 Razmislite o tome kao kursora. 191 00:10:59,350 --> 00:11:03,550 Uglavnom, što je napredak svaki put da smo fread, ali imamo 192 00:11:03,550 --> 00:11:05,671 kontrolu nad njim, previše. 193 00:11:05,671 --> 00:11:11,030 >> Da biste pomaknuli pokazivač pozicije sliku, možete koristiti funkciju fseek. 194 00:11:11,030 --> 00:11:15,600 Gdje inptr predstavlja datoteku pokazivač da traze u, 195 00:11:15,600 --> 00:11:20,370 Iznos je broj bajtova koje želite pomicanje kursora, a zatim iz 196 00:11:20,370 --> 00:11:23,470 odnosi se referentne točke od tamo gdje je kursor. 197 00:11:23,470 --> 00:11:26,770 Ako prođe u SEEK_CUR, da predstavlja struje 198 00:11:26,770 --> 00:11:28,100 Pozicija u spisu. 199 00:11:28,100 --> 00:11:31,020 Ili možete koristiti i neke druge parametre. 200 00:11:31,020 --> 00:11:35,400 Dakle, možda bismo željeli koristiti fseek preskočiti preko padding u u datoteku. 201 00:11:35,400 --> 00:11:39,410 I opet, ako ste zapeli, postoji primjer da je u copy.c. 202 00:11:39,410 --> 00:11:43,260 >> Dakle, sada smo otvorili datoteku, trag, a presuda. 203 00:11:43,260 --> 00:11:46,450 Mi smo ažurirali informacije zaglavlja za naša presuda, jer je svaki 204 00:11:46,450 --> 00:11:48,730 bitmapa treba zaglavlje. 205 00:11:48,730 --> 00:11:52,280 Mi smo tada sam pročitao u trag a scanline, piksel po piksel, mijenjanje 206 00:11:52,280 --> 00:11:55,210 svaka boja ako je potrebno, i pisanje onima u 207 00:11:55,210 --> 00:11:57,340 Presuda, piksela po pikselu. 208 00:11:57,340 --> 00:12:01,550 Nakon što otvorite presudu, možete vidjeti tko krivac, ili ono što je tajna 209 00:12:01,550 --> 00:12:02,850 Poruka je. 210 00:12:02,850 --> 00:12:05,550 Moje ime je Zamyla, a ovo je detektivski roman. 211 00:12:05,550 --> 00:12:12,864