[Muusika mängib] ZAMYLA chan oli Miss Scarlett koos küünlajalg. Dekkari? Noh, me saame teada. In lauamäng Clue, võite antakse füüsilise punane pilt. Ja see pilt on väga punane ja täpiline, ja teie töö on paljastada peidetud sõnum. Ja tavaliselt sa ette punase luup või punane ekraanil selgub, et peidetud sõnum. Noh, me jäljendada. In Dekkari, sa oled andnud Rasterpildi , mis näeb välja väga täpiline ja punane, ning seejärel käivitage Dekkari programm paljastada peidetud sõnum. Niisiis olgem murda sisse samme. Esiteks, mida soovite faili avada - aimugi, et olete saanud. Ja siis ka looma kohtuotsust bitmap faili. Siis soovite värskendada bitmap header infot kohtuotsust outfile. Veel selle hiljem. Ja siis sa lähed välja lugeda aimugi, scanline, pixel by pixel, muutes pikslite värvid korral ja kirjalikult need võetakse otsus - pikselhaaval sisse kohtuotsust scanline. Kuidas me hakka selle kohta? Noh, õnneks on meil copy.c jaotuse kood. Ja see läheb tõestama üsna kasulik meile. Copy.c avab faili, loeb see, et infile päises ja siis värskendab outfile päises. Ja siis ta loeb iga piksel scanline, pikselhaaval ja seejärel kirjutab, et piksel arvesse outfile. Seega on teie esimene samm võiks olema käivitada järgmine käsk terminalis - cp copy.c whodunit.c. See loob koopia copy.c nimega whodunit.c. Nii et meie esimene samm, et avada fail, noh, seal on täpne replica et copy.c. Nii et ma jätan teid seda vaatama. Mida me tegeleme sellega Erksa on Faili I / O, põhimõtteliselt võttes failid lugemine, kirjutamine, toimetamine neid. Kuidas sa esimese faili avamisel? Noh, sa lähed, et kuulutada fail pointer, ja siis helistada funktsioon fopen. Pass tee või nimi, mis faili ja seejärel režiim, mida soovite avada see fail sisse Sööte r avab foo.bmp lugemiseks. Arvestades fopen koos kulgeb w tahe avatud bar.bmp, kirjutamiseks faili ja tegelikult seda redigeerima. Nüüd, et oleme avanud faili, meie Järgmise sammuna tuleb ajakohastada kaudu info jaoks outfile. Mida header info? Noh, esiteks on meil vaja teada mida bitmap on. Bitmap on lihtsalt paigutus baiti. Ja nad deklareeritud seda pilti Siit bmp.h, hunnik teave selle kohta, mida bitmap tegelikult valmistatud. Aga mida me tõesti hoolivad bitmap faili päis, siin, ja bitmap info kaudu, on siin. Päis koosneb paar muutujaid, mis osutub väga kasulik. On biSizeImage, mis kogu pildi suurus baitides. Ja see hõlmab pikslit ja polster. Polster on väga tähtis, kuid me jõuame hiljem. BiWidth esindab laius image pikslites miinus polster. BiHeight on siis ka kõrguse pildi pikslites. Ja siis BITMAPFILEHEADER ja BITMAPINFOHEADER, nagu ma mainisin, varem, need on esindatud kui structs. Niisiis, sa ei pääse faili päis ise, kuid sa tahad saada need muutujad sees. OK. Niisiis, kuidas me värskendame header info? Noh, kõigepealt peame vaatama, kas me on vaja muuta mis tahes teavet infile, aimugi, et outfile, kohtuotsust. Kas midagi muutes sel juhul? Noh, tegelikult ei, sest me tuleb lihtsalt muutes värve. Me ei kavatse muutes faili suurus, pildi suurus, laius, või kõrgust. Nii et teil on kõik korras nüüd poolt lihtsalt kopeerides iga piksli. OK. Nüüd vaatame, kuidas me tegelikult võib lugeda iga piksli failist. Teine fail I / O funktsioon tulevad mängu - fread. See võtab kursor struct mis sisaldab bytes et sa loed. Nii et sa loed sinna. Ja siis liigu suurus, mis on suurus iga element, et sa soovite lugeda. Siin funktsiooni sizeof tulevad mugav. Siis liigu number, mis tähistab arvu elemente suurus lugeda. Ja siis lõpuks, inptr, mis on file pointer, et sa oled loen alates. Nii et kõik need elemendid on sees inptr ja nad ei kavatse andmed. Vaatame natuke näiteks. Kui ma tahan lugeda andmeteks kaks koera Noh, ma ei saa seda teha kahel viisil. Võin kas lugeda kaks objektide suurus koer minu inptr või võin lugeda ühes vastuväiteid suurus kaks koera. Nii et näete, et olenevalt sellest, kuidas et teil korraldada suurus ja arv, siis võib lugeda sama baitide arvu. Nüüd, olgem muuta pixel värvi me vajame. Kui te vaatate bmp.h uuesti, näete, et allosas RGBTRIPLEs on teine ​​struktuure, kus nad koosnevad kolmest baiti. Üks, rgbtBlue, rgbtGreen ja rgbtRed. Niisiis kõik need kujutab summa sinine, rohelise värvi, ja punaste sees pixel, kus iga summa on esindatud kuueteistkümnendsüsteemis number. Nii ff0000 on sinine värv, sest see läheb sinisest, roheliseks, punaseks. Ja siis kõik f on on valge. Võtame pilk smiley.bmp, mis on teie jaotuse kood. Kui avate selle lihtsalt pilt vaataja, siis saate lihtsalt näha punane smiley. Aga võttes sügavamale sukelduda, siis tulen näha, et struktuur see on lihtsalt pikslit. Meil on valge pikslit, ja siis punane pikslit. Valge, ffffff, ja siis on kõik punane pikslit Olen värvimata teile siin, ja te näete, et nad 0000FF. Zero sinine, null roheline ja täis punane. Ja kuna smiley on kaheksa pikslit lai, meil ei ole mingit polster. Hea küll. Niisiis, kui ma määrata erinevad väärtused et RGBTRIPLE ja ma tahtsin muuta see roheliseks, siis mida ma teeksin, on Ma kinnitan, RGBTRIPLE nimega triple ja seejärel näha iga bait selles struct I kasutab dot operaator. Nii triple.rgbtBlue, ma ei määrata, et kuni 0. Green Ma ei määrata selle täis - kõik number, tõesti, vahel 0 ja ff. Ja siis punane, ma ka ütlen 0. Niisiis, mis annab mulle roheline pixel. Järgmine, aga kui ma tahan, et kontrollida väärtus midagi? Ma võiks olla midagi, mis kontrollib kas triple on rgbtBlue väärtus on ff ja seejärel printida, "ma tunnen sinine! ", nagu tulemus. Nüüd, see ei tähenda tingimata, mis piksel on sinine, eks? Kuna piksli punase ja rohelise väärtused võib olla ka mitte-0 väärtused. Kõik see tähendab, ja kõik sellised see kontrollimine on terve sinine värv. Aga kõik piksleid ka osalise värvi väärtused, nagu see Järgmine näide siin. See on natuke raskem näha mida see pilt on nüüd. See tundub natuke nagu clue.bmp et antakse teile. Nüüd, füüsiliselt, siis võiks seda lahendada, sest seal on palju punast, mida hoidmine punase ekraani pilt nii et teised värvid võivad ilmneda. Niisiis, kuidas me jäljendada seda c? Noh, me võiksime kõrvaldada kõik punased alates pilt täielikult. Ja mida teha, et me määrata iga piksli punase väärtuseks 0. Ja nii et pilti näeks natuke natuke nagu see, kus meil ei ole punane üldse. Näeme peidetud sõnum natuke selgemalt nüüd. See on teine ​​naerusuu. Või äkki me võiks kasutada mõnda muud meetodit. Äkki me võiks määratleda kõik punased pikslit - see tähendab, et kõik pikslid 0 sinine 0 roheline ja 0 punane - ja muuta need valgeks. Ja meie pilt võiks välja midagi sellist. Natuke lihtsam näha. Seal on palju muid võimalusi, et paljastada salajane sõnum ka, tegelevad värvi manipuleerimist. Äkki võib kasutada ühte meetoditest et ma eespool mainitud. Ja lisaks võiksite suurendada mõned värvid ja tuua need välja. Nüüd, et oleme muutnud pixel värv kõrval on meil vaja kirjutada neid sisse scanline, pixel by pixel. Ja veel kord, sa tahad, et vaadata tagasi et copy.c, kui sa ei ole kopeerinud seda juba, ja vaadata fwrite funktsioon, mis võtab andmeid pointer et struct mis sisaldab bytes et sa loed alates suurus esemed, esemete arv, ja siis outptr - sihtkoha neid faile. Pärast kirjutad pikslit, siis saad ka kirjutada polster. Mis on polster? Noh, iga rgbt pixel on kolm baiti pikk. Aga scanline jaoks Rasterpildi peab olema mitu neli baiti. Ja kui pikslite arv ei ole Mitme neli, siis on meil vaja lisada see polster. Polster on lihtsalt esindab 0.. Niisiis, kuidas me kirjutada või lugeda seda? Noh, tuli välja, et sa ei saa tegelikult fread polster, kuid võite arvutada. Sel juhul aimugi ja kohtuotsust on sama laiusega, nii polster sama. Ja polstrist, kui näete aastal copy.c, arvutatakse koos allpool valemiga - bi.biWidth korda sizeof (RGBTRIPLE) tahe meile kui palju baite bmp on igas reas. Sealt MODULOS ja lahutamine 4 võib arvutada, kui palju baite tuleb lisada, et Mitme baite edasi igal real on neli. Nüüd, kui meil on valem kui palju padding peame nüüd saame kirjutada. Nüüd juba mainisin, polster on lihtsalt 0.. Nii et sel juhul me lihtsalt pannes char, antud juhul 0, meie outptr - meie outfile. Nii et saab lihtsalt fputc 0, koma outptr. Seega, kui me oleme olnud lugedes meie , faili I / O on hoida silma peal meie positsiooni neid faile koos midagi nimega faili positsiooni indikaator. Mõtle seda kursor. Põhimõtteliselt, see areneb iga kord et me fread, kuid meil kontroll selle üle ka. Faili teisaldada positsiooni indikaator, saate kasutada funktsiooni fseek. Kui inptr tähistab faili pointer, et otsite kohta, summa on baitide arv, mis te tahad liigutada kursorit, ja siis seotud võrdluspunkti kust kursor. Kui teil liigu SEEK_CUR, et esindab praegune positsiooni faili. Või võite kasutada mõnda muud parameetrid. Niisiis, me võiksite kasutada fseek vahele üle polstrist faili. Ja veel, kui sa oled ummikus, ei Näiteks, et copy.c. Nüüd oleme avatud faili aimugi, ja kohtuotsus. Oleme uuendanud header info eest meie otsus, sest iga bitmap vaja päises. Oleme siis loe arvesse aimugi on scanline, pikselhaaval, muutes iga värvi muudetakse vajadusel kirjalikult neid arvesse kohtuotsust, pixel by pixel. Kui avate kohtuotsust, saab näha, kes süüdlane, või mis saladus sõnum. Minu nimi on Zamyla ja see oli Dekkari.