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