1 00:00:00,000 --> 00:00:09,500 >> [Predvaja glasba] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA CHAN: To je bila Miss Scarlett s svečnikom. 3 00:00:12,350 --> 00:00:13,560 Whodunit? 4 00:00:13,560 --> 00:00:15,030 No, bomo izvedeli. 5 00:00:15,030 --> 00:00:20,870 V board igre Clue, boste morda treba fizično rdeče slike. 6 00:00:20,870 --> 00:00:24,120 In ta slika je zelo rdeče in lisast, in vaša naloga je, da 7 00:00:24,120 --> 00:00:25,490 razkrije skrito sporočilo. 8 00:00:25,490 --> 00:00:29,740 In ponavadi ti opremljeni z rdečo povečevalno steklo, ali rdeča zaslon 9 00:00:29,740 --> 00:00:31,410 kažejo, da je skrito sporočilo. 10 00:00:31,410 --> 00:00:33,340 No, bomo posnema. 11 00:00:33,340 --> 00:00:37,960 >> V whodunit, da vam dajo bitne slike da izgleda zelo lisast in rdeča, 12 00:00:37,960 --> 00:00:43,430 in nato zaženite program whodunit da razkrije skrito sporočilo. 13 00:00:43,430 --> 00:00:45,650 >> Torej, kaj je prekinil to v korakih. 14 00:00:45,650 --> 00:00:50,390 Prva, ki jo želite odpreti datoteko - namig, da ste bili dana. 15 00:00:50,390 --> 00:00:53,880 In potem tudi ustvariti Razsodbo bitna slika. 16 00:00:53,880 --> 00:00:58,240 Potem boste želeli posodobiti bitne slike header info za razsodbo izhodna_datoteka. 17 00:00:58,240 --> 00:00:59,920 Več o tem kasneje. 18 00:00:59,920 --> 00:01:04,319 In potem boš prebral v namig, scanline, pixel s piko, 19 00:01:04,319 --> 00:01:07,320 spreminjanje barve pixel kot potrebno, in pisanje 20 00:01:07,320 --> 00:01:08,960 tistih, ki v razsodbo - 21 00:01:08,960 --> 00:01:12,000 slikovnih pik, ki jih pixel v Razsodbo scanline. 22 00:01:12,000 --> 00:01:13,780 >> Kako bomo začeli bomo o tem? 23 00:01:13,780 --> 00:01:16,940 No, na srečo imamo copy.c v kodo za distribucijo. 24 00:01:16,940 --> 00:01:21,240 In to se dogaja, da dokaže zelo koristno za nas. 25 00:01:21,240 --> 00:01:29,700 Copy.c odpre datoteko, je zapisano, da Glava INFILE, nato pa posodobi 26 00:01:29,700 --> 00:01:31,070 Glava OUTFILE je. 27 00:01:31,070 --> 00:01:37,010 In potem se bere vsako piko scanline, pixel s piko, nato pa 28 00:01:37,010 --> 00:01:42,390 piše, da je piksel v izhodna_datoteka. 29 00:01:42,390 --> 00:01:45,020 >> Torej, morda vaš prvi korak ki se vodijo po 30 00:01:45,020 --> 00:01:46,420 ukaz v terminalu - 31 00:01:46,420 --> 00:01:50,270 cp copy.c whodunit.c. 32 00:01:50,270 --> 00:01:55,320 To bo ustvarilo kopijo copy.c imenovan whodunit.c. 33 00:01:55,320 --> 00:01:58,320 Torej naš prvi korak k odpiranju Datoteka, no, tam je natančna 34 00:01:58,320 --> 00:02:00,070 Replika da copy.c. 35 00:02:00,070 --> 00:02:03,360 Torej vas bom pustil, da pogled na to. 36 00:02:03,360 --> 00:02:07,860 >> Kaj imamo opravka v tej PSET se Datoteka I / O, v bistvu ob datotek, 37 00:02:07,860 --> 00:02:10,229 branje, pisanje, njihovo urejanje. 38 00:02:10,229 --> 00:02:12,650 Kako ste najprej odpreti datoteko? 39 00:02:12,650 --> 00:02:16,800 No, boš razglasi datoteko kazalec, nato pa pokličite 40 00:02:16,800 --> 00:02:18,670 Funkcija fopen. 41 00:02:18,670 --> 00:02:23,150 Pass na poti, ali ime, ki datoteko in nato način, ki ga želite 42 00:02:23,150 --> 00:02:24,700 Če želite odpreti to datoteko prijavite 43 00:02:24,700 --> 00:02:28,620 , Ki poteka v r bo odprl foo.bmp za branje. 44 00:02:28,620 --> 00:02:35,670 Ker fopen s prehodom na w bo odprta bar.bmp, za pisanje na datoteko in 45 00:02:35,670 --> 00:02:37,020 dejansko urejanjem. 46 00:02:37,020 --> 00:02:41,970 >> Torej sedaj, ko smo odprli datoteko, naša Naslednji korak je, da se posodobi informacij v glavi 47 00:02:41,970 --> 00:02:43,230 za izhodna_datoteka. 48 00:02:43,230 --> 00:02:44,610 Kaj info glavo? 49 00:02:44,610 --> 00:02:48,160 No, najprej moramo vedeti kaj bitna je. 50 00:02:48,160 --> 00:02:51,000 Bitna je samo preprost Razporeditev bajtov. 51 00:02:51,000 --> 00:02:55,480 In oni so prijavljeni v tem spisu tukaj, bmp.h, s kupom 52 00:02:55,480 --> 00:02:58,610 informacije o tem, kaj bitna je dejansko narejen iz. 53 00:02:58,610 --> 00:03:05,730 Toda kaj smo res skrbi, je Glava bitna slika, tukaj, in 54 00:03:05,730 --> 00:03:08,460 bitna info glava, tukaj. 55 00:03:08,460 --> 00:03:13,170 Glava je sestavljena iz nekaj spremenljivke, ki se bodo izkazali za zelo koristne. 56 00:03:13,170 --> 00:03:18,400 Obstaja biSizeImage, ki je skupna velikost slike vstavljenega. 57 00:03:18,400 --> 00:03:20,890 In to vključuje pik in oblazinjenje. 58 00:03:20,890 --> 00:03:24,210 Oblazinjenje je zelo pomembna, vendar bomo prišli do kasneje. 59 00:03:24,210 --> 00:03:30,000 >> BiWidth predstavlja širino slike v slikovnih minus oblazinjenja. 60 00:03:30,000 --> 00:03:34,220 BiHeight je potem tudi višina slike v pikslih. 61 00:03:34,220 --> 00:03:38,240 In potem BITMAPFILEHEADER in BITMAPINFOHEADER, kot sem omenil 62 00:03:38,240 --> 00:03:40,900 prej, tiste, ki zastopa kot konstruktov. 63 00:03:40,900 --> 00:03:45,410 Torej, ne morete dostopati glava datoteke sama, vendar boste želeli priti do 64 00:03:45,410 --> 00:03:47,370 te spremenljivke znotraj. 65 00:03:47,370 --> 00:03:48,170 >> OK. 66 00:03:48,170 --> 00:03:50,600 Torej, kako bomo posodobiti info glave? 67 00:03:50,600 --> 00:03:54,020 No, najprej moramo videti, ali morali spremeniti vse informacije iz 68 00:03:54,020 --> 00:03:58,480 INFILE, namig, da outfile, razsodba. 69 00:03:58,480 --> 00:04:00,250 Karkoli spreminja v tem primeru? 70 00:04:00,250 --> 00:04:04,320 No, dejansko ne, ker bomo da se le spremembo barve. 71 00:04:04,320 --> 00:04:07,550 Mi ne bomo spreminjali datoteke velikost, velikost, širina, 72 00:04:07,550 --> 00:04:08,310 ali višine. 73 00:04:08,310 --> 00:04:14,010 Torej ste v redu za zdaj jih Samo kopiranje vsak piksel. 74 00:04:14,010 --> 00:04:14,840 >> OK. 75 00:04:14,840 --> 00:04:20,720 Torej, zdaj pa si poglejmo, kako smo dejansko lahko bere vsak pixel iz spisa. 76 00:04:20,720 --> 00:04:23,640 Še ena datoteka I funkcija / O bo prišel v igro - 77 00:04:23,640 --> 00:04:24,700 fread. 78 00:04:24,700 --> 00:04:28,440 To traja v kazalec na struct , ki bo vseboval bajte, ki 79 00:04:28,440 --> 00:04:30,110 berete. 80 00:04:30,110 --> 00:04:31,890 Torej berete v to. 81 00:04:31,890 --> 00:04:36,090 In potem se boste peljali v velikosti, ki je velikost vsak element, ki ga 82 00:04:36,090 --> 00:04:37,360 želijo brati. 83 00:04:37,360 --> 00:04:40,640 Tu funkcijo sizeof bo prišel prav. 84 00:04:40,640 --> 00:04:45,570 Nato pa se boste peljali v številu, ki predstavlja število elementov 85 00:04:45,570 --> 00:04:47,480 velikost brati. 86 00:04:47,480 --> 00:04:51,180 In potem končno, inptr, ki je Datoteka kazalec, da si 87 00:04:51,180 --> 00:04:52,530 bom prebral iz. 88 00:04:52,530 --> 00:04:58,650 Torej, vsi ti elementi so notri inptr in gredo do podatkov. 89 00:04:58,650 --> 00:05:01,660 >> Oglejmo si malo npr. 90 00:05:01,660 --> 00:05:07,590 Če želim brati v podatkovnih dveh psov, dobro, lahko to storite na dva načina. 91 00:05:07,590 --> 00:05:15,250 Ne morem niti brati v dveh objektov velikosti Pes od mojega inptr, ali sem lahko prebral 92 00:05:15,250 --> 00:05:19,280 v enem nasprotuje velikosti dveh psov. 93 00:05:19,280 --> 00:05:23,580 Torej vidite, da glede na način , ki ga organizira velikosti in števila, vas 94 00:05:23,580 --> 00:05:25,840 lahko berejo v enakem številu bajtov. 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> Torej, zdaj, dajmo spremeniti barva pixel, kot moramo. 97 00:05:33,020 --> 00:05:37,320 Če pogledaš na bmp.h še enkrat, nato pa boste videli, da je na dnu 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs so še struct, kjer so sestavljena iz treh bajtov. 99 00:05:42,920 --> 00:05:49,220 Ena, rgbtBlue, rgbtGreen in rgbtRed. 100 00:05:49,220 --> 00:05:52,480 Tako je vsak od teh predstavlja znesek modre, količino zelene in 101 00:05:52,480 --> 00:05:57,250 Znesek rdečega notranjosti te piksel, kadar vsak znesek, ki ga zastopa 102 00:05:57,250 --> 00:05:58,670 šestnajstiško število. 103 00:05:58,670 --> 00:06:04,370 >> Tako bo FF0000 biti modre barve, ker gre iz modre, 104 00:06:04,370 --> 00:06:05,850 zeleno, rdeče. 105 00:06:05,850 --> 00:06:09,300 In potem bo vse f je bela. 106 00:06:09,300 --> 00:06:13,440 Oglejmo si na smiley.bmp, ki imate v distribucijskem kodo. 107 00:06:13,440 --> 00:06:15,690 Če jo odprete v samo sliko gledalec, potem boste 108 00:06:15,690 --> 00:06:17,080 pravkar videli rdeče smeška. 109 00:06:17,080 --> 00:06:20,380 Vendar ob globlji potop v bomo vidimo, da se struktura 110 00:06:20,380 --> 00:06:22,340 za to je le nekaj točk. 111 00:06:22,340 --> 00:06:25,880 Imamo belih pik, in nato rdeče pikslov. 112 00:06:25,880 --> 00:06:31,000 Temperatura, FFFFFF in nato vse rdečih pik sem obarvani za vas 113 00:06:31,000 --> 00:06:35,440 tu, in boste videli, da oni 0000FF. 114 00:06:35,440 --> 00:06:39,760 Zero modra, zelena nič, in močno rdeče. 115 00:06:39,760 --> 00:06:45,350 In ker smeška osem slikovnih pik, nimamo nobene oblazinjenje. 116 00:06:45,350 --> 00:06:47,360 Vse je v redu. 117 00:06:47,360 --> 00:06:53,310 >> Torej, če bi bil jaz dodeliti različne vrednosti na RGBTRIPLE in sem hotel 118 00:06:53,310 --> 00:06:58,350 da bi bilo zeleno, potem, kaj bi naredil, je Jaz bi razglasi RGBTRIPLE, imenovan 119 00:06:58,350 --> 00:07:02,660 Triple, in nato dostop vsak bajt v tem struct I 120 00:07:02,660 --> 00:07:04,030 bi uporabite operator pika. 121 00:07:04,030 --> 00:07:08,430 Torej triple.rgbtBlue, sem lahko dodeliti, da na 0. 122 00:07:08,430 --> 00:07:13,460 Zelena ga lahko dodelite polna - vsako število, res, med 0 in FF. 123 00:07:13,460 --> 00:07:15,470 In potem rdeča, Jaz sem tudi hotel reči 0. 124 00:07:15,470 --> 00:07:19,160 Torej, da mi daje zeleno piko. 125 00:07:19,160 --> 00:07:23,030 >> Dalje, kaj če hočem, da preverite vrednost nečesa? 126 00:07:23,030 --> 00:07:27,250 Lahko bi imeli nekaj, ki preveri ali je rgbtBlue vrednost trojnem je 127 00:07:27,250 --> 00:07:31,080 ff in potem print "Počutim blue! ", kot rezultat. 128 00:07:31,080 --> 00:07:35,640 No, to ne pomeni nujno, da je pixel modra, kajne? 129 00:07:35,640 --> 00:07:40,060 Ker zelena in rdeča vrednosti slikovnih pik je lahko tudi neugodno 0 vrednote. 130 00:07:40,060 --> 00:07:43,470 Vse, kar to pomeni, in vse, kar to preverjanje je 131 00:07:43,470 --> 00:07:45,610 za polno modro barvo. 132 00:07:45,610 --> 00:07:50,050 Vendar bi vsi pikslov imajo tudi delni barvne vrednosti, kot je ta, 133 00:07:50,050 --> 00:07:52,180 Naslednji primer tukaj. 134 00:07:52,180 --> 00:07:55,400 >> To je malo težje videti kaj ta slika je zdaj. 135 00:07:55,400 --> 00:08:00,320 To zgleda malo več kot clue.bmp da boš ti dal. 136 00:08:00,320 --> 00:08:03,600 Zdaj, fizično, ti to lahko reši, zato, ker je veliko rdeče, ki jo 137 00:08:03,600 --> 00:08:07,040 držiš rdeč zaslon na sliki, tako da se lahko pojavijo druge barve. 138 00:08:07,040 --> 00:08:10,968 Torej, kako bomo posnemajo to s C? 139 00:08:10,968 --> 00:08:15,640 No, morda smo odstranili vse rdeče iz slike v celoti. 140 00:08:15,640 --> 00:08:21,870 In tako narediti, da bomo določiti vsak Pixel rdeči vrednost na 0. 141 00:08:21,870 --> 00:08:25,020 In tako bo slika videti nekoliko bit, kot je ta, kjer nimamo rdeče 142 00:08:25,020 --> 00:08:26,300 whatsoever. 143 00:08:26,300 --> 00:08:29,390 >> Vidimo lahko skrite sporočilu malo bolj jasno zdaj. 144 00:08:29,390 --> 00:08:31,730 To je še en smeško. 145 00:08:31,730 --> 00:08:33,870 Ali pa bi se lahko uporabijo drugo metodo. 146 00:08:33,870 --> 00:08:36,480 Mogoče bi lahko prepoznajo vse rdeče pik - 147 00:08:36,480 --> 00:08:41,100 da je vse pik z 0 modra, zelena 0, 0 in rdeče - 148 00:08:41,100 --> 00:08:43,169 in spremeniti tiste v belo. 149 00:08:43,169 --> 00:08:45,470 In morda je naša slika videti kaj takega. 150 00:08:45,470 --> 00:08:48,250 Malo lažje videti. 151 00:08:48,250 --> 00:08:51,170 >> Obstaja veliko drugih načinov, da razvozlajo Skrivnost sporočilo, kot tudi, 152 00:08:51,170 --> 00:08:53,730 , ki se ukvarjajo z barvo manipulacije. 153 00:08:53,730 --> 00:08:57,050 Morda lahko uporabite enega od načinov da sem zgoraj. 154 00:08:57,050 --> 00:08:59,600 In poleg tega, boste morda želeli izboljšati nekatere barve 155 00:08:59,600 --> 00:09:02,620 in bi jih ven. 156 00:09:02,620 --> 00:09:06,190 >> Torej sedaj, ko smo spremenili pixel barve, zraven smo morali, da jih pišejo 157 00:09:06,190 --> 00:09:08,500 se v scanline, pixel s piko. 158 00:09:08,500 --> 00:09:11,860 In še enkrat, boste želeli, da se ozremo da copy.c, če še niste kopirali 159 00:09:11,860 --> 00:09:18,170 je že, in pogled na fwrite Funkcija, ki bo podatke, kazalec 160 00:09:18,170 --> 00:09:23,230 na struct, ki vsebuje bajte da berete iz, velikosti 161 00:09:23,230 --> 00:09:26,610 predmeti, število kosov, in nato outptr - 162 00:09:26,610 --> 00:09:29,450 namembnost teh datotek. 163 00:09:29,450 --> 00:09:34,010 >> Potem, ko ste napisali v pikslih, boste tudi pisati v oblazinjenja. 164 00:09:34,010 --> 00:09:34,970 Kaj je polnilo? 165 00:09:34,970 --> 00:09:38,670 No, vsak rgbt pixel tri bajte. 166 00:09:38,670 --> 00:09:43,670 Ampak, scanline za bitne slike mora biti večkratnik štirih bajtov. 167 00:09:43,670 --> 00:09:47,650 In če število točk ne multiple štirih, potem moramo dodati 168 00:09:47,650 --> 00:09:48,880 To polnilo. 169 00:09:48,880 --> 00:09:51,420 Oblazinjenje je z 0s samo zastopa. 170 00:09:51,420 --> 00:09:54,380 Torej, kako smo napisali, ali brati? 171 00:09:54,380 --> 00:09:59,280 No, izkazalo se je, da ne morete dejansko fread oblazinjenje, vendar lahko 172 00:09:59,280 --> 00:10:00,970 izračun. 173 00:10:00,970 --> 00:10:04,400 >> V tem primeru namig in razsodba imajo enako širino, tako 174 00:10:04,400 --> 00:10:05,910 polnilo je enaka. 175 00:10:05,910 --> 00:10:09,370 In oblazinjenje, kot boste videli V copy.c, se izračuna 176 00:10:09,370 --> 00:10:11,790 s spodnjo formulo - 177 00:10:11,790 --> 00:10:16,690 bi.biWidth krat sizeof (RGBTRIPLE) bo nam je dal, koliko bajtov bmp 178 00:10:16,690 --> 00:10:18,280 ima v vsaki vrstici. 179 00:10:18,280 --> 00:10:21,890 Od tam, modulos in odštevanja s 4 mogoče izračunati, kako 180 00:10:21,890 --> 00:10:25,610 veliko bajtov je treba dodati, da multiple bajtov na 181 00:10:25,610 --> 00:10:27,250 vsaka vrstica je štiri. 182 00:10:27,250 --> 00:10:30,490 >> Sedaj, ko imamo formulo za koliko oblazinjenje moramo zdaj 183 00:10:30,490 --> 00:10:31,610 mi lahko pišete. 184 00:10:31,610 --> 00:10:34,080 Sedaj sem že prej omenil, Oblazinjenje je le 0s. 185 00:10:34,080 --> 00:10:39,730 Torej, v tem primeru smo samo polaganje char, v tem primeru 0, v našem 186 00:10:39,730 --> 00:10:41,710 outptr - naša outfile. 187 00:10:41,710 --> 00:10:47,530 Tako, da lahko samo fputc 0, vejica outptr. 188 00:10:47,530 --> 00:10:52,400 >> Torej, ko smo prebrali v našem datoteka, je datoteka I / O hrani spremljate naše 189 00:10:52,400 --> 00:10:57,440 Položaj v teh datotekah z nečim imenovana kazalnik datoteke položaj. 190 00:10:57,440 --> 00:10:59,350 Think of it kot kazalca. 191 00:10:59,350 --> 00:11:03,550 V bistvu je napredek vsakič da smo fread, vendar imamo 192 00:11:03,550 --> 00:11:05,671 nadzor nad njim, preveč. 193 00:11:05,671 --> 00:11:11,030 >> Če želite premakniti kazalec datoteke položaja, lahko uporabite funkcijo fseek. 194 00:11:11,030 --> 00:11:15,600 Kje inptr predstavlja datoteko kazalec, da si želi v, 195 00:11:15,600 --> 00:11:20,370 znesek je število bajtov, ki jih želite premakniti kazalec, in nato iz 196 00:11:20,370 --> 00:11:23,470 nanaša na referenčno točko od koder je kazalec. 197 00:11:23,470 --> 00:11:26,770 Če se boste peljali v SEEK_CUR, da predstavlja tok 198 00:11:26,770 --> 00:11:28,100 Položaj v datoteki. 199 00:11:28,100 --> 00:11:31,020 Ali pa lahko uporabite nekatere druge parametre. 200 00:11:31,020 --> 00:11:35,400 Torej, bomo morda želeli uporabiti fseek preskočiti nad oblazinjenjem datoteke v. 201 00:11:35,400 --> 00:11:39,410 In spet, če si zaljubljen, pa je Primer, ki v copy.c. 202 00:11:39,410 --> 00:11:43,260 >> Torej, zdaj smo odprli datoteko, namig, in razsodbo. 203 00:11:43,260 --> 00:11:46,450 Posodobili smo info glave za naša razsodba, ker vsak 204 00:11:46,450 --> 00:11:48,730 bitna potrebuje glavo. 205 00:11:48,730 --> 00:11:52,280 Smo nato preberite na sled je scanline, pixel s piko, spreminjanje 206 00:11:52,280 --> 00:11:55,210 vsak barve, kot je potrebno, in pisanje, tiste v 207 00:11:55,210 --> 00:11:57,340 razsodbo, pixel s piko. 208 00:11:57,340 --> 00:12:01,550 Ko odprete obsodbo, lahko vidite, kdo krivec, ali kaj skrivnost 209 00:12:01,550 --> 00:12:02,850 sporočilo. 210 00:12:02,850 --> 00:12:05,550 Moje ime je Zamyla, in to je bilo whodunit. 211 00:12:05,550 --> 00:12:12,864