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