[MIZIK jwe] ZAMYLA Chan: Li te Miss Scarlett ak lanp sèt branch lan. Whodunit? Oke, nou ap ale nan jwenn deyò. Nan siy lan tablo jwèt, ou ta ka ap bay yon imaj fizik wouj. Epi ki imaj se yon bagay ki wouj ak Enkonplè, ak travay ou se yo revele mesaj la kache. Epi anjeneral ou ap bay ak yon wouj loup, papye, oswa yon ekran wouj nan revele ke mesaj kache. Oke, nou ap ale nan imite sa a. Nan whodunit, w ap bay yon imaj bitmap ki sanble trè Enkonplè ak wouj, ak Lè sa a, kouri pwogram nan whodunit revele yon mesaj kache. Se konsa, kite a kraze sa a nan etap. Premyèman, ou vle ouvri dosye a - siy la ke ou ve yo te bay yo. Lè sa a, tou kreye yon dosye vèdik bitmap. Lè sa a, ou vle mete bitmap la header info pou outfile la vèdik. Plis sou sa pita. Lè sa a, w ap ale nan li nan la siy, scanline, pixel pa pixel, chanje koulè yo pixel kòm nesesè, ak ekri moun ki nan vèdik la - pixel pa pixel nan la vèdik scanline. Ki jan nou kòmanse ale sou sa a? Oke, Chans pou, nou gen copy.c nan kòd la distribisyon. Lè sa a ki pral pwouve byen itil nan nou. Copy.c louvri yon dosye, li nan ki header infile a, epi Lè sa a, dènye nouvèl sou header outfile la. Lè sa a, li li chak pixel nan la scanline, pixel pa pixel, ak Lè sa a, ekri ki pixel nan outfile la. Se konsa, premye etap ou ka gen nan kouri sa ki annapre yo lòd nan tèminal la - CP copy.c whodunit.c. Sa a pral kreye yon kopi copy.c yo te rele whodunit.c. Se konsa, premye etap nou yo louvri nan dosye, byen, gen nan yon egzak kopi nan ke nan copy.c. Se konsa, mwen pral kite ou fè yon gade nan sa. Ki sa nou ap fè fas ak nan PSET sa a se dosye Mwen / O, fondamantalman pran dosye, lekti, ekriti, koreksyon yo. Ki jan ou fè premye louvri yon dosye? Oke, w ap ale nan deklare yon dosye konsèy, ak Lè sa a, ou rele a fonksyon fopen. Pase nan chemen an, oswa non an nan ki pote, ak Lè sa a, mòd nan ke ou vle yo louvri ke dosye pous Pase nan yon r yo ap louvri foo.bmp pou lekti. Lè nou konsidere ke fopen ak pase nan yon W ap louvri bar.bmp, pou ekri dosye a ak aktyèlman koreksyon li. Se konsa, kounye a ke nou te louvri dosye a, nou pwochen etap la se nan aktyalizasyon enfòmasyon sou a header pou outfile la. Ki sa ki nan yon info header? Oke, premye nou bezwen konnen ki sa yon bitmap se. Yon bitmap se jis yon senp aranjman nan bytes. Apre sa, yo ap deklare nan sa a ranpli isit la, bmp.h, ak yon pakèt moun sou enfòmasyon nan sa ki yon bitmap se aktyèlman te fè soti nan. Men, sa ki nou reyèlman sousye de se la dosye bitmap header, dwa isit la, ak info bitmap lento a, sou isit la. Se header nan ki konpoze de yon koup la varyab ki pwal pwouve ke trè itil. Gen biSizeImage, ki se nan gwosè manm nan imaj la nan bytes. Lè sa a gen ladan piksèl ak pwotèj. Ranbouraj trè enpòtan, men nou pral jwenn ak sa yo ki pita. BiWidth reprezante lajè a nan la imaj nan piksèl mwens padding la. BiHeight se lè sa a tou wotè a nan imaj la nan piksèl. Lè sa a, BITMAPFILEHEADER a ak nan BITMAPINFOHEADER, kòm mwen mansyone pi bonè, sa yo ki ap reprezante kòm strukt. Se konsa, ou pa ka jwenn aksè lento a dosye tèt li, men ou pral vle pou li ale nan sa yo varyab anndan an. OK. Se konsa, ki jan nou mete enfòmasyon sou a header? Oke, premye nou gen yo wè si wi ou non nou bezwen chanje nenpòt enfòmasyon ki soti nan infile a, siy la, nan la outfile, vèdik la. Eske gen kichòy ki chanje nan ka sa a? Oke, pa aktyèlman, paske nou pral yo dwe jis chanje koulè yo. Nou pa pwal yo dwe chanje dosye a gwosè, gwosè a imaj, lajè a, oswa wotè an. Se konsa, w ap tout dwa pou kounye a pa jis kopye chak pixel. OK. Se konsa, kounye a kite a gade nan ki jan nou aktyèlman ka li chak pixel nan dosye a. Yon lòt Mwen / fonksyon O dosye pral antre nan jwe - frèd. Li pran nan yon konsèy konstri la ki pral gen bytes yo ki w ap li. Se konsa, ou ap li nan sa. Lè sa a, ou pase nan yon gwosè, ki se gwosè a nan chak eleman ke ou vle li. Isit la, sizof an fonksyon ap vini an sou la men. Lè sa a, ou pase nan nimewo, ki reprezante kantite eleman nan gwosè li. Lè sa a, finalman, inptr, ki se konsèy la dosye ke w ap pral li nan. Se konsa, tout nan eleman sa yo se andedan inptr epi yo ap ale nan done. Se pou yo gade nan yon ti kras egzanp. Si m 'vle li nan done de chen, byen, mwen kapab fè li se youn nan de fason. Mwen ka swa li nan de bagay ki gen gwosè chen ki soti nan inptr m 'yo, oswa mwen ka li nan yon sèl objè gwosè a nan de chen. Se konsa, ou wè ke depann sou wout la ke ou fè aranjman pou gwosè ak nimewo, ou ka li nan menm kantite bytes. Se konsa, koulye a, se pou yo chanje a koulè pixel kòm nou bezwen. Si ou gade nan bmp.h ankò, Lè sa a, ou ap wè ke nan pati anba a RGBTRIPLEs yo se yon lòt konstri, kote yo ap konpoze de twa bytes. Yon sèl, rgbtBlue, rgbtGreen, ak rgbtRed. Se konsa, chak nan sa yo reprezante kantite lajan an nan ble, kantite lajan an nan vèt, ak nan kantite lajan pou wouj andedan pixel sa a, kote se chak kantite lajan reprezante pa yon ekzadesimal nimewo. Se konsa, ff0000 pral gen yon koulè ble, paske li ale soti nan ble, a vèt, nan wouj. Lè sa a, tout nan f yo pral blan. Se pou nou pran yon gade nan smiley.bmp, ki ou gen nan Kòd distribisyon ou. Si ou louvri li nan jis yon imaj visualiseur, lè sa a ou pral jis wè yon Smiley wouj. Men, pran yon plonje pi fon nan, nou pral wè ke estrikti a nan li se jis piksèl. Nou gen piksèl blan, ak Lè sa a piksèl wouj. Blan a, fff, ak Lè sa a, tout moun nan nan piksèl wouj mwen te ki gen koulè pal nan pou ou isit la, epi ou wè ke yo ap 0000ff. Zewo ble, zewo vèt, ak tout wouj. E depi Smiley se uit piksèl lajè, nou pa gen okenn pwotèj. Tout dwa. Se konsa, si m 'te bay elèv yo valè diferan nan yon RGBTRIPLE epi mwen te vle fè li vèt, Lè sa a, ki sa mwen ta fè se Mwen ta deklare yon RGBTRIPLE, yo te rele trip, ak Lè sa a, jwenn aksè nan chak multiple nan ki konstri mwen ta sèvi ak operatè a dot. Se konsa, triple.rgbtBlue, mwen kapab bay ki a 0. Green mwen ka bay li nan plen - nenpòt nimewo, reyèlman, ant 0 ak ff. Lè sa a, wouj, mwen tou pral di 0. Se konsa, Lè sa a, ki bay m 'yon pixel vèt. Apre sa, E si mwen vle tcheke valè a nan yon bagay? Mwen te kapab gen yon bagay ki cheke si wi ou non rgbtBlue valè trip la se ff ak Lè sa a, ekri ak lèt ​​detache, "mwen santi m ble! ", kòm yon rezilta. Koulye a, ki pa nesesèman vle di ki pixel a se ble, dwa? Paske vèt ak wouj valè pixel nan te kapab gen ki pa Peye-0 valè tou. Tout sa ki sa sa vle di, ak tout sa ki sa a se tcheke pou se pou yon koulè plen ble. Men, tout piksèl te kapab gen yon pati nan tou valè koulè po yo, tankou sa a pwochen egzanp isit la. Li se yon ti kras pi difisil yo wè sa imaj sa a se kounye a. Sa a parèt yon ti jan pi plis tankou nan clue.bmp ke ou pral bay yo. Koulye a, fizikman, ou ta ka rezoud sa a, paske gen nan yon anpil nan wouj, pa kenbe moute yon ekran wouj nan imaj la Se konsa, ki koulè yo lòt ka parèt. Se konsa, ki jan nou imite sa a ak c? Oke, nou ta ka retire tout wouj soti nan imaj la nèt. Se konsa, fè sa nou ta mete chak valè wouj pixel nan a 0. Se konsa, imaj la ta gade yon ti kras ti jan tankou sa a, kote nou pa gen okenn wouj tou. Nou ka wè mesaj kache yon an ti kras pi plis byen klè kounye a. Li nan yon lòt figi Smiley. Oswa petèt nou te ka itilize yon lòt metòd. Petèt, nou ta kapab idantifye tout piksèl yo wouj - se sa ki, tout nan piksèl yo ak 0 ble, 0 vèt, ak 0 wouj - ak chanje sa yo ak blan. Apre sa, pòtre ak nou ta ka gade yon bagay tankou sa a. Yon ti kras pi fasil yo wè. Gen anpil bagay nan lòt fason yo kapab dekouvwi mesaj sekrè a kòm byen, fè fas ak manipilasyon a koulè. Petèt ou ta ka sèvi ak youn nan metòd yo ke mwen mansyone pi wo a. Apre sa, Anplis de sa, ou ta ka vle amelyore kèk koulè epi pote yo deyò. Se konsa, kounye a ke nou te chanje pixel nan koulè po yo, pwochen nou jis bezwen ekri yo a nan scanline a, pixel pa pixel. Men, ankò, ou pral vle tounen gade dèyè copy.c, si ou pa gen kopye li deja, epi gade nan fwrite la fonksyon, ki te pran done, yon konsèy konstri an ki gen bytes la ke w ap lekti soti nan, gwosè a nan atik yo, ki kantite atik, ak Lè sa a, outptr la - destinasyon an nan tout sa yo dosye. Apre ou fin ekri nan piksèl la, ou ap yo te genyen tou yo ekri nan padding la. Ki sa ki se padding? Oke, chak pixel rgbt se twa bytes lontan. Men, scanline a pou yon imaj bitmap te gen yon miltip nan kat bytes. Men, si ki kantite piksèl se pa yon plizyè nan kat, lè sa a nou bezwen ajoute sa a pwotèj. Ranbouraj se jis reprezante pa 0s. Se konsa, ki jan nou ekri, oswa li sa a? Oke, li vire soti ke ou pa kapab aktyèlman frèd padding, men ou kapab kalkile li. Nan ka sa a, siy la ak vèdik la gen lajè a menm, se konsa a padding se menm bagay la. Ak ogmantasyon an, menm jan ou ap wè nan copy.c, se kalkile ak fòmil ki anba a - bi.biWidth fwa sizof (RGBTRIPLE) pral ban nou ki jan anpil bytes BMP la gen nan chak ranje. Soti nan la, modulos yo ak soustraksyon ak 4 ka kalkile ki jan anpil bytes yo dwe ajoute pou ke plizyè a nan bytes sou chak ranje se kat. Koulye a, ke nou gen fòmil pou konbyen padding nou bezwen, kounye a nou ka ekri li. Koulye a, mwen mansyone anvan, padding se jis 0s. Se konsa, nan ka sa a, nou ap jis mete yon karaktè, nan ka sa a yon 0, nan nou an outptr - outfile nou an. Se konsa, ki ka jis pou fputc 0, vigil outptr. Se konsa, pandan ke nou ve yo te li nan nou an ranpli, dosye mwen / O te kenbe tras nan nou an pozisyon nan sa yo dosye ak yon bagay rele endikatè ki pozisyon dosye-a. Panse a li kòm yon kurseur. Fondamantalman, li avans chak fwa ke nou frèd, men nou gen kontwòl sou li, tou. Pou avanse pou pi endikatè ki pozisyon ranpli, ou ka sèvi ak fik an fonksyon. Ki kote inptr a reprezante dosye a konsèy ke w ap chèche nan, nan kantite lajan se kantite bytes ke ou vle pou avanse pou pi kurseur a, ak Lè sa a, soti nan gen rapò ak pwen nan referans ki soti nan kote kurseur ou a. Si ou pase nan SEEK_CUR, ki reprezante aktyèl la pozisyon nan dosye a. Oswa ou ka sèvi ak kèk paramèt ak lòt. Se konsa, nou ta ka vle itilize fik sote sou padding a nan dosye a nan. Epi ankò, si w ap kole, gen nan yon egzanp ki nan copy.c. Se konsa, kounye a nou te louvri dosye a, siy la, ak vèdik la. Nou te mete ajou enfòmasyon sou a header pou vèdik nou yo, paske chak bitmap bezwen yon header. Nou te Lè sa a, li antre nan la nan siy scanline, pixel pa pixel, chanje, chak koulè jan sa nesesè, ak ekri sa yo nan la vèdik, pixel pa pixel. Yon fwa ou louvri vèdik, ou ka wè ki moun ki koupab la, oswa sa ki sekrè a mesaj se. Non mwen se Zamyla, ak sa a te whodunit.