[MUSIC PLAYBACK] ZAMYLA CHAN: Bolo to slečna Scarlett s svietnika. Detektívka? Dobre, ideme to zistiť. V doskové hry Clue, môžete byť fyzické červený obraz. A že obraz je veľmi červené a fľakatý, a vašou úlohou je odhaliť skryté posolstvo. A zvyčajne ste za predpokladu, s červenou zväčšovacie sklo, alebo červené obrazovky ukazujú, že skryté posolstvo. No, budeme napodobňovať. V detektívka, že ste daný rastrový obrázok ktorý vyzerá veľmi uhrovitý a červenej, a potom spustite program detektívka odhaliť skryté posolstvo. Takže poďme rozbiť to na schodoch. Po prvé, budete chcieť otvoriť súbor - vodítko, ktoré ste dostali. A potom tiež vytvoriť Verdikt bitmapový obrázok. Potom chcete aktualizovať bitmapu header info na verdikt outFile. Viac o tom neskôr. A potom budete čítať do stopa, scanline, pixel po pixeli, meniace sa farby pixelu ako potrebné, a písanie tie, do verdiktu - pixel po pixeli do verdikt scanline. Ako začneme ísť o to? No, našťastie, máme copy.c v distribučnej kódu. A toto dokázať veľmi užitočné pre nás. Copy.c otvorí súbor, prečíta, že Infil v záhlaví, a potom aktualizuje outfile v záhlaví. A potom sa to číta každý pixel v scanline, pixel po pixeli, a potom píše, že pixel do outFile. Takže, môže váš prvý krok bolo spustiť nasledujúce Príkaz v termináli - cp copy.c whodunit.c. Tým sa vytvorí kópia copy.c menoval whodunit.c. Takže naše prvý krok k otvoreniu súbor, dobre, tam je presný Replika, ktorá v copy.c. Tak som ťa nechať, aby sa na to. Čo máme čo do činenia s týmto pset sa súbor I / O, v podstate s súbory, čítanie, písanie, ich editáciu. Ako si najprv otvorte súbor? No, budete deklarovať súbor ukazovateľ, a potom zavoláte Funkcie fopen. Prejsť na ceste, alebo názov, ktorý súbor, a potom režim, ktorý chcete otvoriť tento súbor palcov Odovzdávanie v r sa otvorí foo.bmp pre čítanie. Vzhľadom k tomu, fopen s kolesom v w otvorené bar.bmp, pre písanie súbor a vlastne úprav. Takže teraz, že sme otvorili súbor, naša Ďalším krokom je aktualizovať informácie záhlaví outFile. Čo je to info hlavičky? No, najprv musíme vedieť, čo je bitmapa. Raster je len jednoduchý usporiadanie bytov. A oni sú deklarované v tomto súbore tu, bmp.h, s partiou informácie o tom, čo bitmapy je v skutočnosti vyrobená z Ale to, čo naozaj záleží, je záhlavie bitmapový obrázok, tu, a bitmap info záhlavie, sem. Záhlavie sa skladá z niekoľkých Premenné, ktoré sa ukážu ako veľmi užitočné. K dispozícii je biSizeImage, ktorý je Celková veľkosť obrazu v bajtoch. A to zahŕňa pixelov a polstrovanie. Polstrovanie je veľmi dôležité, ale dostaneme sa k tomu neskôr. BiWidth predstavuje šírku obrázku v pixeloch mínus polstrovanie. BiHeight je potom tiež výšku obrazu v pixeloch. A potom BITMAPFILEHEADER a BITMAPINFOHEADER, ako som sa zmienil skôr, ktoré sú zastúpené ako štruktúr. Takže, nie je možné získať prístup k hlavičku súboru sama o sebe, ale budete chcieť, aby sa na tieto premenné vnútri. OK. Tak ako sme sa aktualizovať informácie hlavičky? No, najprv musíme zistiť, či sme potrebujete zmeniť akékoľvek informácie od Infil, vodítko, aby outfile, verdikt. Je niečo meniť v tomto prípade? No, vlastne, pretože ideme byť len zmenou farby. Nebudeme sa zmenou súboru veľkosť, veľkosť obrazu, šírka, alebo výšky. Takže ste v poriadku, teraz by len kopírovanie každý pixel. OK. Takže teraz sa poďme pozrieť na to, ako sme sa vlastne môže prečítať každý pixel zo súboru. Ďalší súbor I / O funkcie príde do hry - fread. Trvá na ukazovateľ na struct ktorý bude obsahovať bajtov, ktoré čítate. Takže čítate do toho. A potom sa prejsť do veľkosti, ktorá je veľkosť každého prvku, ktorý chcete prečítať. Tu funkcia sizeof príde vhod. Potom môžete prejsť v počte, ktorý predstavuje počet prvkov Veľkosť na čítanie. A nakoniec, inptr, ktorý je súbor ukazovateľ, ktorý ste bude čítať z Takže všetky tieto prvky sú vo vnútri inptr a idú k dátam. Pozrime sa na malý príklad. Ak chcem, aby si do dátových dvoma psami, No, môžem to urobiť jedným z dvoch spôsobov. Môžem buď čítať v dvoch objektoch o veľkosti pes z môjho inptr, alebo môžem prečítať v jednom objekte o veľkosti dvoch psov. Takže vidíte, že v závislosti na spôsobe že si dojednať veľkosť a počet, vás môže čítať v rovnakom počte bajtov. Takže teraz, poďme zmeniť farba pixelu, ako potrebujeme. Ak sa pozriete na bmp.h znova, uvidíte, že na dne RGBTRIPLEs sú ďalšie struct, kde sa skladá z troch bajtov. Jeden, rgbtBlue, rgbtGreen, a rgbtRed. Takže každý z nich predstavuje čiastku modré, množstvo zelene, a množstvo červenej vnútri tohto pixelu, ak každá suma je zastúpená hexadecimálne číslo. Takže FF0000 bude modrá farba, , Pretože to ide od modrej, na zelenú až po červenú. A potom f je bude biela. Poďme sa pozrieť na smiley.bmp, ktoré máte v distribučnom kódu. Ak ho otvoriť len v obraze divák, potom budete len vidieť červený smajlík. Ale s hlbší ponor do, my budeme vidieť, že štruktúra ze je to len pixelov. Máme biele pixely, a potom červené pixelov. Biela, ffffff, a potom všetci červené pixely som farebné v pre vás tu, a uvidíte, že sú to 0000FF. Zero modrá, zelená nula, a plná červená. A pretože smiley je osem pixelov, nemáme žiadnu výplň. Dobrá. Takže ak by som mal priradiť rôzne hodnoty na RGBTRIPLE a chcel som, aby aby to zelené, potom to, čo budem robiť, je Chcel by som vyhlásiť RGBTRIPLE, s názvom trojlôžková, a potom prístup k každý byte v rámci tohto struct Aj by pomocou operátora bodka. Takže triple.rgbtBlue, môžem priradiť, že na 0. Zelená môžem priradiť ju k plnej - akýkoľvek číslo, naozaj, medzi 0 a nasl. A potom červená, ja som tiež chcel povedať 0.. Tak to mi dáva zelenú pixel. Ďalej, čo keď chcem skontrolovať hodnota niečo? Mohol by som mať niečo, čo kontroluje či rgbtBlue hodnota trojitého je ff a potom vytlačiť, "Cítim sa blue! ", ako výsledok. No, to nemusí nutne znamenať, že pixel je modrá, nie? Vzhľadom k tomu, zelenej a červenej hodnoty pixelu by mohol mať tiež non-0 hodnoty. Všetko, čo to znamená, a to všetko to je kontrola je pre plnú modrú farbu. Ale všetky pixelov môže mať aj čiastočná farebné hodnoty, ako je táto, Ďalší príklad tu. Je to trochu ťažšie vidieť čo tento obraz je teraz. Vyzerá to trochu ako clue.bmp, ktoré budete mať. Teraz, fyzicky, môžete to vyriešiť, pretože tam je veľa červenej, ktoré drží červenú obrazovku do obrazu tak, že sa môžu objaviť ďalšie farby. Tak ako sme sa napodobňovať to s c? No, mohli by sme odstrániť všetky červené z obrazu úplne. A tak k tomu, že by sme nastaviť každý pixelu red hodnotu 0.. A tak obraz bude vyzerať trochu trochu ako to, kde máme žiadnu červenú vôbec. Môžeme vidieť skrytú správu s trochu viac teraz jasne. Je to ďalšie smajlíky. Alebo možno by sme mohli použiť inú metódu. Možno, že by sme mohli identifikovať všetky červené pixely - to znamená, že všetky pixely s 0 modrá, 0 zelenej a 0 červená - a zmeniť tie na bielu. A náš obraz môže vyzerať niečo také. Trochu lepšie vidieť. Existuje mnoho iných spôsobov, ako odkryť tajné správy, rovnako, zaoberajúce sa manipuláciou farieb. Možno, že môžete použiť jednu z metód že som sa zmienil vyššie. A navyše, možno budete chcieť zlepšiť niektoré farby a priniesť tie von. Takže teraz, že sme zmenili pixel farba, ďalšie len treba im napísať sa do scanline, pixel po pixeli. A ešte raz, budete chcieť pozrieť späť na copy.c, ak ste kopírovať to už, a pozrieť sa na fwrite funkcie, ktoré sa údaje, ukazovateľ na struct, ktorý obsahuje bajtov že čítate z, veľkosti položky, počet kusov, a potom outptr - určenie týchto súborov. Potom, čo píšete v pixeloch, budete si musieť vybrať tiež musieť napísať do polstrovanie. Čo je polstrovanie? No, každý rgbt pixel je tri bajtov. Ale scanline pre bitmapový obraz musí byť násobkom štyroch bajtov. A v prípade, že počet pixelov nie je násobkom štyroch, potom musíme pridať tento polstrovanie. Polstrovanie je len zastúpená 0s. Tak, ako sme sa písať, alebo čítať to? No, ukázalo sa, že nemôžete vlastne fread polstrovanie, ale môžete výpočtu. V tomto prípade, vodítko a verdikt majú rovnakú šírku, takže polstrovanie je rovnaký. A padding, ako uvidíte v copy.c, sa vypočíta s nižšie vzorca - bi.biWidth krát sizeof (RGBTRIPLE) bude dať nám, koľko bajtov bmp má v každom riadku. Odtiaľ módulos a rozdiely so 4 možno vypočítať, ako veľa bytov musia byť pridané tak, aby násobok bajtov na každý riadok je štyri. Teraz, keď máme vzorec pre koľko padding potrebujeme, teraz môžeme napísať. Teraz som sa zmienil predtým, polstrovanie je len 0s. Takže v tomto prípade, my sme len uvedenie char, v tomto prípade 0, do nášho outptr - naše outfile. Takže to môže byť len fputc 0, čiarka outptr. Takže, keď sme čítali v našich súbor, súbor I / O udržuje prehľad o našich pozície v týchto súboroch s niečím tzv ukazovateľ pozície v súbore. Ber to ako kurzor. V podstate, to postupuje zakaždým že sme fread, ale máme kontrolu nad ním, taky. Ak chcete presunúť ukazovateľ pozície v súbore, môžete použiť funkciu fseek. V prípade, že inptr predstavuje súbor ukazovateľ, že ste hľadanie v, suma je počet bajtov, ktoré chcete presunúť kurzor, a potom od sa vzťahuje k referenčnému bodu z miesta, kde je kurzor. Ak odovzdáte v SEEK_CUR, že predstavuje prúd pozície v súbore. Alebo môžete použiť niektoré ďalšie parametre. Takže, môžeme chcieť použiť fseek preskočiť na čalúnenie súboru v. A opäť, ak ste prilepené, je tu príkladom, ktorý v copy.c. Takže teraz sme otvorili súbor, stopa, a verdikt. Aktualizovali sme informácie, záhlavie pre náš verdikt, pretože každý bitmap potrebuje hlavičky. My sme potom si prečítajte na vodítko je scanline, pixel po pixeli, zmenou každá farba je to nevyhnutné, a písanie tých, do Verdikt, pixel po pixeli. Po otvorení verdikt, môžete vidieť, kto vinník, alebo to, čo tajomstvo Správa je. Volám sa Zamyla, a to detektívka.