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