[Musiikki soi] ZAMYLA Chan: Se oli Miss Scarlett kanssa kynttilänjalka. Dekkari? No, me aiomme selvittää. Vuonna lautapeli Clue, saatat annetaan fyysinen punainen kuva. Ja että kuva on hyvin punainen ja epätasainen, ja sinun tehtäväsi on paljastaa piilotetut viesti. Ja yleensä olet varustettu punainen suurennuslasi tai punainen näyttö paljastavat, että piilotettu viesti. No, me aiomme jäljitellä. Vuonna jännäri, olet antanut bittikarttakuvana joka näyttää hyvin epätasainen ja punainen, ja suorita jännäri ohjelman paljastaa piilotetut viesti. Joten rikkoa tätä vaiheisiin. Ensin kannattaa avata tiedoston - vihje siitä, että olet saanut. Ja sitten myös luoda Tuomio bittikarttatiedosto. Sitten haluat päivittää bittikartta header info tuomiota outfile. Siitä lisää myöhemmin. Ja sitten aiot lukea osaksi vihje, juova, pikseli kerrallaan, muuttamalla pikselin värit tarpeen, ja kirjoittaminen Niille tulee tuomio - pikseli kerrallaan osaksi Tuomio juova. Miten me aloittaa menee tästä? No, onneksi meillä on copy.c jakelussa koodin. Ja tämä tosiaankin varsin hyödyllinen meille. Copy.c avaa tiedoston, lukee, että infile otsikossa, ja päivittää sitten outfile otsikossa. Ja sitten se lukee jokaisen pikselin juova, pikseli kerrallaan, ja sitten kirjoittaa, että pikseli osaksi outfile. Joten, ensimmäinen askel voisi on suorittaa seuraavat komento terminaali - cp copy.c whodunit.c. Tämä luo kopion copy.c nimetty whodunit.c. Joten meidän ensimmäinen askel avaa tiedosto, hyvin, siellä on tarkka kopio, että copy.c. Joten jätän sinut katsomaan sitä. Mitä olemme tekemisissä tässä PSET on tiedoston I / O, pohjimmiltaan ottaen kuvaa, lukeminen, kirjoittaminen, muokata niitä. Miten ensin avata tiedoston? No, olet menossa julistaa tiedosto osoitinta ja soitat Tehtävä fopen. Kulkea polkua tai nimi, joka tiedostoon, ja sitten moodi, jonka haluat avata tiedoston sisään Ohimennen r avautuu foo.bmp lukemiseen. Ottaa huomioon, että fopen kanssa ohimennen w tulee avoin bar.bmp, kirjoittaa tiedoston ja itse muokkaamalla sitä. Joten nyt olemme avannut tiedoston, meidän Seuraava askel on päivittää otsikon info varten outfile. Mikä header tiedot? No, ensin meidän täytyy tietää mikä bittikartta on. Bittikartta on vain yksinkertainen järjestely tavua. Ja he ilmoitetut tätä kuvaa täällä, bmp.h, jossa joukko tietoa siitä, mitä bittikartta on todella tehty pois. Mutta mitä me oikeastaan ​​välitä on Bittikarttatiedosto otsikon, täällä, ja bittikartta info otsikon tänne. Header koostuu pari muuttujia, jotka osoittautuvat erittäin hyödyllistä. On biSizeImage, joka on yhteensä kuvan kokoa tavuina. Ja tämä sisältää pikseliä ja pehmusteet. Padding on erittäin tärkeää, mutta me saamme myöhemmin. BiWidth edustaa leveyttä kuvan pikseleinä miinus täyte. BiHeight on sitten myös korkeus kuvan pikseleinä. Ja sitten BITMAPFILEHEADER ja BITMAPINFOHEADER, kuten mainitsin aiemmin, nämä ovat edustettuina kuten structs. Joten, et voi käyttää tiedoston otsikko itse, mutta sinun kannattaa päästä nämä muuttujat sisällä. OK. Miten siis päivittää header tiedot? No, ensin meidän täytyy nähdä, onko meillä tarvitse muuttaa mitään tietoja infile, vihje, jotta outfile, tuomion. Onko mitään muuttuvat tässä tapauksessa? No, ei oikeastaan, koska olemme menossa on vain muuttamalla väriä. Emme aio muuttuvan tiedosto koko, kuvan koko, leveys, tai korkeus. Joten olet kunnossa nyt by vain kopioimalla jokainen pikseli. OK. Joten nyt Katsotaanpa, miten me oikeastaan voi lukea jokaisen pikselin tiedostosta. Toinen tiedoston I / O-toiminto tulevat peliin - fread. Se vie osoitin struct joka sisältää tavujen luet. Joten luet tuohon. Ja sitten ohitat koossa, joka on koko jokaisen osa, jota haluat lukea. Tässä toiminto sizeof tulee kätevä. Sitten ohitat määrä, joka edustaa useita elementtejä koon lukea. Ja sitten lopuksi, inptr, joka on tiedoston osoitin, että olet menossa lukea. Joten kaikki nämä elementit ovat sisäpuolella inptr ja he aikovat tietoja. Katsotaanpa hieman esimerkki. Jos haluan lukea dataksi kaksi koiraa, No, voin tehdä sen kahdella tavalla. Voin joko lukea kaksi objektia koosta koira minun inptr, tai voin lukea yksi esine koko kaksi koiraa. Niin näet, että riippuen tavasta että voit järjestää koko ja määrä, voit voi lukea saman määrän tavuja. Joten nyt, nyt muuttaa pikselin väri kuin tarvitsemme. Jos tarkastellaan bmp.h uudelleen, sitten näet, että alareunassa RGBTRIPLEs ovat toinen struct, jossa ne koostuvat kolme tavua. Yksi, rgbtBlue, rgbtGreen, ja rgbtRed. Joten jokainen näistä edustaa määrää sininen, vihreän määrää, ja punaisten sisälle pikseli, jossa Kunkin määrä edustaa heksadesimaalinumero. Joten ff0000 on sininen väri, koska se menee sininen, vihreäksi, punaiseksi. Ja sitten kaikki f: n on valkoinen. Katsotaanpa katsomaan smiley.bmp, joka sinulla on jakelun koodin. Jos avaat sen vain kuva katsoja? Tulet vain nähdä punaisen hymiö. Mutta ottaen syvempi sukellus, näytämme nähdä, että rakenne se on vain pikseliä. Meillä on valkoinen pikseliä, ja sitten punaista pikseliä. Valkoinen, ffffff, ja sitten kaikki punainen pikseliä Olen väritetty sinulle täällä, ja näet, että he 0000FF. Nolla sininen, nolla vihreä ja täynnä punaiset. Ja koska hymiö on kahdeksan pikseliä leveä, meillä ei ole mitään täyte. Selvä. Joten jos olisin määrittää eri arvoja to RGBTRIPLE ja halusin jotta se vihreä, niin mitä tekisin on Haluan julistaa RGBTRIPLE, nimeltään kolminkertainen, ja sitten käyttää joka tavun että struct I käyttäisi piste operaattori. Joten triple.rgbtBlue, voin määrittää, että 0. Vihreä voin määrittää sen täyteen - kaikki numero, todella, välillä 0 ja FF. Ja sitten punainen, olen myös menossa sanoa 0. Joten sitten, että antaa minulle vihreä pikseli. Seuraava, mitä jos haluan tarkistaa arvo jotain? Voisin olla jotain, joka tarkistaa onko triple n rgbtBlue arvo on ff ja sitten tulostaa, "En tunne sininen! ", seurauksena. Nyt, se ei välttämättä tarkoita että pikseli on sininen, eikö? Koska pikselin vihreä ja punainen arvot voisi olla myös ei-0-arvot. Kaikki tämä tarkoittaa, ja kaikki tämä on tarkistanut on täyden sininen väri. Mutta kaikki pikselit voisi olla myös osittainen väriarvot, kuten tämä Seuraava esimerkki tästä. Se on vähän vaikeampi nähdä mitä tämä kuva on nyt. Tämä näyttää hieman enemmän kuin clue.bmp että sinulle annetaan. Nyt, fyysisesti, saatat ratkaista tämän, koska siellä on paljon punaista, jonka pintansa punainen näytön kuvan niin että muut värit voivat näkyä. Miten siis jäljitellä tätä C? No, voisimme poista kaikki punaiset kokonaan kuvasta. Ja niin tehdä, että olisimme asettavat kukin pikselin punainen arvoksi 0. Ja niin kuva näyttäisi hieman vähän kuin tämä, jossa meillä ei punaista mitään. Voimme nähdä piilotettu viesti hieman selvemmin nyt. Se on toinen hymiö kasvot. Tai ehkä voisimme käyttää toista menetelmää. Ehkä voisimme tunnistaa kaikki punaiset pikseliä - se on, kaikki pikseliä 0 sininen, 0 vihreä, ja 0 punainen - ja muuttaa niitä valkoiseksi. Ja kuva saattaa näyttää jotain tällaista. Hieman helpompi nähdä. On olemassa paljon muita tapoja paljastaa salainen viesti samoin, käsittelevät väri manipulointia. Ehkä voisit käyttää yksi menetelmistä että edellä mainitsin. Ja lisäksi kannattaa parantaa jotkut värit ja tuoda ne pois. Joten nyt olemme muuttaneet pikselin väri, seuraavaksi meidän täytyy vain kirjoittaa ne sisään juova, pikseli kerrallaan. Ja jälleen kerran, sinun kannattaa katsoa taaksepäin to copy.c, jos et ole kopioinut sen jo, ja katso fwrite funktio, joka vie tietoa, osoitin to struct joka sisältää tavut että luet päässä, koko eriä, kappalemäärä, ja sitten outptr - määränpää kyseiset tiedostot. Kun kirjoitat pikseliä, sinun myös kirjoittaa täyte. Mikä on täyte? No, jokainen rgbt pikseli on kolme tavua pitkä. Mutta, juova varten bittikarttakuvana on oltava useita neljä tavua. Ja jos pikselien määrä ei ole Useiden neljä, sitten meidän täytyy lisätä Tämä täyte. Täyte on vain edustaa 0s. Joten, miten voimme kirjoittaa tai lukea tämän? No, käy ilmi, että et voi todella fread täyte, mutta voit laskea sitä. Tässä tapauksessa vihjeen ja tuomio leveys on sama, joten pehmuste on sama. Ja täyte, kuten näet vuonna copy.c, lasketaan kanssa alla kaava - bi.biWidth kertaa sizeof (RGBTRIPLE) tulee antaa meille kuinka monta tavua bmp on jokaisella rivillä. Sieltä modulos ja vähennyksiä 4 voi laskea, kuinka monta tavua on lisättävä niin, että monikerta tavua jokaisella rivillä on neljä. Nyt kun meillä on kaava kuinka paljon täyte tarvitsemme nyt voimme kirjoittaa sen. Nyt aiemmin mainitsin, täyte on vain 0s. Niin siinä tapauksessa, me vain laskemisesta char, tässä tapauksessa 0, meidän outptr - meidän outfile. Niin, että voi vain olla fputc 0, pilkku outptr. Joten, kun olemme lukeneet meidän tiedosto, tiedoston I / O on pitänyt kirjaa meidän aseman tiedostot jotain nimeltään tiedosto asennonosoittimen. Ajattele sitä kohdistin. Periaatteessa se etenee joka kerta että me fread, mutta meillä on valvoa sen myös. Siirtää tiedoston asennonosoitin, voit käyttää toimintoa fseek. Jos inptr edustaa tiedosto osoitin, että haet vuonna, määrä on tavujen että olet haluat siirtää kursoria, ja sitten liittyy vertailupisteen mistä hiiren kursori on. Jos ohitat SEEK_CUR, että edustaa nykyinen asema tiedoston. Tai voit käyttää joitakin muita parametrejä. Joten meidän kannattaa käyttää fseek ohittaa yli täytteestä tiedostoon. Ja vielä, jos olet jumissa, siellä Esimerkkinä, että copy.c. Joten nyt olemme avannut tiedoston, vihje, ja tuomio. Olemme päivittäneet otsikon info meidän tuomiosta, koska jokainen bittikartta tarvitsee otsikko. Olemme sitten lukea osaksi hajuakaan n juova, pikseli kerrallaan, muuttuvat jokainen väri tarpeen mukaan, ja kirjoittamisen osaksi tuomiosta, pikseli kerrallaan. Kun avaat tuomiosta, näet, kuka syyllinen, tai mitä salaisuus viesti on. Nimeni on Zamyla, ja tämä oli jännäri.