>> [Glazba svira]
>> ZAMYLA Chan: Bilo je Miss Scarlett sa svijećnjaka.
Tko je uradio?
Pa, idemo saznati.
U igra na ploči Clue, možda dati fizički crvenu sliku.
I ta slika je jako crvena i točkicama, a vaš je zadatak
otkriti skrivene poruke.
I obično ste dobili crveni povećalo, ili crveni zaslon
otkrivaju da je skrivenu poruku.
Pa, idemo oponaša.
>> U Tko je uradio, ti si dao bitmap slike da izgleda vrlo točkicama i crvena,
a zatim pokrenuti Tko je uradio programa otkriti skrivenu poruku.
>> Tako ćemo razbiti to u koracima.
Prvo, želite otvoriti datoteku - trag da ti je dano.
I onda se stvoriti Presuda bitmap datoteke.
Zatim želite ažurirati bitmapa header informacije za presudu outfile.
Više o tome kasnije.
I onda ćeš čitati u trag, scanline, piksel po piksel,
mijenjanje piksela boje kao potrebno, i pisanje
onima u presudi -
piksel po piksel u Presuda scanline.
>> Kako ćemo početi doći do toga?
Pa, na svu sreću, imamo copy.c u distribucijskom koda.
A to će dokazati vrlo korisno za nas.
Copy.c otvara datoteku, navodi se u tom infile je zaglavlje, a zatim ažurira
outfile je header.
I onda čita svaki piksel scanline, piksel po piksel, a zatim
piše da je piksel u outfile.
>> Dakle, prvi korak bi mogao biti pokrenuti slijedeće
naredbu u terminal -
k.č. copy.c whodunit.c.
To će stvoriti kopiju copy.c zove whodunit.c.
Dakle, naš prvi korak za otvaranje file, dobro, tu je točna
replika da je u copy.c.
Dakle, ja ću vas ostaviti da pogledate kako.
>> Ono što imamo posla s ovim pset se file I / O, u osnovi uzimanje datoteke,
čitanje, pisanje, uređivanjem.
Kako ste prvi put otvorili datoteku?
Pa, što ćemo proglasiti datoteku pointer, a onda nazvati
Funkcija fopen.
Prolaze na putu, ili ime onoga datoteku, a zatim je način rada koji želite
otvoriti tu datoteku u.
Prolazak u r će otvoriti foo.bmp za čitanje.
Dok fopen u prolazu u W otvoren bar.bmp, za pisanje datoteku i
zapravo uređivanje.
>> Dakle, sada kada smo otvorili datoteku, naš Sljedeći korak je da se ažuriraju informacije u zaglavlju
za outfile.
Što je info header?
Pa, prvo moramo znati ono bitova.
Bitmap je samo jednostavan raspored bajtova.
I oni su proglasili u ovoj datoteci Ovdje, bmp.h, s gomilom
Informacije o tome što bitmapa zapravo je napravljena od.
No, ono što mi je stvarno stalo je header bitmap datoteka, upravo ovdje, a
bitmap info header, ovamo.
Zaglavlje se sastoji od nekoliko varijabli koje će se pokazati vrlo korisnim.
Tu je biSizeImage, koji je Ukupna veličina slike u bajtove.
A to uključuje i piksela i padding.
Postava je vrlo važno, ali ćemo kasnije vratiti na to.
>> BiWidth predstavlja širinu slike u pikselima minus padding.
BiHeight je onda i visina slike u pikselima.
A onda BITMAPFILEHEADER i BITMAPINFOHEADER, kao što sam spomenuo
ranije, oni su zastupljeni kao tvorevina.
Dakle, ne možete pristupiti datoteke zaglavlja Sama, ali ćete želite doći do
one varijable unutra.
>> OK.
Pa kako ćemo ažurirati informacije u zaglavlju?
Pa, prvo moramo vidjeti da li smo potrebno promijeniti bilo koje informacije iz
infile, trag, da se outfile, presuda.
Jesu li promjene u tom slučaju?
Pa, zapravo ne, jer ćemo da se samo mijenjaju boje.
Nećemo da se mijenja datoteku veličina, veličina slike, širina,
ili visina.
Dakle, ti si u redu za sada od strane samo kopiranje svaki piksel.
>> OK.
Tako sada pogledajmo koliko smo zapravo možete pročitati svaki piksel iz spisa.
Još jedan file I / O funkcija će doći u igru ​​-
fread.
Potrebno je u pokazivaču na struct koji će sadržavati bajtova koje
što čitate.
Pa što čitate u to.
I onda vam prođe u veličini, što je veličina svakog elementa koji
žele čitati.
Ovdje, funkcija sizeof će doći u ruci.
Tada ćete proći u broju, koji predstavlja broj elemenata
veličina čitati.
I onda napokon, inptr, što je file pointer koji ste
će čitati iz.
Dakle, svi ti elementi su unutar inptr i oni će podacima.
>> Pogledajmo malo primjer.
Ako želim čitati u podatkovnim dva psa, dobro, ne mogu to učiniti na jedan od dva načina.
I bilo možete pročitati u dva objekta veličine Pas iz mog inptr, ili mogu pročitati
u jedan objekt veličine dva psa.
Pa vidite da je, ovisno o načinu da li organizirati veličinu i broj, te
možete pročitati u istom broju bajtova.
>> Pa sad, idemo promijeniti piksela u boji kao što moramo.
Ako ponovno pogledate bmp.h, a zatim vidjet ćete da je na dnu
RGBTRIPLEs su drugi rekonstruirati gdje je oni su se sastojale od tri bajta.
Jedan, rgbtBlue, rgbtGreen i rgbtRed.
Dakle, svaki od njih predstavlja iznos plave, količina zelene i
Količina crvene unutar ove piksela, gdje svaki iznos koji je zastupao
heksadecimalni broj.
>> Dakle ff0000 će biti plave boje, jer ide od plave,
u zeleno, crveno.
I onda sve f-a će biti bijela.
Idemo pogledati smiley.bmp, koji imate u svom distribucijskom kodu.
Ako ga otvoriti u samo slike Gledatelj, onda ćete
samo vidjeti crveni smješka.
No, dublji zaron u, mi ćemo vidim da je struktura
od njega se samo piksela.
Imamo bijelih piksela, a zatim crvene piksela.
Bijeli, FFFFFF, a zatim sve crvene piksela sam obojena u za vas
ovdje, i vidjet ćete da su oni 0000FF.
Zero plava, zelena nula, i puna crvena.
A budući smiley je širok osam piksela, nemamo nikakvu podstavu.
U redu.
>> Dakle, ako su se dodijeliti različite vrijednosti na RGBTRIPLE i ja htjela
bude zelena, onda ono što ću učiniti je Ja bih izjaviti RGBTRIPLE, pod nazivom
trostruki, a zatim se pristupiti svaki Bajt unutar tog struct I.
će koristiti operator dot.
Dakle triple.rgbtBlue, ja mogu dodijeliti da na 0.
Zelena mogu dodijeliti full - bilo broj, zapravo, između 0 i FF.
I onda crveni, ja ću reći: 0..
Tako, dakle, da mi daje zeleno piksela.
>> Dalje, što ako želim provjeriti vrijednost nečega?
Mogao sam imati nešto što provjerava li trostruki je rgbtBlue vrijednost
ff a zatim print "Osjećam plava! ", kao rezultat.
Sada, to ne mora nužno značiti koji pixel je plava, zar ne?
Budući da je piksel je zelena i crvena vrijednosti mogao bi imati ne-0 vrijednosti.
Sve što to znači, a sve to to provjere je
za punu plavom bojom.
No, svi segmenti također može imati djelomičnu Vrijednosti boja, kao što su to
Sljedeći primjer ovdje.
>> To je malo teže vidjeti što se ova slika je sada.
To izgleda malo više kao clue.bmp da ćete dobiti.
Sada, fizički, što bi moglo riješiti, jer ima puno crvene, po
drži se crveni ekran na slici tako da su druge boje može se pojaviti.
Pa kako ćemo oponašati ovo sa c?
Pa, mogli bismo uklonili sve crveno iz slike u cijelosti.
I tako učiniti da bismo postaviti svaki Pixel crveni vrijednost na 0..
I tako je slika će izgledati malo malo kao što je ovaj, gdje nemamo crveno
god.
>> Možemo vidjeti skrivenu poruku o malo jasnije sada.
To je još jedan smješko.
Ili možda bismo mogli koristiti neku drugu metodu.
Možda bi se mogla identificirati sve crvene piksela -
to je, sve u piksela 0 plava, zelena 0 i 0 crvena -
i promijeniti one na bijelo.
I naša slika može izgledati nešto kao što je ovaj.
Malo lakše vidjeti.
>> Postoji mnogo drugih načina da se otkriju Tajna poruka, kao i,
bave manipulacije boji.
Možda možete koristiti jednu od metoda koje sam spomenuo gore.
A osim toga, možda želite kako bi se poboljšala neke boje
i dovesti one out.
>> Dakle, sada kada smo promijenili piksel u boji, uz samo mi treba da ih pisati
u na scanline, piksel po piksel.
A opet, da ćete želite da se osvrnemo da copy.c, ako niste kopirali
to je već, i pogled na fwrite funkcija, koji uzima podatke, pokazivač
na struct koji sadrži bajtova to čitaš iz, veličini
stavke, broj predmeta, a zatim outptr -
odredište tim dokumentima.
>> Nakon što ste napisali u pikselima, vi ćete Također morate pisati u padding.
Što je padding?
Pa, svaki rgbt piksela je tri bajta.
No, scanline za skenirana slika mora biti višekratnik od četiri bajta.
A ako je broj piksela nije višekratnik broja četiri, onda moramo dodati
nadopuna.
Padding samo zastupa 0s.
Dakle, kako ćemo pisati, ili pročitati ovo?
Pa, ispada da se ne mogu zapravo fread padding, ali možete
izračunati to.
>> U ovom slučaju, trag i presuda imaju istu širinu, tako
Podstava je isti.
I padding, kao što ćete vidjeti u copy.c, izračunava
s donjom formulom -
bi.biWidth puta sizeof (RGBTRIPLE) će daju nam koliko je bajtova BMP
ima u svakom retku.
Od tamo, modulos i oduzimanja s 4 može izračunati koliko
mnogi bajtova mora dodati da višekratnik broja bajtova na
svaki redak je četiri.
>> Sada kada imamo formulu za koliko padding trebamo, sada
možemo to napisati.
Sad, što sam spomenuo prije, padding je samo 0s.
Dakle, u tom slučaju, mi samo stavljajući ugljen koji se u ovom slučaju 0, u našem
outptr - naš outfile.
Tako da samo može biti fputc 0, zarez outptr.
>> Dakle, dok sam čitao u našu file, file I / O je pratila naše
položaj u tim dokumentima s nečim zove Pokazivač položaja sliku.
Razmislite o tome kao kursora.
Uglavnom, što je napredak svaki put da smo fread, ali imamo
kontrolu nad njim, previše.
>> Da biste pomaknuli pokazivač pozicije sliku, možete koristiti funkciju fseek.
Gdje inptr predstavlja datoteku pokazivač da traze u,
Iznos je broj bajtova koje želite pomicanje kursora, a zatim iz
odnosi se referentne točke od tamo gdje je kursor.
Ako prođe u SEEK_CUR, da predstavlja struje
Pozicija u spisu.
Ili možete koristiti i neke druge parametre.
Dakle, možda bismo željeli koristiti fseek preskočiti preko padding u u datoteku.
I opet, ako ste zapeli, postoji primjer da je u copy.c.
>> Dakle, sada smo otvorili datoteku, trag, a presuda.
Mi smo ažurirali informacije zaglavlja za naša presuda, jer je svaki
bitmapa treba zaglavlje.
Mi smo tada sam pročitao u trag a scanline, piksel po piksel, mijenjanje
svaka boja ako je potrebno, i pisanje onima u
Presuda, piksela po pikselu.
Nakon što otvorite presudu, možete vidjeti tko krivac, ili ono što je tajna
Poruka je.
Moje ime je Zamyla, a ovo je detektivski roman.