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