[Music kucheza] ZAMYLA CHAN: Ilikuwa Miss Scarlett na kinara. Whodunit? Naam, tunakwenda kujua. Katika mchezo wa bodi kidokezo, huenda kupewa kimwili nyekundu picha. Na picha kwamba ni nyekundu sana na spotty, na kazi yako ni yatangaza ujumbe siri. Na kwa kawaida wewe ni zinazotolewa na nyekundu magnifying kioo, au screen nyekundu yanaonyesha kwamba ujumbe siri. Naam, tunakwenda kuiga hiyo. Katika whodunit, wewe ni kupewa bitmap picha kwamba inaonekana spotty sana na nyekundu, na kisha kuendesha programu whodunit kudhihirisha ujumbe wa siri. Basi hebu kuvunja hii katika hatua. Kwanza, unataka kufungua faili - kidokezo kwamba tumekuwa huo. Na kisha pia kujenga uamuzi bitmap file. Kisha unataka update bitmap header info kwa ajili ya uamuzi outfile. Zaidi juu ya baadaye. Na kisha utaenda kusoma katika kidokezo, scanline, pixel kwa pixel, kubadilisha rangi pixel kama muhimu, na kuandika wale katika uamuzi - pixel kwa pixel katika uamuzi scanline. Je, sisi kuanza kwenda kuhusu hili? Naam, bahati, tuna copy.c katika usambazaji code. Na hii ni kwenda kuthibitisha muhimu kabisa kwetu. Copy.c kufungua faili, wasomaji katika infile ya kichwa, na kisha updates header outfile ya. Na kisha wasomaji kila pixel katika scanline, pixel kwa pixel, na kisha anaandika kwamba pixel katika outfile. Hivyo, hatua yako ya kwanza nguvu kuwa na kukimbia zifuatazo amri katika terminal - cp copy.c whodunit.c. Hii itakuwa kujenga nakala ya copy.c jina lake whodunit.c. Hivyo hatua yetu ya kwanza kufungua file, vizuri, kuna halisi replica ya kwamba katika copy.c. Basi, mimi itabidi kuondoka kwa kuangalia kwamba. Nini sisi ni kushughulika na katika pset hii ni file I / O, kimsingi kuchukua files, kusoma, kuandika, editing yao. Jinsi gani unaweza kwanza kufungua faili? Naam, wewe ni kwenda kutangaza file pointer, na kisha wewe piga kazi fopen. Kupita katika njia, au jina la faili, na kisha mode kwamba unataka kufungua faili kwamba in Kupita katika r itafungua foo.bmp kwa ajili ya kusoma. Wakati fopen na kupita katika w mapenzi bar.bmp wazi, kwa ajili ya kuandika file na kweli editing yake. Hivyo sasa kwamba tumekuwa kufunguliwa faili, yetu Hatua ya pili ni update header info kwa outfile. Nini header info? Naam, kwanza tunahitaji kujua nini bitmap ni. bitmap ni rahisi tu mpangilio wa ka. Na wao ni alitangaza katika faili hii hapa, bmp.h, pamoja na kundi la habari ya nini bitmap ni kweli alifanya nje ya. Lakini nini sisi kweli huduma ya juu ni bitmap file header, hapa, na bitmap info header, zaidi ya hapa. header ni linajumuisha ya wanandoa wa vigezo ambayo kuthibitisha muhimu sana. Kuna biSizeImage, ambayo ni jumla ukubwa wa picha katika bytes. Na hii ni pamoja na saizi na padding. Padding ni muhimu sana, lakini tutaweza kupata baadaye. BiWidth inawakilisha upana wa picha katika saizi minus padding. BiHeight ni kisha pia urefu ya picha katika saizi. Na kisha BITMAPFILEHEADER na BITMAPINFOHEADER, kama nilivyoeleza mapema, wale kuwakilishwa kama structs. Kwa hiyo, huwezi kupata file header yenyewe, lakini utasikia wanataka kupata vigezo wale walio ndani ya. OK. Hivyo ni jinsi gani sisi update header info? Naam, kwanza tuna ili kuona kama sisi haja ya kubadili taarifa yoyote kutoka infile, habari, kwa outfile, uamuzi. Ni kitu chochote kubadilisha katika kesi hii? Naam, si kweli, kwa sababu tunakwenda kuwa tu kubadilisha rangi. Sisi siyo kwenda kuwa kubadilisha faili ukubwa, ukubwa wa picha, upana, au urefu. Basi, wewe ni sawa kwa sasa na tu kuiga kila pixel. OK. Hivyo sasa hebu tuangalie jinsi sisi kweli unaweza kusoma kila pixel kutoka faili. File mwingine I / O kazi ataingia ndani ya kucheza - fread. Inachukua katika pointer kwa struct ambayo yana ka kwamba wewe ni kusoma. Hivyo wewe ni kusoma katika hiyo. Na kisha kupita katika kawaida, ambayo ni ukubwa wa kila hiki kwamba unataka kusoma. Hapa, kazi sizeof atakuja katika Handy. Kisha kupita katika idadi, ambayo inawakilisha idadi ya mambo ya ukubwa kusoma. Na kisha hatimaye, inptr, ambayo ni file pointer kwamba wewe ni kwenda kusoma kutoka. Basi wote wa mambo hayo ni ndani ya inptr na wao wanaenda data. Hebu tuangalie mfano kidogo. Kama mimi nataka kusoma katika data mbwa wawili, vizuri, siwezi kufanya ni moja ya njia mbili. Mimi unaweza ama kusoma katika vitu viwili wa kawaida mbwa kutoka inptr yangu, au naweza kusoma katika moja kitu ukubwa wa mbwa wawili. Hivyo unaweza kuona kwamba kulingana na njia kwamba kupanga ukubwa na idadi, wewe unaweza kusoma katika idadi sawa ya ka. Hivyo sasa, hebu kubadili pixel rangi kama tunahitaji. Kama ukiangalia bmp.h tena, basi utaona kwamba chini RGBTRIPLEs ni struct nyingine, ambapo wao ni zikiwemo ya ka tatu. Moja, rgbtBlue, rgbtGreen, na rgbtRed. Hivyo kila moja ya haya inawakilisha kiasi rangi ya bluu, kiasi cha kijani, na kiasi cha nyekundu ndani ya pixel hii, ambapo kila kiasi ni kuwakilishwa na hexadesimoli idadi. Hivyo ff0000 itakuwa rangi ya bluu, kwa sababu inakwenda kutoka bluu, ya kijani, na nyekundu. Na kisha wote f itakuwa nyeupe. Hebu tuangalie smiley.bmp, ambayo una katika usambazaji code yako. Kama wazi katika tu picha mtazamaji, basi utakuwa tu kuona smiley nyekundu. Lakini kuchukua kupiga mbizi zaidi katika, tutaweza kuona kwamba muundo yake ni saizi tu. Tuna saizi nyeupe, na kisha saizi nyekundu. nyeupe, ffffff, na kisha yote ya saizi nyekundu nimekuwa rangi katika kwa ajili yenu hapa, na unaweza kuona kwamba wao ni 0000ff. Zero bluu, zero kijani, na nyekundu full. Na tangu smiley ni nane saizi kubwa, hatuna padding yoyote. Sawa. Hivyo kama ningekuwa hawawajui maadili tofauti kwa RGBTRIPLE na nilitaka kufanya hivyo kijani, basi nini napenda kufanya ni Napenda kutangaza RGBTRIPLE, jina lake tatu, na kisha kupata kila byte ndani ya kuwa struct mimi bila kutumia dot operator. Hivyo triple.rgbtBlue, siwezi hawawajui kwamba 0. Green naweza hawawajui kwa full - yoyote idadi, kwa kweli, kati ya 0 na ff. Na kisha nyekundu, mimi nina pia kwenda kusema 0. Hivyo basi, kwamba anatoa mimi pixel ya kijani. Next, nini kama nataka kuangalia thamani ya kitu? Mimi naweza kuwa na kitu ambacho hundi kama rgbtBlue mara tatu ya thamani ya ni ff na kisha magazeti, "Mimi nina hisia blue! ", kama matokeo. Sasa, haimaanishi kwamba pixel ni rangi ya bluu, sawa? Kwa sababu maadili pixel ya kijani na nyekundu inaweza pia kuwa na mashirika yasiyo ya 0 maadili. Yote hii ina maana, na yote hii ni kuangalia kwa ni kwa full rangi ya bluu. Lakini saizi wote wanaweza pia kuwa na sehemu maadili rangi, kama hii mfano ijayo hapa. Ni vigumu kidogo kuona nini picha hii ni sasa. Hii inaonekana kidogo zaidi kama clue.bmp kwamba utasikia kutolewa. Sasa, kimwili, unaweza kutatua, kwa sababu kuna mengi ya nyekundu, na kufanya up screen nyekundu na mfano ili kwamba rangi nyingine inaweza kuonekana. Hivyo ni jinsi gani sisi kuiga na c? Naam, tupate kuondoa nyekundu sanamu kabisa. Na kufanya hivyo kwamba tunatarajia kuweka kila pixel nyekundu thamani kwa 0. Na hivyo picha bila kuangalia kidogo kidogo kama hii, ambapo hatuna nyekundu wowote. Tunaweza kuona siri ujumbe a kidogo zaidi wazi sasa. Ni uso mwingine smiley. Au labda tunaweza kutumia njia nyingine. Labda, tunaweza kutambua yote ya saizi nyekundu - yaani, ya saizi na 0 bluu, 0 kijani, na 0 nyekundu - na mabadiliko ya wale nyeupe. Na mfano wetu ili kuangalia kitu kama hiki. kidogo rahisi kuona. Kuna kura ya njia nyingine ya kubaini ujumbe wa siri kama vile, kushughulika na kudanganywa rangi. Labda unaweza kutumia moja ya njia kwamba mimi zilizotajwa hapo juu. Na kuongeza, unaweza kutaka kuimarisha baadhi ya rangi na kuleta wale nje. Hivyo sasa kwamba tumekuwa iliyopita pixel rangi, karibu sisi tu haja ya kuwaandikia katika scanline, pixel kwa pixel. Na tena, utasikia wanataka kuangalia nyuma kwa copy.c, kama una si kunakiliwa tayari, na kuangalia fwrite kazi, ambayo inachukua data, pointer kwa struct ambayo ina ka kwamba wewe ni kusoma kutoka, ukubwa wa vitu, idadi ya vitu, na kisha outptr - marudio ya files hizo. Baada ya kuandika katika saizi, itabidi pia kuwa na kuandika katika padding. Padding ni nini? Naam, kila pixel rgbt ni ka tatu kwa muda mrefu. Lakini, scanline kwa bitmap picha ina kuwa nyingi ya ka nne. Na kama idadi ya saizi ni si mbalimbali ya nne, basi tunahitaji kuongeza padding hii. Padding ni tu kuwakilishwa na sekunde 0. Hivyo, jinsi gani sisi kuandika, au kusoma hii? Naam, zinageuka kuwa huwezi kweli fread padding, lakini unaweza mahesabu yake. Katika kesi hiyo, habari na uamuzi na upana huo, hivyo padding ni sawa. Na padding, kama utaona katika copy.c, ni mahesabu na chini ya formula - mara bi.biWidth sizeof (RGBTRIPLE) mapenzi kutupa jinsi ka wengi bmp ina katika kila mstari. Kutoka huko, modulos na vipunguzi na 4 unaweza mahesabu ya jinsi ya ka wengi lazima aliongeza ili nyingi ya ka juu ya kila mstari ni nne. Sasa kwa kuwa tuna formula kwa kiasi gani padding, tunahitaji sasa tunaweza kuandika. Sasa, nilivyoeleza hapo awali, padding ni sekunde 0 tu. Hivyo katika kesi hiyo, sisi ni kuweka tu char, katika kesi hii 0, ndani ya yetu outptr - outfile yetu. Hivyo kwamba wanaweza tu kuwa fputc 0, comma outptr. Hivyo, wakati tumekuwa kusoma katika yetu faili, faili I / O ina naendelea wimbo wa wetu nafasi katika files wale walio na kitu aitwaye file nafasi kiashiria. Fikiria kama mshale. Kimsingi, ni maendeleo ya kila wakati kwamba sisi fread, lakini tuna kudhibiti juu yake, pia. Hoja file nafasi kiashiria, unaweza kutumia kazi fseek. Ambapo inptr inawakilisha file pointer kwamba wewe ni kutafuta katika, kiasi ni idadi ya ka kwamba wanataka hoja ya mshale, na kisha kutoka inahusiana na kiini kutoka ambapo mshale ni. Kama kupita katika SEEK_CUR, kwamba inawakilisha sasa nafasi katika faili. Au unaweza kutumia baadhi vigezo vingine. Kwa hiyo, sisi kutaka kutumia fseek ruka juu ya padding ya faili katika. Na tena, kama wewe ni kukwama, kuna mfano wa kwamba katika copy.c. Hivyo sasa tumekuwa kufunguliwa faili, kidokezo, na uamuzi. Tumekuwa updated header info kwa uamuzi wetu, kwa sababu kila bitmap mahitaji ya header. Tumekuwa kisha kusoma katika fununu ya scanline, pixel kwa pixel, kubadilisha kila rangi kama ni lazima, na kuandika hayo katika uamuzi, pixel kwa pixel. Mara baada ya kufungua uamuzi, unaweza kuona ambao culprit, au nini siri ujumbe ni. Jina langu ni Zamyla, na hii ilikuwa whodunit.