[MUSIC nagpe-play] ZAMYLA Chan: Ito ay Miss Scarlett sa kandelero. Sinong may kagagawan? Well, kami ay pagpunta upang malaman. Sa board game na bakas, maaari mong ay bibigyan ng isang pisikal na pula imahe. At ang imaheng iyon ay napaka-pula at batik-batik, at ang iyong trabaho ay upang ipakita ang nakatagong mensahe. At kadalasan ka ibinigay na may pulang magnifying glass, o isang red screen upang magbunyag na nakatago mensahe. Well, kami ay pagpunta sa gayahin iyon. Sa sinong may kagagawan, bibigyan ka ng bitmap imahe na mukhang napaka-batik-batik at pula, at pagkatapos ay patakbuhin ang programa sinong may kagagawan upang ipakita ang isang nakatagong mensahe. Kaya sabihin masira ito sa mga hakbang. Una, gusto mong buksan ang file - ang bakas na iyong binigyan. At pagkatapos ay ring lumikha ng isang pasya ng hurado bitmap file. Pagkatapos nais mong i-update ang bitmap header ng impormasyon para sa pasya ng hurado outfile. Higit sa na mamaya. At pagkatapos ka ng pagpunta sa basahin sa bakas, scanline, pixel sa pamamagitan ng pixel, pagbabago ng mga kulay pixel na bilang kinakailangan, at pagsusulat mga papunta sa hatol ng hurado - pixel sa pamamagitan ng pixel sa pasya ng hurado scanline. Paano kami magsimula ng pagpunta tungkol dito? Well, sa kabutihang-palad, mayroon kaming copy.c sa code sa pamamahagi. At ito ay pagpunta upang patunayan medyo kapaki-pakinabang sa amin. Copy.c nagbukas ng file, bumabasa sa na header infile, at pagkatapos ay i-a-update ng header outfile ni. At pagkatapos ay bumabasa nito sa bawat pixel sa scanline, pixel sa pamamagitan ng pixel, at pagkatapos ay writes na pixel sa outfile. Kaya, ang iyong unang hakbang lakas maging upang patakbuhin ang sumusunod na utos sa terminal - CP copy.c whodunit.c. Ito ay bubuo ng isang kopya ng copy.c pinangalanang whodunit.c. Kaya aming mga unang hakbang upang buksan ang file, mahusay, mayroong isang eksaktong katulad ng na sa copy.c. Kaya kukunin ko na umalis na tumingin sa na. Ano kami ay pakikitungo sa sa ito PSET ay file I / O, isa lamang ang pagkuha ng mga file, pagbasa, pagsulat, pag-edit ng mga ito. Paano mo munang buksan ang isang file? Well, ikaw ay pagpunta na idedeklara ng isang file pointer, at pagkatapos ay tumawag sa iyo ang function na fopen. Dumaan sa path, o ang pangalan ng na mag-file, at pagkatapos ay ang mode na gusto mong mabuksan ang file na in Pasadong sa isang r ay magbubukas foo.bmp para sa pagbabasa. Sapagkat fopen sa pagpasa sa isang w habilin bukas bar.bmp, para sa pagsusulat ng mga file at talaga ang pag-edit ito. Kaya ngayon na binuksan namin ang file, ang aming susunod na hakbang ay upang i-update ang impormasyon ng header para sa outfile. Ano ang isang impormasyon ng header? Well, kailangan muna naming malaman kung ano ang isang bitmap ay. Ang isang bitmap ay isang simpleng lamang pag-aayos ng bytes. At ang mga ito ay ipinahayag sa file na ito dito, bmp.h, may isang bungkos ng impormasyon ng kung ano ang isang bitmap ay aktwal na ginawa sa labas ng. Ngunit ano ba talagang pakialam namin tungkol sa ay ang Header ng bitmap file, dito mismo, at ang bitmap header ng impormasyon, sa paglipas dito. Ang header ay binubuo ng isang pares ng mga mga variable na iyon ay patunayan napaka kapaki-pakinabang. May biSizeImage, kung saan ay ang kabuuang sukat ng imahe sa bytes. At ito ay kasama ang mga pixel at padding. Padding ay napakahalaga, ngunit susuriin namin na sa ibang pagkakataon. BiWidth kumakatawan sa lapad ng mga larawan sa pixels minus ang padding. Pagkatapos BiHeight ding ang taas ng larawan sa pixels. At pagkatapos ay ang BITMAPFILEHEADER at ang BITMAPINFOHEADER, bilang ko nabanggit mas maaga, ang mga ay kinakatawan bilang structs. Kaya, hindi mo ma-access ang header na file mismo, ngunit magkakaroon ka ng gusto upang makakuha ng sa mga variable sa loob. OK. Kaya paano ko i-update namin ang impormasyon ng header? Well, mayroon muna naming makita kung kami kailangan upang baguhin ang anumang impormasyon mula sa ang infile, ang bakas, upang ang outfile, ang pasya ng hurado. Pagbabago ba ang anumang bagay sa kasong ito? Well, hindi talaga, dahil kami ay pagpunta na lang ang pagbabago ng kulay. Hindi namin pagpunta sa ma-pagbabago ng file laki, ang laki ng imahe, ang lapad, o ang taas. Kaya ikaw ay ang lahat ng karapatan para sa ngayon sa pamamagitan ng pagkopya lang sa bawat pixel. OK. Kaya tingnan natin kung paano namin talaga ngayon hayaan maaaring magbasa ng bawat pixel mula sa file. Ang isa pang I / O function na file ay darating sa pag-play - fread. Itong tumatagal sa isang pointer sa struct na maglalaman ng mga bytes na binabasa mo. Kaya binabasa mo sa na. At pagkatapos mong pumasa sa isang sukat, na kung saan ay ang laki ng bawat elemento na nais na basahin. Dito, ang pag-andar sizeof ay darating sa madaling-gamiting. Pagkatapos ay pumasa ka sa numero, na kumakatawan sa bilang ng mga elemento ng ang laki na basahin. At pagkatapos ay sa wakas, inptr, na ang file pointer na ikaw ay pagpunta sa basahin mula sa. Kaya lahat ng mga elementong iyon ay sa loob inptr at sila ay pagpunta sa data. Tingnan natin ang isang maliit na halimbawa. Kung gusto kong basahin sa data ng dalawang aso, well, ang maaari kong gawin ito sa isa sa dalawang paraan. Maaari ko alinman basahin sa dalawang bagay ng laki aso mula sa aking inptr, o maaari akong magbasa sa isa sa bagay ang laki ng dalawang aso. Kaya nakikita mo na depende sa paraan na magsagawa ka laki at numero, mo maaaring makabasa sa parehong bilang ng mga byte. Ngayon Kaya, ni baguhin hayaan ang Kulay ng pixel bilang kailangan namin. Kung tumingin ka sa bmp.h muli, pagkatapos ay makikita mo na sa ibaba RGBTRIPLEs ay isa pang struct, kung saan ang mga ito ay binubuo ng tatlong bytes. Ang isa, rgbtBlue, rgbtGreen, at rgbtRed. Kaya bawat isa sa mga kumakatawan sa halaga ng asul, ang halaga ng berde, at ang halaga ng pulang loob ito pixel, kung saan ang bawat halaga ay kinakatawan ng isang hexadecimal numero. Kaya ff0000 ay magiging isang asul kulay, dahil ito napupunta mula sa bughaw, sa kulay berde, sa pula. At pagkatapos ang lahat ng f ay magiging puti. Hayaan ang kumuha ng isang pagtingin sa smiley.bmp, na mayroon ka sa iyong pamamahagi code. Kung buksan mo ito sa loob lamang ng isang imahe viewer, pagkatapos ikaw ay makita lamang ang isang pulang SMILEY. Ngunit pagkuha ng mas malalim na dive in, kami ay makita na ang istraktura ng ito ay isa lamang pixels. Mayroon kaming puti pixel, at pagkatapos ay pulang pixels. Ang puti, FFFFFF, at pagkatapos ang lahat ng mga pulang pixels ko ang kulay para sa iyo dito, at makikita mo na ang mga ito ay 0000ff. Zero asul, berde zero, at ang buong pula. At dahil SMILEY ay walong pixel na lapad, wala kaming anumang mga padding. Ayos lang. Kaya kung ako ay upang magtalaga ng iba't ibang mga halaga sa isang RGBTRIPLE at Nais kong gawin itong green, pagkatapos ay kung ano ang nais kong gawin ay Gusto ko magpahayag ng isang RGBTRIPLE, pinangalanan triple, at pagkatapos ay i-access ang bawat byte loob na struct ko maaaring gamitin ang tuldok operator. Kaya triple.rgbtBlue, maaari ko magtalaga na sa 0. Green ako maaaring italaga ito upang ganap na - sa anumang numero, talaga, sa pagitan ng 0 at ff. At pagkatapos ay pula, pupuntahan ko din ang masasabi 0. Kaya pagkatapos na nagbibigay sa akin ng isang kulay berdeng pixel. Susunod, paano kung gusto kong i-check ang halaga ng isang bagay? Kaya kong magkaroon ng isang bagay na sumusuri kung rgbtBlue halaga ang triple ay ff at pagkatapos ay i-print, "Sinusuwerte ako asul! ", bilang isang resulta. Ngayon, na hindi kinakailangang mangahulugan na ang pixel ay asul, tama? Dahil ang berde at pulang mga halaga ng pixel ni maaari ding magkaroon ng mga di-0 na mga halaga. Ang lahat na ito ay nangangahulugan na, at lahat na ito ay para sa pagsuri ay para sa buong bughaw na kulay. Ngunit ang lahat ng mga pixel maaari ring magkaroon ng bahagyang mga halaga ng kulay, tulad nito susunod na halimbawa dito. Ito ay isang maliit na mas mahirap na makita kung ano ang imahe ay ngayon. Mukhang Medyo mas katulad ng ito clue.bmp na bibigyan ka. Ngayon, pisikal, maaari mong malutas ito, dahil mayroong ng maraming pula, sa pamamagitan ng humahawak up ng isang pulang screen sa larawan sa gayon na ang iba pang mga kulay ay maaaring lumitaw. Kaya paano ko gayahin namin ito kasama c? Well, maaari naming alisin ang lahat ng mga pulang mula sa imahe ganap. At kaya bang gawin iyon gusto itinakda namin ang bawat pula halaga ng pixel upang 0. At nito ay ang imahen na hitsura ng kaunti bit na tulad nito, kung saan mayroon kaming walang pula kahit ano pa man. Maaari naming makita ang mga nakatagong isang mensahe malinaw na kaunti ang nalalaman ngayon. Ito ay isa pang SMILEY mukha. O siguro na maaari kaming gumamit ng ibang pamamaraan. Siguro, maaari naming kilalanin lahat ng mga pulang pixels - iyon ay, ang lahat ng mga pixel sa 0 asul, 0 berde, at pulang 0 - at baguhin ang mga sa puti. At ang aming larawan ay maaaring tumingin isang bagay na katulad nito. Ang isang maliit na bit mas madaling makita. Mayroong maraming iba pang mga paraan upang alisan ng takip ang lihim na mensahe pati na rin, pagharap sa mga pagmamanipula ng kulay. Siguro maaari mong gamitin ang isa sa mga pamamaraan sa na nabanggit ko sa itaas. At Bukod pa rito, maaaring gusto upang mapahusay ang ilang mga kulay at dalhin ang mga out. Kaya ngayon na nagbago na namin ang pixel kulay, susunod kailangan lang namin isulat ang mga ito in sa scanline, pixel sa pamamagitan ng pixel. At pa ulit, makikita mo gusto upang tumingin pabalik sa copy.c, kung hindi mo pa nakopya ito nagagawa, at tumingin sa fwrite function, na kumukuha ng data, ang isang pointer sa struct na naglalaman ng mga byte na binabasa mo mula sa, ang laki ng ang mga item, ang bilang ng mga item, at pagkatapos ay ang outptr - ang patutunguhan ng mga file na iyon. Pagkatapos mong isulat sa pixels, makakakuha ka Mayroon din na magsulat sa padding. Ano ang padding? Well, ang bawat rgbt pixel ay tatlong bytes mahaba. Ngunit, ang scanline para sa isang bitmap imahe ay dapat na multiple ng apat na bytes. At kung ang bilang ng mga pixels ay hindi isang maramihang ng apat na, pagkatapos ay kailangan namin upang magdagdag ng ito padding. Padding ay lamang na kinakatawan ng 0s. Kaya, paano ko isulat namin, o basahin ito? Well, ito ay lumiliko out na hindi mo magagawa talaga fread padding, ngunit maaari kang kalkulahin ito. Sa kasong ito, ang bakas at ang hatol ng hurado magkaroon ng parehong lapad, kaya ang padding ay pareho. At ang padding, pati na makikita mo sa copy.c, ay kinakalkula may formula sa ibaba - bi.biWidth beses sizeof (RGBTRIPLE) habilin bigyan kami ng kung gaano karaming mga byte ang bmp May sa bawat hilera. Mula doon, ang modulos at subtractions na may 4 na maaaring kalkulahin kung paano dapat na idinagdag maraming mga byte upang ang ang maramihang ng bytes sa bawat hilera ay apat. Ngayon na mayroon kami ang formula para sa kung magkano ang padding namin kailangan, ngayon maaari naming isulat ito. Ngayon, nabanggit ko bago, padding lamang ang 0s. Kaya sa kasong iyon, kami ay lamang ng paglalagay isang pansamantalang trabaho, sa kasong ito ng 0, sa aming outptr - ang aming outfile. Sa gayon ay maaari lamang maging fputc 0, kuwit outptr. Kaya, habang nagsi-pagbabasa namin sa aming file, file I / O ay pinananatiling track ng aming posisyon sa mga file na iyon na may isang bagay tinatawag na tagapagpahiwatig posisyon file. Isipin ito bilang isang cursor. Talaga, paglago nito sa tuwing na namin fread, ngunit mayroon kaming ng kontrol sa ito, masyadong. Upang ilipat ang tagapagpahiwatig posisyon file, maaari mong gamitin ang pag-andar fseek. Saan ang inptr ay kumakatawan sa mga file pointer na naghahanap ka sa, ang halaga ay ang bilang ng mga byte na sa iyo nais upang ilipat ang cursor, at pagkatapos ay mula sa na nauugnay sa mga reference point mula sa kung saan ang iyong cursor ay. Kung pumasa ka sa SEEK_CUR, na ay kumakatawan sa kasalukuyang posisyon sa file. O maaari mong gamitin ang ilang mga iba pang mga parameter. Kaya, maaari naming nais na gumamit ng fseek upang laktawan sa ibabaw ng padding ng file sa. At muli, kung ikaw ay natigil, mayroong isang halimbawa ng na sa copy.c. Kaya ngayon binuksan na namin ang file, ang tanda, at ang hatol ng hurado. Na-update namin ang header impormasyon para sa ang aming pasya ng hurado, dahil bawat bitmap na ay nangangailangan ng header. Pagkatapos ay nabasa namin sa mga bakas ng scanline, pixel sa pamamagitan ng pixel, pagbabago bawat kulay bilang kinakailangan, at pagsusulat ng mga papunta sa pasya ng hurado, pixel sa pamamagitan ng pixel. Sa sandaling binuksan mo ang pasya ng hurado, maaari mong makita kung sino ang salarin, o kung ano ang lihim mensahe ay. Ang pangalan ko ay Zamyla, at ito ay sinong may kagagawan.