>> [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.