>> [MUZIKO Ludanta]
>> ZAMYLA CHAN: Ĝi estis Miss Scarlett kun la kandelabro.
Whodunit?
Nu, ni tuj ekscias.
En la tabulludo Clue, vi eble estos donita fizika ruĝa bildo.
Kaj tiu bildo estas tre ruĝa kaj spotty, kaj via laboro estas
malkaŝi la kaŝita mesaĝo.
Kaj kutime vi provizis kun ruĝa grandiga vitro, aŭ ruĝa ekrano por
malkaŝi, ke kaŝita mesaĝo.
Nu, ni tuj imiti tion.
>> En whodunit, vi donita bitmap image ke aspektas tre spotty kaj ruĝa,
kaj poste ruli la whodunit programo riveli kaŝitan mesaĝon.
>> Do ni rompos tiu enen paŝoj.
Unue, vi volas malfermi la dosieron - la indikon ke vi jam donis.
Kaj tiam ankaŭ krei verdikto bitmap dosiero.
Tiam vi volas aktualigi la bitbildo header info por la verdikto outfile.
Pli pri tio poste.
Kaj poste vi legos en la postsigno, scanline, rastrumero per rastrumero,
ŝanĝi la rastrumero koloroj necesa, kaj skribado
tiuj en la verdikto -
rastrumero por pixel en la verdikto scanline.
>> Kiel do ni komencu rondirante tio?
Nu, feliĉe, ni havas copy.c en la dissendo-kodo.
Kaj tio estas iri pruvi sufiĉe utila por ni.
Copy.c malfermas dosieron, legas en tiu infile la kaplinio, poste ĝisdatigas la
outfile la kaplinion.
Kaj tiam ĝi legas ĉiu rastrumero en la scanline, rastrumero per rastrumero, kaj poste
skribu ke rastrumero en la outfile.
>> Do, via unua ŝtupo multobligita estu por ruli la sekvan
komandon en la fina -
cp copy.c whodunit.c.
Tio kreos kopion de copy.c nomata whodunit.c.
Do nia unua paŝo por malfermi la dosiero, bone, ne estas akurata
repliko de tiu en copy.c.
Do mi lasos vin rigardi tion.
>> Kion ni pritraktas en ĉi PSET estas dosiero I / O, esence prenante dosieroj,
legado, verkado, redaktado ilin.
Kiel vi unue malfermi dosieron?
Nu, vi tuj deklari dosieron montrilo, kaj tiam vi nomas la
funkcio fopen.
Iam en la vojo, aŭ la nomo de tiu fajliloj, kaj tiam la reĝimo, ke vi volas
malfermi tiun dosieron in
Pasante en r malfermos foo.bmp por legado.
Dum fopen kun pasi en w volo malfermita bar.bmp, por skribi la dosieron kaj
efektive redaktis ĝin.
>> Do nun, ke ni jam malfermis la dosieron, nia sekva paŝo estas ĝisdatigi la kaplinion info
cxar la outfile.
Kio estas header info?
Nu, unue ni bezonas scii kia bitmap estas.
A bitmap estas nur simpla aranĝo de bajtoj.
Kaj ili estas deklarita en ĉi dosieron ĉi tie, bmp.h, kun fasko da
informo de kia bitmap Estas efektive farita el.
Sed kion ni vere zorgas pri estas la bitmap dosieron kaplinio, ĝuste ĉi tie, kaj
la bitmap info kaplinio, ĉi tie.
La kaplinio konsistas el paro de variabloj kiuj pruvos tre utila.
Ekzistas biSizeImage, kiu estas la tutan grandecon de la bildo en bajtoj.
Kaj tio inkludas rastrumeroj kaj Plenigado.
Plenigado estas tre grava, sed ni ricevos por ke poste.
>> BiWidth reprezentas la larĝeco de la bildo en pikseloj minus la Plenigado.
BiHeight estas tiam ankaŭ la alteco de la bildo en pikseloj.
Kaj tiam la BITMAPFILEHEADER kaj la BITMAPINFOHEADER, kiel mi menciis
pli frue, tiuj estas reprezentitaj kiel structs.
Do, vi ne povas aliri la dosieron kaplinio sin, sed vi volas atingi
tiuj variabloj enen.
>> OK.
Do kiel fari ni ĝisdatigi la header info?
Nu, unue ni devas vidi ĉu ni bezonas ŝanĝi ajnan informon de
la infile, la indikon, ke la outfile, la verdikto.
Estas io ŝanĝas en tiu kazo?
Nu, ne vere, ĉar ni iras esti simple ŝanĝi la kolorojn.
Ni ne tuj estos ŝanĝo de la dosiero grandeco, la bildo grandeco, la larĝa,
aŭ la alteco.
Do vi estas tute bona por nun por nur kopiante unu bildero.
>> OK.
Do nun ni rigardu kiom ni efektive povas legi ĉiun rastrumero de la dosiero.
Alia dosiero / el funkcio venos en teatraĵo -
fread.
Ĝi portas en montrilon al la struct kiu enhavos la bajtoj ke
vi legas.
Do vi legas en tiun.
Kaj tiam vi pasos en grandeco, kiu estas la grandeco de ĉiu elemento kiu vi
deziras legi.
Tie, la funkcio sizeof venos en oportuna.
Tiam vi pasas en numero, kiu reprezentas la nombro de eroj de
grandeco legi.
Kaj tiam fine, inptr, kiu estas la dosiera montrilo ke vi estas
tuj legis el.
Do ĉiu el tiuj elementoj estas interne inptr kaj ili tuj datumojn.
>> Ni rigardu iom ekzemplo.
Se mi volas legi enen datuma du hundoj, bone, mi povos fari tion unu el du manieroj.
Mi povas ĉu legi en du celoj de grandeco hundo de mia inptr, aŭ mi povos legi
en unu kontestas la grandeco de du hundoj.
Do vi vidas, ke depende de la vojo ke vi aranĝi grandeco kaj kvanto, vi
povas legi en la sama nombro da bajtoj.
>> Do nun, ni ŝanĝas la rastrumero koloron kiel ni bezonas.
Se vi rigardas bmp.h denove, tiam vi vidos, ke sur la fundo
RGBTRIPLEs estas alia struct, kie Ili estas formitaj el tri bitokoj.
Unu, rgbtBlue, rgbtGreen kaj rgbtRed.
Do ĉiu el tiuj reprezentas la kvanton el blua, la kvanto de verdo, kaj la
kvanto da ruĝa ene ĉi bildero, kie ĉiu kvanto estas reprezentita de
deksesuma nombro.
>> Do FF0000 estos blua koloro, ĉar ĝi iras de bluaj,
al verda, ruĝa.
Kaj tiam ĉiuj f informoj estos blanka.
Ni rigardu smiley.bmp, kiuj vi havas en via distribuo kodo.
Se vi malfermas ĝin en nur bildo spektanto, do vi devos
nur vidas ruĝa ridetanta.
Sed havante profundan dive en, ni vidas, ke la strukturo
de ĝi estas simple rastrumeroj.
Ni havas blankajn rastrumeroj, kaj poste ruĝan rastrumeroj.
La blankaj, FFFFFF, kaj tiam ĉiuj el la ruĝa rastrumeroj mi kolorigita en por vi
ĉi tie, kaj vi vidos ke ili estas 0000ff.
Nulo blua, nulo verda, kaj plena ruĝa.
Kaj ĉar smiley estas ok rastrumeroj larĝa, ni ne havas ajnan Plenigado.
Ĉiuj pravas.
>> Do se mi estus atribui malsamajn valorojn al RGBTRIPLE kaj mi volis
fari verdan, tiam kion mi devus fari estas Mi raportus al RGBTRIPLE, nomata
triobla, kaj poste aliri ĉiu bajto ene de tiu struct mi
uzus la skalara operatoro.
Do triple.rgbtBlue, mi povas asigni, ke al 0.
Verda Mi povas atribui ĝin al plena - ĉiuj nombro, vere, inter 0 kaj ff.
Kaj poste ruĝaj, mi ankaŭ intencas diri 0.
Tial do tio donas al mi verdan bildero.
>> Tuj poste, kion, se mi volas kontroli la valoro de io?
Mi povus havi iun kiu kontrolas ĉu la trioblon de rgbtBlue valoro estas
ff kaj poste presas ", mi sentas min blua! ", kiel rezulto.
Nu, tio ne nepre signifas ke la rastrumero estas blua, ĉu ne?
Ĉar la rastrumero estas verda kaj ruĝa valoroj povus havi ankaŭ ne-0 valoroj.
Ĉio, kion tio signifas, kaj cxiujn, kiuj tio estas kontrolanta por trovas
por plena blua koloro.
Sed ĉiuj rastrumeroj povus havi ankaŭ parta koloro valoroj, kiel tiu
sekvanta ekzemplo tie ĉi.
>> Ĝi estas iom pli malfacile vidi kion ĉi bildo estas nun.
Tio aspektas iom pli kiel la clue.bmp ke vi estos donitaj.
Nun, fizike, vi eble solvos ĉi, ĉar estas multe da ruĝaj, per
forte tenante ruĝa ekrano la bildo tiel ke la aliaj koloroj povas aperi.
Do kiel fari ni imitas ĉi kun c?
Nu, ni povus forigi cxiujn ruĝa de la bildo komplete.
Kaj fari tiel, ke ni volonte turnis rastrumero ruĝajn valoro al 0.
Kaj tial la bildo aspektus iom iom kiel tio, kie ni ne havas ruĝa
kion ajn.
>> Ni povas vidi la kaŝitajn mesaĝon a iomete pli klare nun.
Ĝi estas alia smiley face.
Aŭ eble ni povus uzi alian metodon.
Eble, ni povus identigi ĉiuj el la ruĝa rastrumeroj -
tio estas, ĉiu el la rastrumeroj kun 0 blua, 0 verdaj, kaj 0 ruĝa -
kaj ŝanĝi tiujn al blanko.
Kaj nia bildo povus rigardi iu kiel ĉi tio.
Iom pli facile vidi.
>> Ekzistas multaj aliaj manieroj por malkovri La sekreta mesaĝo tiel,
kontraktanta kun la koloro manipulado.
Eble vi povus uzi unu el la metodoj kiun mi menciis supre.
Kaj aldone, vi eble volas plibonigi iuj koloroj
kaj alporti tiujn eksteren.
>> Do nun, kiam ni ŝanĝis la rastrumero koloro, apud ni nur bezonas skribi ilin
en la scanline, rastrumero per bildero.
Kaj plue, vi volas rerigardi al copy.c, se vi ne kopiitaj
Jam, kaj rigardu la fwrite funkcio, kiu prenas datumojn, puntero
al la struct kiu enhavas la bajtoj ke vi legas el, la grandeco de
la artikoloj, la nombro de artikoloj, kaj tiam la outptr -
La destino de tiuj dosieroj.
>> Poste vi skribas en la rastrumeroj, vi ankaŭ devas skribi en la Plenigado.
Kio estas Plenigado?
Nu, ĉiu rgbt rastrumero Estas tri bitokoj longa.
Sed, la scanline di bitmap image Devas esti oblo de kvar bajtojn.
Kaj se la nombro de rastrumeroj estas ne oblo de kvar, do ni bezonas aldoni
ĉi Plenigado.
Plenigado estas ĝuste reprezentita de _0s_.
Do, kial ni skribu, aŭ legu ĉi tion?
Nu, tio rezultas, ke vi ne povas reale fread Plenigado, sed vi povas
kalkuli ĝin.
>> En ĉi tiu kazo, la indikon kaj la verdikto havi la sama larĝa, do la
Plenigado estas la sama.
Kaj la Plenigado, kiel vi vidos en copy.c, kalkuliĝas
kun la sube formulo -
bi.biWidth fojojn sizeof (RGBTRIPLE) volo donu al ni, kiom da bitokoj la bmp
havas en ĉiu vico.
De tie, la modulos kaj subtrahoj kun 4 povas kalkuli kiom
multaj bitokoj devas esti adiciita por ke la oblo de bajtoj en
ĉiu vico estas kvar.
>> Nun ke ni havas la formulon por kiom Plenigado ni bezonas, nun
Ni povas skribi ĝin.
Nun, mi menciis antaŭ, Plenigado estas nur _0s_.
Do, en tiu kazo, ni nur metante a char, en tiu kazo oni 0, en nian
outptr - nia outfile.
Do kiu povas esti simple fputc 0, komo outptr.
>> Do, dum ni estis legante en nian dosiero, dosiero / Aŭ gardis spuro de nia
pozicio en tiuj dosieroj kun ion nomis la dosieron pozicio indikilo.
Pensu pri ĝi kiel kursoro.
Esence, ĝi antaŭas ĉiufoje ke ni fread, sed ni havas
kontrolon pri ĝi, ankaŭ.
>> Por movi la dosiero pozicio indikilo, vi povas uzi la funkcion fseek.
Kie la inptr reprezentas la dosiero montrilo, ke vi sercxas en la
kvanto estas la nombro de bitokoj, ke vi volas movi la kursoron, kaj tiam el
rilatas al la referenca punkto de kie via kursoro estas.
Se vi pasas en SEEK_CUR, ke reprezentas la aktualan
pozicio en la dosiero.
Aŭ vi povas uzi iujn aliajn parametrojn.
Do, ni eble volos uzi fseek salti super la Plenigado de la en dosiero.
Kaj cetere, se vi estas hokita, ekzistas ekzemplo de tiu en copy.c.
>> Do nun ni jam malfermis la dosieron, la postsigno, kaj la verdikton.
Ni ĝisdatigis la header info por nia verdikto, ĉar ĉiu
bitmap bezonas kaplinion.
Ni legis en la postsigno de scanline, rastrumero per rastrumero, ŝanĝante
ĉiu koloro kiel necesa, kaj skribi tiujn en la
verdikto, rastrumero per bildero.
Kiam vi malfermos verdikto, vi povas vidi, kiuj la kulpa aux kia estas la sekreta
mesaĝo estas.
Mia nomo estas Zamyla, kaj tiu estis whodunit.