>> [MUSIC PŘEHRÁVÁNÍ]
>> ZAMYLA CHAN: Bylo to slečna Scarlett s svícnu.
Detektivka?
Dobře, jdeme to zjistit.
V deskové hry Clue, můžete být fyzické červený obraz.
A že obraz je velmi červené a flekatý, a vaším úkolem je
odhalit skryté poselství.
A obvykle jste za předpokladu, s červenou zvětšovací sklo, nebo červené obrazovky
ukazují, že skryté poselství.
No, budeme napodobovat.
>> V detektivka, že jste daný rastrový obrázek který vypadá velmi uhrovitý a červené,
a poté spusťte program detektivka odhalit skryté poselství.
>> Takže pojďme rozbít to na schodech.
Za prvé, budete chtít otevřít soubor - vodítko, které jste dostali.
A pak také vytvořit Verdikt bitmapový obrázek.
Pak chcete aktualizovat bitmapu header info na verdikt outFile.
Více o tom později.
A pak budete číst do stopa, scanline, pixel po pixelu,
měnící se barvy pixelu jako nutné, a psaní
ty, do verdiktu -
pixel po pixelu do verdikt scanline.
>> Jak začneme jít o to?
No, naštěstí, máme copy.c v distribuční kódu.
A tohle dokázat velmi užitečné pro nás.
Copy.c otevře soubor, přečte, že infile v záhlaví, a potom aktualizuje
outfile v záhlaví.
A pak se to čte každý pixel v scanline, pixel po pixelu, a pak
píše, že pixel do outFile.
>> Takže, může váš první krok bylo spustit následující
Příkaz v terminálu -
cp copy.c whodunit.c.
Tím se vytvoří kopie copy.c jmenoval whodunit.c.
Takže naše první krok k otevření soubor, dobře, tam je přesný
Replika, která v copy.c.
Tak jsem tě nechat, aby se na to.
>> Co máme co do činění s tímto pset se soubor I / O, v podstatě s soubory,
čtení, psaní, jejich editaci.
Jak si nejprve otevřete soubor?
No, budete deklarovat soubor ukazatel, a pak zavoláte
Funkce fopen.
Projít na cestě, nebo název, který soubor, a pak režim, který chcete
otevřít tento soubor palců
Předávání v r se otevře foo.bmp pro čtení.
Vzhledem k tomu, fopen s kolem v w otevřené bar.bmp, pro psaní soubor a
vlastně úprav.
>> Takže teď, že jsme otevřeli soubor, naše Dalším krokem je aktualizovat informace záhlaví
outFile.
Co je to info záhlaví?
No, nejprve musíme vědět, co je bitmapa.
Rastr je jen jednoduchý uspořádání bytů.
A oni jsou deklarovány v tomto souboru zde, bmp.h, s partou
informace o tom, co bitmapy je ve skutečnosti vyrobena z.
Ale to, co opravdu záleží, je záhlaví bitmapový obrázek, tady, a
bitmap info záhlaví, sem.
Záhlaví se skládá z několika Proměnné, které se ukáží jako velmi užitečné.
K dispozici je biSizeImage, který je Celková velikost obrazu v bajtech.
A to zahrnuje pixelů a polstrování.
Polstrování je velmi důležité, ale dostaneme se k tomu později.
>> BiWidth představuje šířku obrázku v pixelech minus polstrování.
BiHeight je pak také výšku obrazu v pixelech.
A pak BITMAPFILEHEADER a BITMAPINFOHEADER, jak jsem se zmínil
dříve, které jsou zastoupeny jako struktur.
Takže, není možné získat přístup k hlavičku souboru sama o sobě, ale budete chtít, aby se na
tyto proměnné uvnitř.
>> OK.
Tak jak jsme se aktualizovat informace záhlaví?
No, nejprve musíme zjistit, zda jsme potřebujete změnit jakékoli informace od
infile, vodítko, aby outfile, verdikt.
Je něco měnit v tomto případě?
No, vlastně, protože jedeme být jen změnou barvy.
Nebudeme se změnou souboru velikost, velikost obrazu, šířka,
nebo výšky.
Takže jste v pořádku, teď by jen kopírování každý pixel.
>> OK.
Takže teď se pojďme podívat na to, jak jsme se vlastně může přečíst každý pixel ze souboru.
Další soubor I / O funkce přijde do hry -
fread.
Trvá na ukazatel na struct který bude obsahovat bajtů, které
čtete.
Takže čtete do toho.
A pak se projít do velikosti, která je velikost každého prvku, který
chcete přečíst.
Zde funkce sizeof přijde vhod.
Pak můžete projít v počtu, který představuje počet prvků
Velikost ke čtení.
A nakonec, inptr, který je soubor ukazatel, který jste
bude číst z.
Takže všechny tyto prvky jsou uvnitř inptr a jdou k datům.
>> Podívejme se na malý příklad.
Pokud chci, aby si do datových dvěma psy, No, můžu to udělat jedním ze dvou způsobů.
Můžu buď číst ve dvou objektech o velikosti pes z mého inptr, nebo mohu přečíst
v jednom objektu o velikosti dvou psů.
Takže vidíte, že v závislosti na způsobu že si sjednat velikost a počet, vás
může číst ve stejném počtu bajtů.
>> Takže teď, pojďme změnit barva pixelu, jak potřebujeme.
Podíváte-li se na bmp.h znovu, uvidíte, že na dně
RGBTRIPLEs jsou další struct, kde se skládá ze tří bajtů.
Jeden, rgbtBlue, rgbtGreen, a rgbtRed.
Takže každý z nich představuje částku modré, množství zeleně, a
množství červené uvnitř tohoto pixelu, pokud každá částka je zastoupena
hexadecimální číslo.
>> Takže FF0000 bude modrá barva, , protože to jde od modré,
na zelenou až po červenou.
A pak f je bude bílá.
Pojďme se podívat na smiley.bmp, které máte v distribučním kódu.
Pokud ho otevřít jen v obraze divák, pak budete
jen vidět červený smajlík.
Ale s hlubší ponor do, my budeme vidět, že struktura
ze je to jen pixelů.
Máme bílé pixely, a pak červené pixelů.
Bílá, ffffff, a pak všichni červené pixely jsem barevné v pro vás
tady, a uvidíte, že jsou to 0000FF.
Zero modrá, zelená nula, a plná červená.
A protože smiley je osm pixelů, nemáme žádnou výplň.
Dobrá.
>> Takže pokud bych měl přiřadit různé hodnoty na RGBTRIPLE a chtěl jsem, aby
aby to zelené, pak to, co budu dělat, je Chtěl bych prohlásit RGBTRIPLE, s názvem
třílůžkový, a pak přístup k každý byte v rámci tohoto struct I
by pomocí operátoru tečka.
Takže triple.rgbtBlue, mohu přiřadit, že na 0.
Zelená mohu přiřadit ji k plné - jakýkoli číslo, opravdu, mezi 0 a násl.
A pak červená, já jsem také chtěl říct 0..
Tak to mi dává zelenou pixel.
>> Dále, co když chci zkontrolovat hodnota něco?
Mohl bych mít něco, co kontroluje zda rgbtBlue hodnota trojitého je
ff a pak vytisknout, "Cítím se blue! ", jako výsledek.
No, to nemusí nutně znamenat, že pixel je modrá, ne?
Vzhledem k tomu, zelené a červené hodnoty pixelu by mohl mít také non-0 hodnoty.
Vše, co to znamená, a to vše to je kontrola je
pro plnou modrou barvu.
Ale všechny pixelů může mít i částečná barevné hodnoty, jako je tato,
Další příklad zde.
>> Je to trochu těžší vidět co tento obraz je nyní.
Vypadá to trochu jako clue.bmp, které budete mít.
Nyní, fyzicky, můžete to vyřešit, protože tam je spousta červené, které
drží červenou obrazovku do obrazu tak, že se mohou objevit další barvy.
Tak jak jsme se napodobovat to s c?
No, mohli bychom odstranit všechny červené z obrazu úplně.
A tak k tomu, že bychom nastavit každý pixelu red hodnotu 0..
A tak obraz bude vypadat trochu trochu jako to, kde máme žádnou červenou
vůbec.
>> Můžeme vidět skrytou zprávu s trochu více nyní jasně.
Je to další smajlíky.
Nebo možná bychom mohli použít jinou metodu.
Možná, že bychom mohli identifikovat všechny červené pixely -
to znamená, že všechny pixely s 0 modrá, 0 zelené a 0 červená -
a změnit ty na bílou.
A náš obraz může vypadat něco takového.
Trochu lépe vidět.
>> Existuje mnoho jiných způsobů, jak odkrýt tajné zprávy, stejně,
zabývající se manipulací barev.
Možná, že můžete použít jednu z metod že jsem se zmínil výše.
A navíc, možná budete chtít zlepšit některé barvy
a přinést ty ven.
>> Takže teď, že jsme změnili pixel barva, další jen je třeba jim napsat
se do scanline, pixel po pixelu.
A ještě jednou, budete chtít podívat zpět na copy.c, pokud jste kopírovat
to už, a podívat se na fwrite funkce, které se údaje, ukazatel
na struct, který obsahuje bajtů že čtete z, velikosti
položky, počet kusů, a pak outptr -
určení těchto souborů.
>> Poté, co píšete v pixelech, budete si muset vybrat také muset napsat do polstrování.
Co je polstrování?
No, každý rgbt pixel je tři bajtů.
Ale scanline pro bitmapový obraz musí být násobkem čtyř bajtů.
A v případě, že počet pixelů není násobkem čtyř, pak musíme přidat
tento polstrování.
Polstrování je jen zastoupena 0s.
Tak, jak jsme se psát, nebo číst to?
No, ukázalo se, že nemůžete vlastně fread polstrování, ale můžete
výpočtu.
>> V tomto případě, vodítko a verdikt mají stejnou šířku, takže
polstrování je stejný.
A padding, jak uvidíte v copy.c, se vypočítá
s níže vzorce -
bi.biWidth krát sizeof (RGBTRIPLE) bude dát nám, kolik bajtů bmp
má v každém řádku.
Odtud módulos a rozdíly se 4 lze vypočítat, jak
mnoho bytů musí být přidány tak, aby násobek bajtů na
každý řádek je čtyři.
>> Nyní, když máme vzorec pro kolik padding potřebujeme, nyní
můžeme napsat.
Teď jsem se zmínil dříve, polstrování je jen 0s.
Takže v tomto případě, my jsme jen uvedení char, v tomto případě 0, do našeho
outptr - naše outfile.
Takže to může být jen fputc 0, čárka outptr.
>> Takže, když jsme četli v našich soubor, soubor I / O udržuje přehled o našich
pozice v těchto souborech s něčím tzv. ukazatel pozice v souboru.
Ber to jako kurzor.
V podstatě, to postupuje pokaždé že jsme fread, ale máme
kontrolu nad ním, taky.
>> Chcete-li přesunout ukazatel pozice v souboru, můžete použít funkci fseek.
V případě, že inptr představuje soubor ukazatel, že jste hledání v,
částka je počet bajtů, které chcete přesunout kurzor, a poté od
se vztahuje k referenčnímu bodu z místa, kde je kurzor.
Pokud předáte v SEEK_CUR, že představuje proud
pozice v souboru.
Nebo můžete použít některé další parametry.
Takže, můžeme chtít použít fseek přeskočit na čalounění souboru v.
A opět, pokud jste přilepená, je tu příkladem, který v copy.c.
>> Takže teď jsme otevřeli soubor, stopa, a verdikt.
Aktualizovali jsme informace, záhlaví pro náš verdikt, protože každý
bitmap potřebuje záhlaví.
My jsme potom si přečtěte na vodítko je scanline, pixel po pixelu, změnou
každá barva je to nezbytné, a psaní těch, do
Verdikt, pixel po pixelu.
Po otevření verdikt, můžete vidět, kdo viník, nebo to, co tajemství
Zpráva je.
Jmenuji se Zamyla, a to detektivka.