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