1 00:00:00,000 --> 00:00:09,500 >> [Muzikavimo] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA CHAN: Tai buvo Mis Scarlett su žvakide. 3 00:00:12,350 --> 00:00:13,560 Detektīvromāns? 4 00:00:13,560 --> 00:00:15,030 Na, mes ketiname sužinoti. 5 00:00:15,030 --> 00:00:20,870 Į stalo žaidimas Clue, galite būti fiziškai raudoną vaizdą. 6 00:00:20,870 --> 00:00:24,120 Ir, kad vaizdas yra labai raudona ir dėmėtas, ir jūsų darbas yra 7 00:00:24,120 --> 00:00:25,490 atskleisti paslėptą žinutę. 8 00:00:25,490 --> 00:00:29,740 Ir paprastai jūs aprūpinami raudona didinamasis stiklas, arba raudonas ekranas 9 00:00:29,740 --> 00:00:31,410 atskleisti, kad paslėptas pranešimą. 10 00:00:31,410 --> 00:00:33,340 Na, mes ketiname imituoti kad. 11 00:00:33,340 --> 00:00:37,960 >> Be Detektīvromāns, jums suteikta bitmap paveikslėlis kad atrodo labai margas ir raudona, 12 00:00:37,960 --> 00:00:43,430 ir paleiskite Detektīvromāns programą atskleisti paslėptą žinutę. 13 00:00:43,430 --> 00:00:45,650 >> Taigi leiskite įsilaužti į etapus tai. 14 00:00:45,650 --> 00:00:50,390 Pirma, jūs norite atidaryti failą - clue, kad jūs buvote. 15 00:00:50,390 --> 00:00:53,880 Ir tada taip pat sukurti verdiktas Bitmap failą. 16 00:00:53,880 --> 00:00:58,240 Tada jūs norite atnaujinti bitmap header info verdiktas outfile. 17 00:00:58,240 --> 00:00:59,920 Daugiau apie tai vėliau. 18 00:00:59,920 --> 00:01:04,319 Ir tada jūs ketinate skaityti į raktas, Scanline pikselių pixel, 19 00:01:04,319 --> 00:01:07,320 keisti pikselių spalvos kaip reikia, ir rašymas 20 00:01:07,320 --> 00:01:08,960 tiems į nuosprendį - 21 00:01:08,960 --> 00:01:12,000 pikselių pixel į verdiktas Scanline. 22 00:01:12,000 --> 00:01:13,780 >> Kaip mes pradėsime eiti apie tai? 23 00:01:13,780 --> 00:01:16,940 Na, laimei, mes turime copy.c platinimo kodas. 24 00:01:16,940 --> 00:01:21,240 Ir tai ketina įrodyti labai naudinga mums. 25 00:01:21,240 --> 00:01:29,700 Copy.c atidaro failą, skaito, kad infile antraštėje, o tada atnaujina 26 00:01:29,700 --> 00:01:31,070 outfile antraštėje. 27 00:01:31,070 --> 00:01:37,010 Ir tada jis skaito kiekvieną pikselį į Scanline pikselių pixel, tada 28 00:01:37,010 --> 00:01:42,390 rašo, kad pikselis į outfile. 29 00:01:42,390 --> 00:01:45,020 >> Taigi, jūsų pirmas žingsnis galėtų būti paleisti po 30 00:01:45,020 --> 00:01:46,420 komandą terminale - 31 00:01:46,420 --> 00:01:50,270 cp copy.c whodunit.c. 32 00:01:50,270 --> 00:01:55,320 Tai padės sukurti kopiją copy.c pavadintas whodunit.c. 33 00:01:55,320 --> 00:01:58,320 Taigi, mūsų pirmasis žingsnis siekiant pradėti failas, gerai, ten tiksli 34 00:01:58,320 --> 00:02:00,070 replika, kad copy.c. 35 00:02:00,070 --> 00:02:03,360 Taigi, aš paliksiu jums pažvelgti į tai. 36 00:02:03,360 --> 00:02:07,860 >> Ką mes susiduriame su šiuo PSET yra failą I / O, iš esmės atsižvelgiant failus, 37 00:02:07,860 --> 00:02:10,229 skaitymas, rašymas, juos redaguoti. 38 00:02:10,229 --> 00:02:12,650 Kaip pirmą kartą atidaryti failą? 39 00:02:12,650 --> 00:02:16,800 Na, jūs ketinate paskelbti failą žymeklis, ir tada jums paskambinti 40 00:02:16,800 --> 00:02:18,670 Funkcija fopen. 41 00:02:18,670 --> 00:02:23,150 Pereiti į kelią, arba kad pavadinimas failą ir tada režimas, kurį norite 42 00:02:23,150 --> 00:02:24,700 atidaryti tą failą in 43 00:02:24,700 --> 00:02:28,620 Kelias į r atvers foo.bmp skaityti. 44 00:02:28,620 --> 00:02:35,670 Kadangi fopen su einančios W bus atvira bar.bmp, rašyti į failą ir 45 00:02:35,670 --> 00:02:37,020 faktiškai jį redaguoti. 46 00:02:37,020 --> 00:02:41,970 >> Taigi dabar, kad mes atidarė failą, mūsų Kitas žingsnis yra atnaujinti antraštės informacija 47 00:02:41,970 --> 00:02:43,230 už outfile. 48 00:02:43,230 --> 00:02:44,610 Kas antraštės informacijos? 49 00:02:44,610 --> 00:02:48,160 Na, visų pirma turime žinoti kas rastras yra. 50 00:02:48,160 --> 00:02:51,000 Rastras yra tik paprastas susitarimas baitų. 51 00:02:51,000 --> 00:02:55,480 Ir jie paskelbė šioje byloje čia bmp.h, su krūva 52 00:02:55,480 --> 00:02:58,610 informacija apie tai, kas rastras yra faktiškai pagamintas iš. 53 00:02:58,610 --> 00:03:05,730 Bet ką mes tikrai rūpi Bitmap failą antraštė, čia ir 54 00:03:05,730 --> 00:03:08,460 rastras informacija antraštė, čia. 55 00:03:08,460 --> 00:03:13,170 Antraštė sudarytas iš poros kintamieji, kurie bus labai naudingi. 56 00:03:13,170 --> 00:03:18,400 Yra biSizeImage, kuris yra Bendras dydis baitais įvaizdį. 57 00:03:18,400 --> 00:03:20,890 Ir tai apima vaizdo ir paminkštinimas. 58 00:03:20,890 --> 00:03:24,210 Apmušalas yra labai svarbi, tačiau mes susisieksime vėliau. 59 00:03:24,210 --> 00:03:30,000 >> BiWidth atstovauja pločio įvaizdis pikselių atėmus paminkštinimas. 60 00:03:30,000 --> 00:03:34,220 BiHeight tada taip pat aukštis iš pikseliais įvaizdį. 61 00:03:34,220 --> 00:03:38,240 Ir tada BITMAPFILEHEADER ir BITMAPINFOHEADER, kaip minėjau 62 00:03:38,240 --> 00:03:40,900 anksčiau, tie, kurie atstovauja kaip structs. 63 00:03:40,900 --> 00:03:45,410 Taigi, jūs negalite pasiekti failo antraštę pati, bet jūs norite gauti 64 00:03:45,410 --> 00:03:47,370 tie kintamieji viduje. 65 00:03:47,370 --> 00:03:48,170 >> Gerai. 66 00:03:48,170 --> 00:03:50,600 Taigi, kaip mes atnaujinti antraštės informacijos? 67 00:03:50,600 --> 00:03:54,020 Na, pirmiausia turime išsiaiškinti, ar mes reikia pakeisti bet kokią informaciją iš 68 00:03:54,020 --> 00:03:58,480 INFILE, raktas, į outfile, verdiktas. 69 00:03:58,480 --> 00:04:00,250 Ar kas nors keičiasi tokiu atveju? 70 00:04:00,250 --> 00:04:04,320 Na, ne iš tikrųjų, nes mes ketiname reikia tiesiog pakeisti spalvas. 71 00:04:04,320 --> 00:04:07,550 Mes neketiname keičiasi failą dydis, vaizdo dydį, plotis, 72 00:04:07,550 --> 00:04:08,310 arba aukštis. 73 00:04:08,310 --> 00:04:14,010 Taigi jūs visi tinka dabar, tiesiog kopijuojant kiekvieną pikselį. 74 00:04:14,010 --> 00:04:14,840 >> Gerai. 75 00:04:14,840 --> 00:04:20,720 Taigi dabar pažvelkime, kaip mes iš tikrųjų gali skaityti kiekvieną pikselį iš failo. 76 00:04:20,720 --> 00:04:23,640 Kitas failą I / O funkcijos ateis į žaidimą - 77 00:04:23,640 --> 00:04:24,700 fread. 78 00:04:24,700 --> 00:04:28,440 Ji trunka rodyklė į struct kad bus pateiktos baitų kad 79 00:04:28,440 --> 00:04:30,110 jūs skaitote. 80 00:04:30,110 --> 00:04:31,890 Taigi jūs skaitote į tai. 81 00:04:31,890 --> 00:04:36,090 Ir tada jūs praeiti dydžio, kuris yra kiekvieno elemento dydis, kad jūs 82 00:04:36,090 --> 00:04:37,360 nori perskaityti. 83 00:04:37,360 --> 00:04:40,640 Čia funkcija sizeof praverčia. 84 00:04:40,640 --> 00:04:45,570 Tada pereisite skaičiaus, kuris atstovauja elementų skaičius 85 00:04:45,570 --> 00:04:47,480 dydis skaityti. 86 00:04:47,480 --> 00:04:51,180 Ir galiausiai, inptr, kuris yra Failas žymeklis, kad esate 87 00:04:51,180 --> 00:04:52,530 ketinate skaityti. 88 00:04:52,530 --> 00:04:58,650 Taigi visų šių elementų viduje inptr ir jie ketina naudotis duomenimis. 89 00:04:58,650 --> 00:05:01,660 >> Pažvelkime šiek tiek pavyzdyje. 90 00:05:01,660 --> 00:05:07,590 Jei aš noriu skaityti į duomenų dviem šunimis, gerai, aš galiu tai padaryti vienu iš dviejų būdų. 91 00:05:07,590 --> 00:05:15,250 Galiu arba skaityti dviejų objektų dydį šuo nuo mano inptr, ar aš galiu skaityti 92 00:05:15,250 --> 00:05:19,280 vienoje prieštarauti dviejų šunų dydį. 93 00:05:19,280 --> 00:05:23,580 Taigi matote, kad priklausomai nuo to, kaip kad jums organizuoti dydį ir skaičių, jums 94 00:05:23,580 --> 00:05:25,840 galite skaityti toje pačioje baitų skaičius. 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> Taigi dabar galime pakeisti pikselių spalvos kaip mums reikia. 97 00:05:33,020 --> 00:05:37,320 Jei pažvelgti bmp.h vėl, tada pamatysite, kad apačioje 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs yra dar struct, kur jie susideda iš trijų baitų. 99 00:05:42,920 --> 00:05:49,220 Vienas iš jų, rgbtBlue, rgbtGreen ir rgbtRed. 100 00:05:49,220 --> 00:05:52,480 Taigi, kiekvienas iš jų yra ta suma, mėlyna, žalia suma, ir 101 00:05:52,480 --> 00:05:57,250 suma raudona viduje šis pikselių, kur kiekviena suma yra atstovaujama 102 00:05:57,250 --> 00:05:58,670 šešioliktainis skaičius. 103 00:05:58,670 --> 00:06:04,370 >> Taigi Ff0000 bus mėlyna spalva, nes jis eina iš mėlynos, 104 00:06:04,370 --> 00:06:05,850 žalia, raudona. 105 00:06:05,850 --> 00:06:09,300 Ir tada visi f s bus balta. 106 00:06:09,300 --> 00:06:13,440 Leiskite pažvelgti smiley.bmp išvaizdą, kuri jūs turite savo platinimo kodas. 107 00:06:13,440 --> 00:06:15,690 Jei atidarote jį tik vaizdo žiūrovas, tada jūs 108 00:06:15,690 --> 00:06:17,080 tiesiog pamatyti raudoną veiduką. 109 00:06:17,080 --> 00:06:20,380 Tačiau atsižvelgiant giliau pasinerti mes matyti, kad struktūra 110 00:06:20,380 --> 00:06:22,340 ji yra tik pikselių. 111 00:06:22,340 --> 00:06:25,880 Mes turime baltos pikselių, ir tada raudonos taškų. 112 00:06:25,880 --> 00:06:31,000 Baltas, FFFFFF, ir tada visi raudonos pikselių aš spalvoti už jus 113 00:06:31,000 --> 00:06:35,440 čia, ir pamatysite, kad jie 0000FF. 114 00:06:35,440 --> 00:06:39,760 Nulis mėlynas nulis žalia, ir visiškai raudona. 115 00:06:39,760 --> 00:06:45,350 O kadangi šypsenėlių aštuonių pikselių pločio, mes neturime jokios paminkštinimas. 116 00:06:45,350 --> 00:06:47,360 Gerai. 117 00:06:47,360 --> 00:06:53,310 >> Taigi, jei aš buvo priskirti skirtingas reikšmes į RGBTRIPLE ir norėjau 118 00:06:53,310 --> 00:06:58,350 kad ji žalia, tada ką aš norėčiau padaryti, tai Norėčiau paskelbti RGBTRIPLE, pavadintas 119 00:06:58,350 --> 00:07:02,660 triviečiai, ir tada naudotis kiekvienas baitų per tą struct I 120 00:07:02,660 --> 00:07:04,030 naudotų dot operatorių. 121 00:07:04,030 --> 00:07:08,430 Taigi triple.rgbtBlue, galiu priskirti, kad prie 0. 122 00:07:08,430 --> 00:07:13,460 Žalioji galiu priskirti ją visą - bet skaičius, iš tikrųjų, tarp 0 ir ff. 123 00:07:13,460 --> 00:07:15,470 Ir tada raudona, aš taip pat ketina pasakyti 0. 124 00:07:15,470 --> 00:07:19,160 Taigi, kad suteikia man žalia taškų. 125 00:07:19,160 --> 00:07:23,030 >> Be to, ką daryti, jei aš noriu patikrinti kažkas vertė? 126 00:07:23,030 --> 00:07:27,250 Galėjau kažką, kad patikrinimai ar trigubo savo rgbtBlue vertė yra 127 00:07:27,250 --> 00:07:31,080 ff ir tada spausdinti, "Aš jaučiuosi mėlyna! ", kaip rezultatas. 128 00:07:31,080 --> 00:07:35,640 Dabar, tai nebūtinai reiškia, kad pikselių yra mėlynos, tiesa? 129 00:07:35,640 --> 00:07:40,060 Kadangi pikselių yra žalios ir raudonos vertės taip pat gali turėti ne 0 vertybes. 130 00:07:40,060 --> 00:07:43,470 Visi, kad tai reiškia, ir visa tai tai tikrinti yra 131 00:07:43,470 --> 00:07:45,610 už visą mėlynos spalvos. 132 00:07:45,610 --> 00:07:50,050 Bet visi pikseliai taip pat gali turėti dalinis spalvų reikšmes, kaip tai 133 00:07:50,050 --> 00:07:52,180 Kitas pavyzdys čia. 134 00:07:52,180 --> 00:07:55,400 >> Tai šiek tiek sunkiau pamatyti ką šis paveikslėlis yra dabar. 135 00:07:55,400 --> 00:08:00,320 Tai atrodo šiek tiek daugiau kaip clue.bmp, kad jums bus suteikta. 136 00:08:00,320 --> 00:08:03,600 Dabar, fiziškai, galite išspręsti šią problemą, nes ten yra raudonos, burtų 137 00:08:03,600 --> 00:08:07,040 telpa raudoną ekraną vaizdą, kad kad kitos spalvos gali atsirasti. 138 00:08:07,040 --> 00:08:10,968 Taigi, kaip mes imituoti tai su C? 139 00:08:10,968 --> 00:08:15,640 Na, mes galime pašalinti visus raudonai iš paveikslėlio visiškai. 140 00:08:15,640 --> 00:08:21,870 Ir taip padaryti, kad mes norime nustatyti kiekvieną PIXEL raudonųjų vertė 0. 141 00:08:21,870 --> 00:08:25,020 Ir todėl vaizdas atrodys šiek tiek šiek tiek, kaip tai, kur mes neturime raudona 142 00:08:25,020 --> 00:08:26,300 apskritai. 143 00:08:26,300 --> 00:08:29,390 >> Mes galime matyti paslėptą Pranešimu šiek tiek aiškiau dabar. 144 00:08:29,390 --> 00:08:31,730 Tai dar vienas smiley veido. 145 00:08:31,730 --> 00:08:33,870 O gal mes galime naudoti kitą metodą. 146 00:08:33,870 --> 00:08:36,480 Galbūt, mes galime nustatyti visos raudonos pikselių - 147 00:08:36,480 --> 00:08:41,100 tai yra, visi pikselių su 0 mėlynas, 0 žalios ir 0 raudona - 148 00:08:41,100 --> 00:08:43,169 ir pakeisti tuos, baltos spalvos. 149 00:08:43,169 --> 00:08:45,470 Ir mūsų paveikslėlis gali atrodyti kažkas panašaus į tai. 150 00:08:45,470 --> 00:08:48,250 Šiek tiek lengviau pamatyti. 151 00:08:48,250 --> 00:08:51,170 >> Yra daug kitų būdų, kaip atskleisti paslaptis pranešimą, taip pat, 152 00:08:51,170 --> 00:08:53,730 susiduriame su spalvų manipuliacijos. 153 00:08:53,730 --> 00:08:57,050 Gal galite naudoti vieną iš metodų kad aš jau minėjau. 154 00:08:57,050 --> 00:08:59,600 Ir be to, galbūt norėsite padidinti kai kurių spalvų 155 00:08:59,600 --> 00:09:02,620 ir patraukti dėmesį. 156 00:09:02,620 --> 00:09:06,190 >> Taigi dabar, kad mes pakeitėme pikselių spalva, kitą mes tiesiog reikia parašyti jiems 157 00:09:06,190 --> 00:09:08,500 prie Scanline pikselių pixel. 158 00:09:08,500 --> 00:09:11,860 Ir dar kartą, jūs norėsite pažvelgti atgal į copy.c, jei nebus kopijuojamas 159 00:09:11,860 --> 00:09:18,170 tai jau, ir pažvelgti į fwrite funkcija, kuri paima duomenis, žymeklis 160 00:09:18,170 --> 00:09:23,230 į struct, kuriame baitus kad jūs skaitote iš jos dydis 161 00:09:23,230 --> 00:09:26,610 elementus, elementų skaičius, ir tada outptr - 162 00:09:26,610 --> 00:09:29,450 Šių failų paskirties. 163 00:09:29,450 --> 00:09:34,010 >> Po rašote pikselių, jums taip pat turi parašyti išklojimui. 164 00:09:34,010 --> 00:09:34,970 Kas yra prikimšti? 165 00:09:34,970 --> 00:09:38,670 Na, kiekvienas rgbt pikselių yra trys baitų ilgio. 166 00:09:38,670 --> 00:09:43,670 Bet už rastrinis vaizdas Scanline turi būti keturių baitų kartotinis. 167 00:09:43,670 --> 00:09:47,650 Ir jei pikselių skaičius nėra kartotinis keturių, tada mes turime pridėti 168 00:09:47,650 --> 00:09:48,880 tai apdaila. 169 00:09:48,880 --> 00:09:51,420 Apmušalas yra tik atstovauja 0s. 170 00:09:51,420 --> 00:09:54,380 Taigi, kaip mes rašome, ar tai perskaityti? 171 00:09:54,380 --> 00:09:59,280 Na, paaiškėja, kad tu negali faktiškai fread apdaila, bet jūs galite 172 00:09:59,280 --> 00:10:00,970 apskaičiuoti. 173 00:10:00,970 --> 00:10:04,400 >> Šiuo atveju, raktas ir verdiktas turėti tokio pat pločio, todėl 174 00:10:04,400 --> 00:10:05,910 Apmušalas yra tas pats. 175 00:10:05,910 --> 00:10:09,370 Ir prikimšti, kaip pamatysite į copy.c, apskaičiuojamas 176 00:10:09,370 --> 00:10:11,790 su žemiau formulę - 177 00:10:11,790 --> 00:10:16,690 bi.biWidth kartus sizeof (RGBTRIPLE) bus mums duoda, kiek baitų bmp 178 00:10:16,690 --> 00:10:18,280 yra kiekvienoje eilutėje. 179 00:10:18,280 --> 00:10:21,890 Iš ten, modulos ir atimti su 4 galima apskaičiuoti kaip 180 00:10:21,890 --> 00:10:25,610 turi būti pridėtas daug baitų kad baitų keliuose 181 00:10:25,610 --> 00:10:27,250 kiekvienoje eilutėje yra keturi. 182 00:10:27,250 --> 00:10:30,490 >> Dabar, mes turime už formulę kiek prikimšti turime dabar 183 00:10:30,490 --> 00:10:31,610 mes galime jį rašyti. 184 00:10:31,610 --> 00:10:34,080 Dabar aš jau minėta, Apmušalas yra tik 0s. 185 00:10:34,080 --> 00:10:39,730 Taigi šiuo atveju, mes tiesiog išleisti char, šiuo atveju 0, į mūsų 186 00:10:39,730 --> 00:10:41,710 outptr - mūsų outfile. 187 00:10:41,710 --> 00:10:47,530 Taigi, kad gali būti tik fputc 0 kablelis outptr. 188 00:10:47,530 --> 00:10:52,400 >> Taigi, nors mes jau skaitant į mūsų failą, failas I / O yra nuolat stebėti mūsų 189 00:10:52,400 --> 00:10:57,440 pozicija tose failus su kažkuo vadinamas failą padėties indikatorius. 190 00:10:57,440 --> 00:10:59,350 Pagalvokite apie tai, kaip žymeklį. 191 00:10:59,350 --> 00:11:03,550 Iš esmės, tai avansų kiekvieną kartą kad mes fread, bet mes turime 192 00:11:03,550 --> 00:11:05,671 kontroliuoti jį, taip pat. 193 00:11:05,671 --> 00:11:11,030 >> Norėdami perkelti failą padėties indikatorius, galite naudoti funkciją fseek. 194 00:11:11,030 --> 00:11:15,600 Kur inptr atstovauja failą žymeklis, kad esate ieško ir, 195 00:11:15,600 --> 00:11:20,370 suma yra baitų skaičius, kad jūs norite perkelti žymeklį, tada iš 196 00:11:20,370 --> 00:11:23,470 susijęs su atskaitos taško iš kur kursorius yra. 197 00:11:23,470 --> 00:11:26,770 Jei praeiti SEEK_CUR, kad atstovauja srovę 198 00:11:26,770 --> 00:11:28,100 pozicija faile. 199 00:11:28,100 --> 00:11:31,020 Arba galite naudoti kai kuriuos kitus parametrus. 200 00:11:31,020 --> 00:11:35,400 Taigi, mes galbūt norėsite naudoti fseek praleisti virš faile paminkštinimas. 201 00:11:35,400 --> 00:11:39,410 Ir vėl, jei esate pakimba, ten tai yra iš copy.c. pavyzdys 202 00:11:39,410 --> 00:11:43,260 >> Taigi dabar mes jau atidarė failą, raktas, ir verdiktas. 203 00:11:43,260 --> 00:11:46,450 Mes atnaujinome antraštės info Mūsų verdiktas, nes kiekvienas 204 00:11:46,450 --> 00:11:48,730 rastras turi antraštę. 205 00:11:48,730 --> 00:11:52,280 Mes tada skaityti į clue, s Scanline pikselių pixel, keičiant 206 00:11:52,280 --> 00:11:55,210 kiekviena spalva reikia, ir rašyti tie, kurie į 207 00:11:55,210 --> 00:11:57,340 verdiktas pikselių pixel. 208 00:11:57,340 --> 00:12:01,550 Atidarius nuosprendį, jūs galite pamatyti, kas kaltininkas, ar kas paslaptis 209 00:12:01,550 --> 00:12:02,850 pranešimas. 210 00:12:02,850 --> 00:12:05,550 Mano vardas Zamyla ir tai buvo Detektīvromāns. 211 00:12:05,550 --> 00:12:12,864