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