[Muzikavimo] ZAMYLA CHAN: Tai buvo Mis Scarlett su žvakide. Detektīvromāns? Na, mes ketiname sužinoti. Į stalo žaidimas Clue, galite būti fiziškai raudoną vaizdą. Ir, kad vaizdas yra labai raudona ir dėmėtas, ir jūsų darbas yra atskleisti paslėptą žinutę. Ir paprastai jūs aprūpinami raudona didinamasis stiklas, arba raudonas ekranas atskleisti, kad paslėptas pranešimą. Na, mes ketiname imituoti kad. Be Detektīvromāns, jums suteikta bitmap paveikslėlis kad atrodo labai margas ir raudona, ir paleiskite Detektīvromāns programą atskleisti paslėptą žinutę. Taigi leiskite įsilaužti į etapus tai. Pirma, jūs norite atidaryti failą - clue, kad jūs buvote. Ir tada taip pat sukurti verdiktas Bitmap failą. Tada jūs norite atnaujinti bitmap header info verdiktas outfile. Daugiau apie tai vėliau. Ir tada jūs ketinate skaityti į raktas, Scanline pikselių pixel, keisti pikselių spalvos kaip reikia, ir rašymas tiems į nuosprendį - pikselių pixel į verdiktas Scanline. Kaip mes pradėsime eiti apie tai? Na, laimei, mes turime copy.c platinimo kodas. Ir tai ketina įrodyti labai naudinga mums. Copy.c atidaro failą, skaito, kad infile antraštėje, o tada atnaujina outfile antraštėje. Ir tada jis skaito kiekvieną pikselį į Scanline pikselių pixel, tada rašo, kad pikselis į outfile. Taigi, jūsų pirmas žingsnis galėtų būti paleisti po komandą terminale - cp copy.c whodunit.c. Tai padės sukurti kopiją copy.c pavadintas whodunit.c. Taigi, mūsų pirmasis žingsnis siekiant pradėti failas, gerai, ten tiksli replika, kad copy.c. Taigi, aš paliksiu jums pažvelgti į tai. Ką mes susiduriame su šiuo PSET yra failą I / O, iš esmės atsižvelgiant failus, skaitymas, rašymas, juos redaguoti. Kaip pirmą kartą atidaryti failą? Na, jūs ketinate paskelbti failą žymeklis, ir tada jums paskambinti Funkcija fopen. Pereiti į kelią, arba kad pavadinimas failą ir tada režimas, kurį norite atidaryti tą failą in Kelias į r atvers foo.bmp skaityti. Kadangi fopen su einančios W bus atvira bar.bmp, rašyti į failą ir faktiškai jį redaguoti. Taigi dabar, kad mes atidarė failą, mūsų Kitas žingsnis yra atnaujinti antraštės informacija už outfile. Kas antraštės informacijos? Na, visų pirma turime žinoti kas rastras yra. Rastras yra tik paprastas susitarimas baitų. Ir jie paskelbė šioje byloje čia bmp.h, su krūva informacija apie tai, kas rastras yra faktiškai pagamintas iš. Bet ką mes tikrai rūpi Bitmap failą antraštė, čia ir rastras informacija antraštė, čia. Antraštė sudarytas iš poros kintamieji, kurie bus labai naudingi. Yra biSizeImage, kuris yra Bendras dydis baitais įvaizdį. Ir tai apima vaizdo ir paminkštinimas. Apmušalas yra labai svarbi, tačiau mes susisieksime vėliau. BiWidth atstovauja pločio įvaizdis pikselių atėmus paminkštinimas. BiHeight tada taip pat aukštis iš pikseliais įvaizdį. Ir tada BITMAPFILEHEADER ir BITMAPINFOHEADER, kaip minėjau anksčiau, tie, kurie atstovauja kaip structs. Taigi, jūs negalite pasiekti failo antraštę pati, bet jūs norite gauti tie kintamieji viduje. Gerai. Taigi, kaip mes atnaujinti antraštės informacijos? Na, pirmiausia turime išsiaiškinti, ar mes reikia pakeisti bet kokią informaciją iš INFILE, raktas, į outfile, verdiktas. Ar kas nors keičiasi tokiu atveju? Na, ne iš tikrųjų, nes mes ketiname reikia tiesiog pakeisti spalvas. Mes neketiname keičiasi failą dydis, vaizdo dydį, plotis, arba aukštis. Taigi jūs visi tinka dabar, tiesiog kopijuojant kiekvieną pikselį. Gerai. Taigi dabar pažvelkime, kaip mes iš tikrųjų gali skaityti kiekvieną pikselį iš failo. Kitas failą I / O funkcijos ateis į žaidimą - fread. Ji trunka rodyklė į struct kad bus pateiktos baitų kad jūs skaitote. Taigi jūs skaitote į tai. Ir tada jūs praeiti dydžio, kuris yra kiekvieno elemento dydis, kad jūs nori perskaityti. Čia funkcija sizeof praverčia. Tada pereisite skaičiaus, kuris atstovauja elementų skaičius dydis skaityti. Ir galiausiai, inptr, kuris yra Failas žymeklis, kad esate ketinate skaityti. Taigi visų šių elementų viduje inptr ir jie ketina naudotis duomenimis. Pažvelkime šiek tiek pavyzdyje. Jei aš noriu skaityti į duomenų dviem šunimis, gerai, aš galiu tai padaryti vienu iš dviejų būdų. Galiu arba skaityti dviejų objektų dydį šuo nuo mano inptr, ar aš galiu skaityti vienoje prieštarauti dviejų šunų dydį. Taigi matote, kad priklausomai nuo to, kaip kad jums organizuoti dydį ir skaičių, jums galite skaityti toje pačioje baitų skaičius. Taigi dabar galime pakeisti pikselių spalvos kaip mums reikia. Jei pažvelgti bmp.h vėl, tada pamatysite, kad apačioje RGBTRIPLEs yra dar struct, kur jie susideda iš trijų baitų. Vienas iš jų, rgbtBlue, rgbtGreen ir rgbtRed. Taigi, kiekvienas iš jų yra ta suma, mėlyna, žalia suma, ir suma raudona viduje šis pikselių, kur kiekviena suma yra atstovaujama šešioliktainis skaičius. Taigi Ff0000 bus mėlyna spalva, nes jis eina iš mėlynos, žalia, raudona. Ir tada visi f s bus balta. Leiskite pažvelgti smiley.bmp išvaizdą, kuri jūs turite savo platinimo kodas. Jei atidarote jį tik vaizdo žiūrovas, tada jūs tiesiog pamatyti raudoną veiduką. Tačiau atsižvelgiant giliau pasinerti mes matyti, kad struktūra ji yra tik pikselių. Mes turime baltos pikselių, ir tada raudonos taškų. Baltas, FFFFFF, ir tada visi raudonos pikselių aš spalvoti už jus čia, ir pamatysite, kad jie 0000FF. Nulis mėlynas nulis žalia, ir visiškai raudona. O kadangi šypsenėlių aštuonių pikselių pločio, mes neturime jokios paminkštinimas. Gerai. Taigi, jei aš buvo priskirti skirtingas reikšmes į RGBTRIPLE ir norėjau kad ji žalia, tada ką aš norėčiau padaryti, tai Norėčiau paskelbti RGBTRIPLE, pavadintas triviečiai, ir tada naudotis kiekvienas baitų per tą struct I naudotų dot operatorių. Taigi triple.rgbtBlue, galiu priskirti, kad prie 0. Žalioji galiu priskirti ją visą - bet skaičius, iš tikrųjų, tarp 0 ir ff. Ir tada raudona, aš taip pat ketina pasakyti 0. Taigi, kad suteikia man žalia taškų. Be to, ką daryti, jei aš noriu patikrinti kažkas vertė? Galėjau kažką, kad patikrinimai ar trigubo savo rgbtBlue vertė yra ff ir tada spausdinti, "Aš jaučiuosi mėlyna! ", kaip rezultatas. Dabar, tai nebūtinai reiškia, kad pikselių yra mėlynos, tiesa? Kadangi pikselių yra žalios ir raudonos vertės taip pat gali turėti ne 0 vertybes. Visi, kad tai reiškia, ir visa tai tai tikrinti yra už visą mėlynos spalvos. Bet visi pikseliai taip pat gali turėti dalinis spalvų reikšmes, kaip tai Kitas pavyzdys čia. Tai šiek tiek sunkiau pamatyti ką šis paveikslėlis yra dabar. Tai atrodo šiek tiek daugiau kaip clue.bmp, kad jums bus suteikta. Dabar, fiziškai, galite išspręsti šią problemą, nes ten yra raudonos, burtų telpa raudoną ekraną vaizdą, kad kad kitos spalvos gali atsirasti. Taigi, kaip mes imituoti tai su C? Na, mes galime pašalinti visus raudonai iš paveikslėlio visiškai. Ir taip padaryti, kad mes norime nustatyti kiekvieną PIXEL raudonųjų vertė 0. Ir todėl vaizdas atrodys šiek tiek šiek tiek, kaip tai, kur mes neturime raudona apskritai. Mes galime matyti paslėptą Pranešimu šiek tiek aiškiau dabar. Tai dar vienas smiley veido. O gal mes galime naudoti kitą metodą. Galbūt, mes galime nustatyti visos raudonos pikselių - tai yra, visi pikselių su 0 mėlynas, 0 žalios ir 0 raudona - ir pakeisti tuos, baltos spalvos. Ir mūsų paveikslėlis gali atrodyti kažkas panašaus į tai. Šiek tiek lengviau pamatyti. Yra daug kitų būdų, kaip atskleisti paslaptis pranešimą, taip pat, susiduriame su spalvų manipuliacijos. Gal galite naudoti vieną iš metodų kad aš jau minėjau. Ir be to, galbūt norėsite padidinti kai kurių spalvų ir patraukti dėmesį. Taigi dabar, kad mes pakeitėme pikselių spalva, kitą mes tiesiog reikia parašyti jiems prie Scanline pikselių pixel. Ir dar kartą, jūs norėsite pažvelgti atgal į copy.c, jei nebus kopijuojamas tai jau, ir pažvelgti į fwrite funkcija, kuri paima duomenis, žymeklis į struct, kuriame baitus kad jūs skaitote iš jos dydis elementus, elementų skaičius, ir tada outptr - Šių failų paskirties. Po rašote pikselių, jums taip pat turi parašyti išklojimui. Kas yra prikimšti? Na, kiekvienas rgbt pikselių yra trys baitų ilgio. Bet už rastrinis vaizdas Scanline turi būti keturių baitų kartotinis. Ir jei pikselių skaičius nėra kartotinis keturių, tada mes turime pridėti tai apdaila. Apmušalas yra tik atstovauja 0s. Taigi, kaip mes rašome, ar tai perskaityti? Na, paaiškėja, kad tu negali faktiškai fread apdaila, bet jūs galite apskaičiuoti. Šiuo atveju, raktas ir verdiktas turėti tokio pat pločio, todėl Apmušalas yra tas pats. Ir prikimšti, kaip pamatysite į copy.c, apskaičiuojamas su žemiau formulę - bi.biWidth kartus sizeof (RGBTRIPLE) bus mums duoda, kiek baitų bmp yra kiekvienoje eilutėje. Iš ten, modulos ir atimti su 4 galima apskaičiuoti kaip turi būti pridėtas daug baitų kad baitų keliuose kiekvienoje eilutėje yra keturi. Dabar, mes turime už formulę kiek prikimšti turime dabar mes galime jį rašyti. Dabar aš jau minėta, Apmušalas yra tik 0s. Taigi šiuo atveju, mes tiesiog išleisti char, šiuo atveju 0, į mūsų outptr - mūsų outfile. Taigi, kad gali būti tik fputc 0 kablelis outptr. Taigi, nors mes jau skaitant į mūsų failą, failas I / O yra nuolat stebėti mūsų pozicija tose failus su kažkuo vadinamas failą padėties indikatorius. Pagalvokite apie tai, kaip žymeklį. Iš esmės, tai avansų kiekvieną kartą kad mes fread, bet mes turime kontroliuoti jį, taip pat. Norėdami perkelti failą padėties indikatorius, galite naudoti funkciją fseek. Kur inptr atstovauja failą žymeklis, kad esate ieško ir, suma yra baitų skaičius, kad jūs norite perkelti žymeklį, tada iš susijęs su atskaitos taško iš kur kursorius yra. Jei praeiti SEEK_CUR, kad atstovauja srovę pozicija faile. Arba galite naudoti kai kuriuos kitus parametrus. Taigi, mes galbūt norėsite naudoti fseek praleisti virš faile paminkštinimas. Ir vėl, jei esate pakimba, ten tai yra iš copy.c. pavyzdys Taigi dabar mes jau atidarė failą, raktas, ir verdiktas. Mes atnaujinome antraštės info Mūsų verdiktas, nes kiekvienas rastras turi antraštę. Mes tada skaityti į clue, s Scanline pikselių pixel, keičiant kiekviena spalva reikia, ir rašyti tie, kurie į verdiktas pikselių pixel. Atidarius nuosprendį, jūs galite pamatyti, kas kaltininkas, ar kas paslaptis pranešimas. Mano vardas Zamyla ir tai buvo Detektīvromāns.