[MUSIC Playing] ZAMYLA Chan: Ez Miss Scarlett A gyertyatartó. Detektívregény? Nos, meg fogjuk megtudni. A társasjáték nyom, lehet, hogy adni a fizikai piros képet. És ez a kép nagyon vörös és foltos, és a feladata, hogy felfedi a rejtett üzenetet. És általában te ellátott piros nagyító, vagy egy piros képernyő azt mutatják, hogy a rejtett üzenetet. Nos, megyünk, hogy utánozza ezt. A detektívregény, akkor kap egy bitkép úgy néz ki, nagyon pattanásos és vörös, majd futtassa a detektívregény programot hogy felfedje a rejtett üzenetet. Szóval megtörni ezt a lépést. Először is, szeretnénk megnyitni a fájlt - A nyom, amit kapott. És akkor is létrehozhat egy ítéletet bitmap fájlt. Akkor szeretné frissíteni a bitmap header info az ítélet outfile. Bővebben később. És akkor fogsz olvasni a nyom, scanline, pixelenként, változó pixel színek szükséges, és az írás ezeket az ítéletet - pixelenként a ítéletet scanline. Hogyan kezdjük majd erről? Nos, szerencsére, van copy.c az elosztó kódot. És ez lesz bizonyítani nagyon hasznos a számunkra. Copy.c megnyit egy fájlt, beolvassa az adott bemeneti fájl fejlécét, majd frissíti a outfile fejléc. És akkor beolvassa minden egyes pixel a scanline, pixelenként, majd azt írja, hogy a pixel a kimeneti fájl. Tehát az első lépés lehet, hogy , hogy futtassa az alábbi parancsot a terminál - cp copy.c whodunit.c. Ez létrehoz egy példányt copy.c nevű whodunit.c. Tehát az első lépés, hogy nyissa meg a fájl, nos, van egy pontos másolata, hogy copy.c. Úgyhogy hagyjuk, hogy nézd meg ezt. Mi dolgunk ebben Pset is file I / O, alapvetően figyelembe kép, olvasás, írás, szerkesztéssel. Hogy először nyit meg egy fájlt? Nos, fogsz, hogy állapítsa meg a fájlt mutató, és akkor hívja a funkció fopen. Át az úton, vagy a nevét, hogy fájlt, és a módot, amit akar megnyitni a fájlt be Átadása egy r megnyílik foo.bmp olvasásra. Mivel fopen átadásával egy w lesz nyitott bar.bmp, írásra a fájlt, és valójában szerkesztését. Most, hogy már megnyitotta a fájlt, a következő lépés az, hogy frissítse a fejléc információ A kimeneti fájl. Mi az a fejléc információra? Nos, először is tudnunk kell, hogy mi a bitmap az. A bitmap csak egy egyszerű elrendezése bájt. És ők kijelentette, ebben a fájlban Itt bmp.h, egy csomó információ, amit egy bitmap valójában készült. De ami igazán érdekel, az a bitmap fájl fejlécében, itt, és A bitmap infó fejlécét, mint itt. A fejléc áll egy pár változó, hogy nagyon hasznosnak fog bizonyulni. Van biSizeImage, amely a teljes kép méretét bájtokban. És ez magában foglalja a pixel és padding. Kárpitozás nagyon fontos, de a mi lesz később. BiWidth képviseli a szélessége a kép pixel mínusz a kitöltés. BiHeight ezután szintén a magasságot A kép pixel. És akkor a BITMAPFILEHEADER és a BITMAPINFOHEADER, ahogy már említettem korábban, ezek képviselik mint struktúrákat. Szóval, nem tudja elérni a fájl fejlécében is, de akkor szeretnénk eljutni azokat a változókat belül. OK. Szóval hogyan lehet frissíteni a fejléc információra? Nos, először is azt kell látni, hogy mi kell változtatni bármilyen információt A bemeneti fájl, a nyom, hogy a outfile, az ítéletet. Van valami változik ebben az esetben? Nos, valójában nem, mert mi megyünk hogy csak a változó színek. Nem fogunk, hogy változik a fájl méret, a képméret, a szélesség, vagy a magasság. Szóval minden rendben most a csak a másolás minden egyes pixel. OK. Most nézzük meg, hogyan is tudja olvasni minden pixel a fájlból. Egy másik fájl I / O funkció jön szóba - fread. Tart a mutatót a struktúra , amely tartalmazni fogja a byte-ok olvasod. Szóval olvasod bele. És akkor át a méret, ami mérete minden eleme, hogy szeretnénk olvasni. Itt a funkció sizeof jól jöhet. Akkor át a számot, ami számát jelenti eleme méret olvasni. És végül, inptr, ami a fájl mutatót, hogy te fog olvasni. Tehát az összes ilyen elem belsejében inptr és ők fognak adatokat. Nézzünk egy példát. Ha azt akarom, hogy olvassa be az adatok két kutya, Nos, meg tudom csinálni két módon. Én sem olvastam két objektum mérete kutya az én inptr, vagy tudok olvasni az egyik objektum méretének két kutya. Tehát láthatjuk, hogy attól függően, hogy hogy gondoskodjon mérete és száma, akkor tudja olvasni az azonos számú bájt. Tehát most, változtassuk meg a pixel színe, mint amire szükségünk van. Ha megnézzük bmp.h újra, majd látni fogja, hogy az alján RGBTRIPLEs egy másik struktúra, ahol a ezek mely három bájt. Egy, rgbtBlue, rgbtGreen és rgbtRed. Tehát mindegyik képviseli az összeget kék, a zöld szín mennyiségét, valamint a mennyiségű vörös ezen belül pixel, ahol a Mindegyik összeget képviseli hexadecimális szám. Tehát ff0000 lesz egy kék színű, mert megy a kék, a zöld, a piros. És akkor minden f a fehér lesz. Vessünk egy pillantást a smiley.bmp, ami van a terjesztési kódot. Ha kinyitja azt csak egy kép néző, akkor majd csak egy piros smiley. De, hogy egy mélyebb merülés, fogunk látni, hogy a szerkezet Az ez csak pixel. Van fehér pixel, majd a piros pixel. A fehér, ffffff, majd az összes, a red pixel Már színű az Ön számára itt, és látod, hogy ők 0000FF. Zero kék, nulla zöld, és a teljes piros. És mivel smiley nyolc pixel széles, nincs semmi padding. Rendben van. Tehát, ha én rendelni különböző értékeket egy RGBTRIPLE, és szerettem volna hogy ez a zöld, akkor én mit tennék a Én nyilvánítják RGBTRIPLE nevű hármas, majd a hozzáférést minden byte belül struct én használná a pont operátor. Így triple.rgbtBlue tudok rendelni, hogy a 0-ra. Green I hozzárendelheti a teljes - a szám, tényleg, 0 és ff. És akkor piros, én is akartam mondani, hogy 0-ra. Így aztán, hogy ad nekem egy zöld pixel. Ezután mi van, ha azt szeretné, hogy ellenőrizze valaminek az értékét? Tudtam volna valamit, hogy az ellenőrzések hogy a hármas a rgbtBlue értéke ff majd a print, "érzem magam kék! ", ennek eredményeként. Nos, ez nem jelenti szükségszerűen azt, hogy a pixel kék, nem igaz? Mivel a pixel a zöld és a piros értékek is rendelkezhet nem 0 értékeket. Ez azt jelenti, hogy minden, és minden, ami ez ellenőrzi a van a teljes kék színű. De minden képpont is részleges színes értékek, így következő példa itt. Ez egy kicsit nehezebb, hogy mi ez a kép most. Ez úgy néz ki, egy kicsit több, mint a clue.bmp, hogy akkor meg kell adni. Nos, fizikailag, akkor lehet, hogy megoldja ezt, mert van egy csomó piros, a , kezében egy piros képernyő a képet, hogy hogy a többi szín is megjelennek. Szóval hogyan lehet utánozni ezt ac? Nos, lehet, hogy távolítsa el az összes piros a képből teljesen. És így kell csinálni, hogy mi lenne beállítva minden pixel piros értékét 0-ra. És így a kép is meg egy kicsit kicsit olyan, mint ez, ahol már nem piros nélkül. Láthatjuk a rejtett üzenetet, a kicsit világosabban most. Ez egy mosolygó arc. Vagy talán mi is egy másik módszerrel. Talán sikerült azonosítani az összes piros pixel - vagyis az összes pixel 0 kék, zöld 0, 0 piros - és a változás azokat, fehér. És a kép nézhet valami ilyesmi. Egy kicsit könnyebb látni. Sok más módon feltárni a titkos üzenet is, foglalkozik a szín manipuláció. Talán lehet, hogy használja az egyik módszer , amit a fent említett. És ezen kívül, akkor érdemes növelése néhány szín és hogy ezeket ki. Most, hogy már megváltoztatta a pixel szín, a következő már csak be kell írni őket be a scanline, pixelenként. És ismét, akkor szeretné, hogy nézz vissza a copy.c, ha még nem másolt már, és nézd meg a fwrite funkcióra, ami megkapja az adatok, a mutató a struktúra, amely a byte hogy te olvasni, a méret A tételek a tételek számát, majd a outptr - a cél az ilyen fájlokat. Miután írni a pixel, akkor is meg kell írni a padding. Mi az a padding? Nos, minden rgbt pixel három bájt hosszú. De a soronkénti egy bitkép kell, hogy legyen több négy bájt. És ha a pixelek száma nem négy többszöröse, akkor meg kell adni ez padding. Kárpitozás csak képviseli 0s. Szóval, hogyan írunk, vagy olvasd el ezt? Nos, kiderült, hogy nem lehet valójában fread padding, de akkor kiszámításához. Ebben az esetben, a nyom, és az ítéletet azonos szélességű, így a padding ugyanaz. És a padding, mint látni fogod A copy.c kiszámítani az alábbi képlettel - bi.biWidth alkalommal sizeof (RGBTRIPLE) a nekünk, hogy hány bájt a bmp van minden sorban. Innen a modulos és kivonás 4 lehet számolni, hogy sok bájt ki kell egészíteni úgy, hogy a többszöröse byte on Minden sor négy. Most, hogy megvan a képlet hogy mennyi padding van szükségünk, most már tudjuk megírni. Most már említettem korábban, padding csak 0s. Tehát ebben az esetben, mi csak üzembe char egy, ebben az esetben egy 0, a mi outptr - a kimeneti fájl. Annak érdekében, hogy lehet csak fputc 0, vessző outptr. Így, miközben mi már olvasta a mi fájl, file I / O tartotta pályán a mi helyzetben azok a fájlok, valami nevű fájl helyzetjelző. Gondold azt, hogy a kurzor. Alapvetően előleget minden alkalommal hogy fread, de van az irányítást felette is. A fájl áthelyezésének helyzetjelző, használhatja a funkciót fseek. Ha a inptr képviseli a fájlt mutató, hogy te keresett, a összeg a byte-ok száma, amit szeretné mozgatni a kurzort, majd a kapcsolódik a referenciapont ahol a kurzor. Ha át az SEEK_CUR, hogy képviseli a jelenlegi pozíció a fájlban. Vagy valamilyen más paramétereket. Tehát érdemes használni fseek hogy kihagyja át a padding a fájlban. És ismét, ha elakad, ott van egy példát, hogy copy.c. Tehát most már megnyitotta a fájlt, a nyom, és az ítéletet. Már frissített fejléc info az ítéletet, mert minden bitmap szüksége van egy fejléc. Már akkor olvassa el a nyom a scanline, pixelenként, változó minden színben szükség, és írásban azokat a ítéletet, pixelenként. Ha megnyitja ítéletet, akkor láthatjuk, aki a tettes, vagy mi a titok üzenet. A nevem Zamyla, és ez detektívregény.