>> [Tónlist spila]
>> ZAMYLA CHAN: Það var Miss Scarlett með ljósastikunni.
Whodunit?
Jæja, erum við að fara að finna út.
Í borðspil Clue, gætir þú að gefa líkamlega rauða mynd.
Og þessi mynd er mjög rauður og bólóttur, og starf þitt er að
sýna the falinn skilaboð.
Og yfirleitt þú ert veitt með rautt stækkunargler, eða rautt skjár til
sýna að falinn skilaboð.
Jæja, þá ætlum við að líkja eftir því.
>> Í whodunit, ert þú gefið bitamyndina sem lítur mjög bólóttur og rauður,
og þá hlaupa the whodunit program að koma í ljós falinn skilaboð.
>> Svo skulum brjóta þetta í skrefum.
Fyrst, þú vilt opna skrána - vísbending um að þú hafir verið gefið.
Og þá líka búið til úrskurður punktamynd skrá.
Síðan sem þú vilt uppfæra punktamynd haus upplýsingar fyrir dóm OUTFILE.
Meira um það síðar.
Og svo þú ert að fara að lesa í vísbending, scanline, pixla með pixla,
breyta pixla litum sem nauðsyn krefur, og skrift
þær inn úrskurður -
pixla með pixla inn í úrskurður scanline.
>> Hvernig getum við byrjað að fara um þetta?
Jæja, sem betur fer, höfum við copy.c í dreifingu kóða.
Og þetta er að fara að sanna alveg gagnlegt fyrir okkur.
Copy.c opnar skrána, les í því haus INFILE, og síðan uppfærir
haus OUTFILE er.
Og þá les það hvert pixla í scanline, pixla með pixla, og þá
skrifar að pixla í OUTFILE.
>> Svo fyrsta skrefið gæti vera að keyra eftirfarandi
stjórn í flugstöðinni -
CP copy.c whodunit.c.
Þetta mun skapa afrit af copy.c heitir whodunit.c.
Svo fyrsta skrefið okkar til að opna skrá, vel, það er nákvæm
eftirmynd af því í copy.c.
Svo ég leyfi þér að líta á það.
>> Það sem við erum að fást við í þessum PSET er skrá I / O, í grundvallaratriðum að taka skrár,
lestur, ritun, breyta þeim.
Hvernig gera þú opnar skrána?
Jæja, ætlar þú að fara að lýsa yfir skrá músina, og þá kalla
virka fopen.
Fara í götunni, eða nafni sem skrá, og þá stillingu sem þú vilt
til að opna þessa skrá inn
Brottför í r mun opna foo.bmp fyrir að lesa.
En fopen við brottför í W mun opinn bar.bmp, til að skrifa skrána og
reyndar breyta því.
>> Svo nú er að við höfum opnað skrána, okkar Næsta skref er að uppfæra haus upplýsingar
fyrir OUTFILE.
Hvað er haus upplýsingar?
Jæja, fyrst við þurfum að vita hvað punktamynd er.
A punktamynd er bara einfalt fyrirkomulag bæti.
Og þeir eru lýst í þessari skrá hér, bmp.h, með fullt af
upplýsingar um hvað punktamynd er í raun gert út af.
En það sem við í raun sama um er punktamynd skrá haus, hérna, og
The punktamynd upplýsa haus, hérna.
Haus samanstendur af a par af breytur sem mun reynast mjög gagnleg.
Það er biSizeImage, sem er Heildarstærð myndarinnar í bætum.
Og þetta nær dílar og padding.
Padding er mjög mikilvægt, en við munum komast að því síðar.
>> BiWidth táknar breidd myndarinnar í dílum mínus padding.
BiHeight er þá einnig hæð myndarinnar í punktar.
Og þá BITMAPFILEHEADER og BITMAPINFOHEADER, eins og ég nefndi
áðan, þá eiga fulltrúa sem structs.
Svo getur þú ekki aðgang að skrá haus sjálft, en þú þarft að fá að
þessir breytur inni.
>> OK.
Svo hvernig gera við að uppfæra haus upplýsingar?
Jæja, fyrst verðum við að sjá hvort við þarft að breyta öllum upplýsingum frá
á INFILE, vísbending, til OUTFILE, úrskurður.
Er eitthvað að breytast í þessu tilfelli?
Jæja, ekki raunverulega, vegna þess að við erum að fara að vera bara að breyta litum.
Við erum ekki að fara að breyta skrá stærð, stærð, breidd,
eða hæð.
Svo þú ert allt í lagi í bili með bara afrita hvert pixla.
>> OK.
Svo nú skulum líta á hvernig við raunverulega geta lesið hvert pixla úr skrá.
Annar skrá I / O aðgerð mun koma inn í leik -
fread.
Það tekur í bendi á strúktúrinn sem mun innihalda bæti sem
þú ert að lesa.
Svo þú ert að lesa í það.
Og þá þú fara í stærð, sem er stærð hvert frumefni sem þú
vilja til að lesa.
Hér, sem virka sizeof mun koma sér vel.
Þá þú fara í fjölda, sem táknar fjölda staka í
stærð til að lesa.
Og svo að lokum, inptr, sem er skráin músina sem þú ert
fara að lesa úr.
Svo allt af þeim þáttum eru inni inptr og hann ætlar að gögnum.
>> Við skulum líta á smá dæmi.
Ef ég vil lesa í gögnum tveimur hundum, Jæja, ég get gert það á tvo vegu.
Ég get annað hvort lesa í tveimur hlutum af stærð hundur frá inptr mínum, eða ég get lesið
í einum hlut á stærð við tveimur hundum.
Svo þú sérð að það fer eftir að þú raða stærð og fjölda, þú
getur lesið í sama fjölda bæti.
>> Svo nú skulum við breyta pixla litur sem við þurfum.
Ef þú horfir á bmp.h aftur, þá þú munt sjá að neðst
RGBTRIPLEs eru annað strúktúr, þar þeir eru samsett af þremur bæti.
Einn, rgbtBlue, rgbtGreen og rgbtRed.
Svo hvert þessara táknar magn af bláum, the magn af grænum og
magn af rauðu innan þessa punkta, þar hvert magn er táknuð með
sextánskur númer.
>> Svo ff0000 verður blár litur, vegna þess að það fer frá blár,
í grænt, rautt.
Og þá allt F mun vera hvítur.
Láta 'taka a líta á smiley.bmp sem þú hefur í dreifingu kóðann þinn.
Ef þú opnar það í bara mynd áhorfandi, þá munt þú
bara sjá rautt broskarl.
En taka dýpri kafa í, munum við sjá að uppbygging
af er það bara punktar.
Við höfum hvíta punkta, og þá rauður punktar.
Hvíti, ffffff, og þá allt í rauður punktar sem ég hef litað í fyrir þig
hér, og þú sérð að þeir eru 0000ff.
Zero blár, núll grænn og fullur rauður.
Og þar smiley er átta punktar á breidd, við höfum ekki allir padding.
Allt í lagi.
>> Þannig að ef ég væri að setja mismunandi gildi að RGBTRIPLE og ég vildi
að gera það grænt, þá er það sem ég myndi gera Ég myndi lýsa RGBTRIPLE, sem heitir
þrefaldur, og þá til að fá aðgang á hverjum bæti innan þess strúktúr I
myndi nota punktur rekstraraðila.
Svo triple.rgbtBlue, ég get úthluta því á 0.
Green I getur tengt það til fullur - allir númer, í raun, á milli 0 og FF.
Og þá rautt, ég líka að fara að segja 0.
Svo þá sem gefur mér græna pixla.
>> Næst er það ef ég vil athuga gildi eitthvað?
Ég gæti hafa eitthvað sem athugar hvort rgbtBlue gildi þrefaldur er
FF og þá prenta, "ég er tilfinning blár! ", eins og a afleiðing.
Nú, það þýðir ekki endilega að þýða að pixla er blár, ekki satt?
Vegna þess að græna og rauða gildi pixla er gæti einnig hafa non-0 gildum.
Allt sem þetta þýðir, og allt það þetta er að haka fyrir er
fyrir fullu bláum lit.
En allir punktar gætu einnig hafa hluta lit gildi, eins og þetta
næsta dæmi hér.
>> Það er svolítið erfiðara að sjá hvað þessi mynd er nú.
Þetta lítur svolítið meira eins og clue.bmp að þú munt vera.
Nú, líkamlega, gætir þú að leysa þetta, vegna þess að það er mikið af rauðum, með
halda upp rauður skjár til myndina þannig að aðrir litir geta birst.
Svo hvernig gera við líkja þessu við C?
Jæja, við gætum fjarlægja öll rauð frá myndinni alveg.
Og svo til að gera að við myndum setja á hverjum rauður gildi Pixel í 0.
Og svo myndin myndi líta svolítið hluti eins og þetta, þar sem við höfum ekki rauður
neinu tagi.
>> Getum við séð falinn skilaboðin svolítið betur núna.
Það er annað smiley face.
Eða kannski að við gætum notað aðra aðferð.
Kannski gætum við bera kennsl öll af rauðu punktar -
sem er, allir punktar með 0 blár, 0 grænn og 0 rautt -
og breyta þeim í hvítt.
Og ímynd okkar gæti litið eitthvað eins og this.
A svolítið auðveldara að sjá.
>> Það eru fullt af öðrum leiðum til að afhjúpa leyndarmál skilaboð eins og heilbrigður,
takast á við lit meðferð.
Kannski þú gætir notað eina af þeim aðferðum sem ég nefndi hér að ofan.
Og til viðbótar, þú might vilja að auka sumir litir
og koma þeim út.
>> Svo nú er að við höfum breytt pixla lit, næst þurfum við bara að skrifa þá
inn á scanline, pixla með pixla.
Og enn og aftur, youll 'vilja til að líta til baka að copy.c, ef þú hefur ekki afrita
það nú þegar, og líta á fwrite virka, sem tekur gögn, bendillinn
að strúktúrinn sem hefur að geyma bæti að þú ert að lesa úr, the stærð af
atriði, fjölda liða, og þá outptr -
ákvörðunarstaðar þeim skrám.
>> Eftir að þú skrifar í dílar, munt þú einnig að skrifa í bólstrun.
Hvað er padding?
Jæja, hvert rgbt pixla er þrír bæti.
En, scanline fyrir bitamyndina þarf að vera margfeldi af fjórum bæti.
Og ef fjöldi punkta er ekki margfeldi af fjórum, þá þurfum við að bæta við
þetta padding.
Padding er bara táknað með 0s.
Svo, hvernig gera við að skrifa eða lesa þetta?
Jæja, kemur í ljós að þú getur ekki reyndar fread padding, en þú getur
reikna það.
>> Í þessu tilviki er vísbending og dómur hafa sömu breidd, þannig að
padding er sú sama.
Og padding, eins og þú munt sjá í copy.c, er reiknað
með neðan formúlu -
bi.biWidth sinnum sizeof (RGBTRIPLE) mun gefa okkur hversu margir bæti á BMP
hefur í öllum röð.
Þaðan modulos og dregnar með 4 getur reiknað út hversu
margir bæti verður að bæta við þannig að margfeldi af bæti á
sérhver röð er fjórir.
>> Nú þegar við höfum uppskrift að hversu mikið padding við þurfum, nú
við getum skrifað það.
Nú, ég nefndi áður, padding er bara 0s.
Svo í því tilfelli, við erum bara að setja A char, í þessu tilfelli er 0, inn í okkar
outptr - OUTFILE okkar.
Svo sem getur bara verið fputc 0, komma outptr.
>> Svo, á meðan við höfum verið að lesa inn í okkar skrá, skrá I / O hefur haldið utan um okkar
staða í þessum skrám með eitthvað kallað skrá stöðu vísir.
Hugsaðu um það sem bendilinn.
Grundvallaratriðum, framfarir það í hvert skipti að við fread, en við höfum
stjórna yfir það líka.
>> Til að færa skrá stöðu vísir, þú getur notað virka fseek.
Þar sem inptr táknar skrána bendillinn sem þú ert að leita í,
upphæð er fjöldi bytes sem þú vilt færa bendilinn, og síðan úr
snýr að viðmiðunarpunkt frá þar sem bendillinn er.
Ef þú fara í SEEK_CUR, að sýnir núverandi
staða í skrá.
Eða þú getur notað nokkrar aðrar breytur.
Svo gætum við viljum að nota fseek að sleppa yfir padding á í skránni.
Og aftur, ef þú ert fastur, það er dæmi um að í copy.c.
>> Svo nú höfum við opnað skrána, vísbending, og dómur.
Við höfum uppfært haus upplýsingar fyrir Úrskurður okkar, vegna þess að hvert
punktamynd þarf haus.
Við höfum þá lesa inn vísbending er scanline, pixla með pixla, breyta
Sérhver litur sem þörf krefur, og skrifa þær inn í
úrskurður, pixla með pixla.
Þegar þú opnar dóm, getur þú séð hver sökudólgur, eða hvað leyndarmál
skilaboðin eru.
Mitt nafn er Zamyla, og þetta var whodunit.