>> [Predvaja glasba]
>> ZAMYLA CHAN: To je bila Miss Scarlett s svečnikom.
Whodunit?
No, bomo izvedeli.
V board igre Clue, boste morda treba fizično rdeče slike.
In ta slika je zelo rdeče in lisast, in vaša naloga je, da
razkrije skrito sporočilo.
In ponavadi ti opremljeni z rdečo povečevalno steklo, ali rdeča zaslon
kažejo, da je skrito sporočilo.
No, bomo posnema.
>> V whodunit, da vam dajo bitne slike da izgleda zelo lisast in rdeča,
in nato zaženite program whodunit da razkrije skrito sporočilo.
>> Torej, kaj je prekinil to v korakih.
Prva, ki jo želite odpreti datoteko - namig, da ste bili dana.
In potem tudi ustvariti Razsodbo bitna slika.
Potem boste želeli posodobiti bitne slike header info za razsodbo izhodna_datoteka.
Več o tem kasneje.
In potem boš prebral v namig, scanline, pixel s piko,
spreminjanje barve pixel kot potrebno, in pisanje
tistih, ki v razsodbo -
slikovnih pik, ki jih pixel v Razsodbo scanline.
>> Kako bomo začeli bomo o tem?
No, na srečo imamo copy.c v kodo za distribucijo.
In to se dogaja, da dokaže zelo koristno za nas.
Copy.c odpre datoteko, je zapisano, da Glava INFILE, nato pa posodobi
Glava OUTFILE je.
In potem se bere vsako piko scanline, pixel s piko, nato pa
piše, da je piksel v izhodna_datoteka.
>> Torej, morda vaš prvi korak ki se vodijo po
ukaz v terminalu -
cp copy.c whodunit.c.
To bo ustvarilo kopijo copy.c imenovan whodunit.c.
Torej naš prvi korak k odpiranju Datoteka, no, tam je natančna
Replika da copy.c.
Torej vas bom pustil, da pogled na to.
>> Kaj imamo opravka v tej PSET se Datoteka I / O, v bistvu ob datotek,
branje, pisanje, njihovo urejanje.
Kako ste najprej odpreti datoteko?
No, boš razglasi datoteko kazalec, nato pa pokličite
Funkcija fopen.
Pass na poti, ali ime, ki datoteko in nato način, ki ga želite
Če želite odpreti to datoteko prijavite
, Ki poteka v r bo odprl foo.bmp za branje.
Ker fopen s prehodom na w bo odprta bar.bmp, za pisanje na datoteko in
dejansko urejanjem.
>> Torej sedaj, ko smo odprli datoteko, naša Naslednji korak je, da se posodobi informacij v glavi
za izhodna_datoteka.
Kaj info glavo?
No, najprej moramo vedeti kaj bitna je.
Bitna je samo preprost Razporeditev bajtov.
In oni so prijavljeni v tem spisu tukaj, bmp.h, s kupom
informacije o tem, kaj bitna je dejansko narejen iz.
Toda kaj smo res skrbi, je Glava bitna slika, tukaj, in
bitna info glava, tukaj.
Glava je sestavljena iz nekaj spremenljivke, ki se bodo izkazali za zelo koristne.
Obstaja biSizeImage, ki je skupna velikost slike vstavljenega.
In to vključuje pik in oblazinjenje.
Oblazinjenje je zelo pomembna, vendar bomo prišli do kasneje.
>> BiWidth predstavlja širino slike v slikovnih minus oblazinjenja.
BiHeight je potem tudi višina slike v pikslih.
In potem BITMAPFILEHEADER in BITMAPINFOHEADER, kot sem omenil
prej, tiste, ki zastopa kot konstruktov.
Torej, ne morete dostopati glava datoteke sama, vendar boste želeli priti do
te spremenljivke znotraj.
>> OK.
Torej, kako bomo posodobiti info glave?
No, najprej moramo videti, ali morali spremeniti vse informacije iz
INFILE, namig, da outfile, razsodba.
Karkoli spreminja v tem primeru?
No, dejansko ne, ker bomo da se le spremembo barve.
Mi ne bomo spreminjali datoteke velikost, velikost, širina,
ali višine.
Torej ste v redu za zdaj jih Samo kopiranje vsak piksel.
>> OK.
Torej, zdaj pa si poglejmo, kako smo dejansko lahko bere vsak pixel iz spisa.
Še ena datoteka I funkcija / O bo prišel v igro -
fread.
To traja v kazalec na struct , ki bo vseboval bajte, ki
berete.
Torej berete v to.
In potem se boste peljali v velikosti, ki je velikost vsak element, ki ga
želijo brati.
Tu funkcijo sizeof bo prišel prav.
Nato pa se boste peljali v številu, ki predstavlja število elementov
velikost brati.
In potem končno, inptr, ki je Datoteka kazalec, da si
bom prebral iz.
Torej, vsi ti elementi so notri inptr in gredo do podatkov.
>> Oglejmo si malo npr.
Če želim brati v podatkovnih dveh psov, dobro, lahko to storite na dva načina.
Ne morem niti brati v dveh objektov velikosti Pes od mojega inptr, ali sem lahko prebral
v enem nasprotuje velikosti dveh psov.
Torej vidite, da glede na način , ki ga organizira velikosti in števila, vas
lahko berejo v enakem številu bajtov.
>> Torej, zdaj, dajmo spremeniti barva pixel, kot moramo.
Če pogledaš na bmp.h še enkrat, nato pa boste videli, da je na dnu
RGBTRIPLEs so še struct, kjer so sestavljena iz treh bajtov.
Ena, rgbtBlue, rgbtGreen in rgbtRed.
Tako je vsak od teh predstavlja znesek modre, količino zelene in
Znesek rdečega notranjosti te piksel, kadar vsak znesek, ki ga zastopa
šestnajstiško število.
>> Tako bo FF0000 biti modre barve, ker gre iz modre,
zeleno, rdeče.
In potem bo vse f je bela.
Oglejmo si na smiley.bmp, ki imate v distribucijskem kodo.
Če jo odprete v samo sliko gledalec, potem boste
pravkar videli rdeče smeška.
Vendar ob globlji potop v bomo vidimo, da se struktura
za to je le nekaj točk.
Imamo belih pik, in nato rdeče pikslov.
Temperatura, FFFFFF in nato vse rdečih pik sem obarvani za vas
tu, in boste videli, da oni 0000FF.
Zero modra, zelena nič, in močno rdeče.
In ker smeška osem slikovnih pik, nimamo nobene oblazinjenje.
Vse je v redu.
>> Torej, če bi bil jaz dodeliti različne vrednosti na RGBTRIPLE in sem hotel
da bi bilo zeleno, potem, kaj bi naredil, je Jaz bi razglasi RGBTRIPLE, imenovan
Triple, in nato dostop vsak bajt v tem struct I
bi uporabite operator pika.
Torej triple.rgbtBlue, sem lahko dodeliti, da na 0.
Zelena ga lahko dodelite polna - vsako število, res, med 0 in FF.
In potem rdeča, Jaz sem tudi hotel reči 0.
Torej, da mi daje zeleno piko.
>> Dalje, kaj če hočem, da preverite vrednost nečesa?
Lahko bi imeli nekaj, ki preveri ali je rgbtBlue vrednost trojnem je
ff in potem print "Počutim blue! ", kot rezultat.
No, to ne pomeni nujno, da je pixel modra, kajne?
Ker zelena in rdeča vrednosti slikovnih pik je lahko tudi neugodno 0 vrednote.
Vse, kar to pomeni, in vse, kar to preverjanje je
za polno modro barvo.
Vendar bi vsi pikslov imajo tudi delni barvne vrednosti, kot je ta,
Naslednji primer tukaj.
>> To je malo težje videti kaj ta slika je zdaj.
To zgleda malo več kot clue.bmp da boš ti dal.
Zdaj, fizično, ti to lahko reši, zato, ker je veliko rdeče, ki jo
držiš rdeč zaslon na sliki, tako da se lahko pojavijo druge barve.
Torej, kako bomo posnemajo to s C?
No, morda smo odstranili vse rdeče iz slike v celoti.
In tako narediti, da bomo določiti vsak Pixel rdeči vrednost na 0.
In tako bo slika videti nekoliko bit, kot je ta, kjer nimamo rdeče
whatsoever.
>> Vidimo lahko skrite sporočilu malo bolj jasno zdaj.
To je še en smeško.
Ali pa bi se lahko uporabijo drugo metodo.
Mogoče bi lahko prepoznajo vse rdeče pik -
da je vse pik z 0 modra, zelena 0, 0 in rdeče -
in spremeniti tiste v belo.
In morda je naša slika videti kaj takega.
Malo lažje videti.
>> Obstaja veliko drugih načinov, da razvozlajo Skrivnost sporočilo, kot tudi,
, ki se ukvarjajo z barvo manipulacije.
Morda lahko uporabite enega od načinov da sem zgoraj.
In poleg tega, boste morda želeli izboljšati nekatere barve
in bi jih ven.
>> Torej sedaj, ko smo spremenili pixel barve, zraven smo morali, da jih pišejo
se v scanline, pixel s piko.
In še enkrat, boste želeli, da se ozremo da copy.c, če še niste kopirali
je že, in pogled na fwrite Funkcija, ki bo podatke, kazalec
na struct, ki vsebuje bajte da berete iz, velikosti
predmeti, število kosov, in nato outptr -
namembnost teh datotek.
>> Potem, ko ste napisali v pikslih, boste tudi pisati v oblazinjenja.
Kaj je polnilo?
No, vsak rgbt pixel tri bajte.
Ampak, scanline za bitne slike mora biti večkratnik štirih bajtov.
In če število točk ne multiple štirih, potem moramo dodati
To polnilo.
Oblazinjenje je z 0s samo zastopa.
Torej, kako smo napisali, ali brati?
No, izkazalo se je, da ne morete dejansko fread oblazinjenje, vendar lahko
izračun.
>> V tem primeru namig in razsodba imajo enako širino, tako
polnilo je enaka.
In oblazinjenje, kot boste videli V copy.c, se izračuna
s spodnjo formulo -
bi.biWidth krat sizeof (RGBTRIPLE) bo nam je dal, koliko bajtov bmp
ima v vsaki vrstici.
Od tam, modulos in odštevanja s 4 mogoče izračunati, kako
veliko bajtov je treba dodati, da multiple bajtov na
vsaka vrstica je štiri.
>> Sedaj, ko imamo formulo za koliko oblazinjenje moramo zdaj
mi lahko pišete.
Sedaj sem že prej omenil, Oblazinjenje je le 0s.
Torej, v tem primeru smo samo polaganje char, v tem primeru 0, v našem
outptr - naša outfile.
Tako, da lahko samo fputc 0, vejica outptr.
>> Torej, ko smo prebrali v našem datoteka, je datoteka I / O hrani spremljate naše
Položaj v teh datotekah z nečim imenovana kazalnik datoteke položaj.
Think of it kot kazalca.
V bistvu je napredek vsakič da smo fread, vendar imamo
nadzor nad njim, preveč.
>> Če želite premakniti kazalec datoteke položaja, lahko uporabite funkcijo fseek.
Kje inptr predstavlja datoteko kazalec, da si želi v,
znesek je število bajtov, ki jih želite premakniti kazalec, in nato iz
nanaša na referenčno točko od koder je kazalec.
Če se boste peljali v SEEK_CUR, da predstavlja tok
Položaj v datoteki.
Ali pa lahko uporabite nekatere druge parametre.
Torej, bomo morda želeli uporabiti fseek preskočiti nad oblazinjenjem datoteke v.
In spet, če si zaljubljen, pa je Primer, ki v copy.c.
>> Torej, zdaj smo odprli datoteko, namig, in razsodbo.
Posodobili smo info glave za naša razsodba, ker vsak
bitna potrebuje glavo.
Smo nato preberite na sled je scanline, pixel s piko, spreminjanje
vsak barve, kot je potrebno, in pisanje, tiste v
razsodbo, pixel s piko.
Ko odprete obsodbo, lahko vidite, kdo krivec, ali kaj skrivnost
sporočilo.
Moje ime je Zamyla, in to je bilo whodunit.