>> [Muzikavimo]
>> ZAMYLA CHAN: Tai buvo Mis Scarlett su žvakide.
Detektīvromāns?
Na, mes ketiname sužinoti.
Į stalo žaidimas Clue, galite būti fiziškai raudoną vaizdą.
Ir, kad vaizdas yra labai raudona ir dėmėtas, ir jūsų darbas yra
atskleisti paslėptą žinutę.
Ir paprastai jūs aprūpinami raudona didinamasis stiklas, arba raudonas ekranas
atskleisti, kad paslėptas pranešimą.
Na, mes ketiname imituoti kad.
>> Be Detektīvromāns, jums suteikta bitmap paveikslėlis kad atrodo labai margas ir raudona,
ir paleiskite Detektīvromāns programą atskleisti paslėptą žinutę.
>> Taigi leiskite įsilaužti į etapus tai.
Pirma, jūs norite atidaryti failą - clue, kad jūs buvote.
Ir tada taip pat sukurti verdiktas Bitmap failą.
Tada jūs norite atnaujinti bitmap header info verdiktas outfile.
Daugiau apie tai vėliau.
Ir tada jūs ketinate skaityti į raktas, Scanline pikselių pixel,
keisti pikselių spalvos kaip reikia, ir rašymas
tiems į nuosprendį -
pikselių pixel į verdiktas Scanline.
>> Kaip mes pradėsime eiti apie tai?
Na, laimei, mes turime copy.c platinimo kodas.
Ir tai ketina įrodyti labai naudinga mums.
Copy.c atidaro failą, skaito, kad infile antraštėje, o tada atnaujina
outfile antraštėje.
Ir tada jis skaito kiekvieną pikselį į Scanline pikselių pixel, tada
rašo, kad pikselis į outfile.
>> Taigi, jūsų pirmas žingsnis galėtų būti paleisti po
komandą terminale -
cp copy.c whodunit.c.
Tai padės sukurti kopiją copy.c pavadintas whodunit.c.
Taigi, mūsų pirmasis žingsnis siekiant pradėti failas, gerai, ten tiksli
replika, kad copy.c.
Taigi, aš paliksiu jums pažvelgti į tai.
>> Ką mes susiduriame su šiuo PSET yra failą I / O, iš esmės atsižvelgiant failus,
skaitymas, rašymas, juos redaguoti.
Kaip pirmą kartą atidaryti failą?
Na, jūs ketinate paskelbti failą žymeklis, ir tada jums paskambinti
Funkcija fopen.
Pereiti į kelią, arba kad pavadinimas failą ir tada režimas, kurį norite
atidaryti tą failą in
Kelias į r atvers foo.bmp skaityti.
Kadangi fopen su einančios W bus atvira bar.bmp, rašyti į failą ir
faktiškai jį redaguoti.
>> Taigi dabar, kad mes atidarė failą, mūsų Kitas žingsnis yra atnaujinti antraštės informacija
už outfile.
Kas antraštės informacijos?
Na, visų pirma turime žinoti kas rastras yra.
Rastras yra tik paprastas susitarimas baitų.
Ir jie paskelbė šioje byloje čia bmp.h, su krūva
informacija apie tai, kas rastras yra faktiškai pagamintas iš.
Bet ką mes tikrai rūpi Bitmap failą antraštė, čia ir
rastras informacija antraštė, čia.
Antraštė sudarytas iš poros kintamieji, kurie bus labai naudingi.
Yra biSizeImage, kuris yra Bendras dydis baitais įvaizdį.
Ir tai apima vaizdo ir paminkštinimas.
Apmušalas yra labai svarbi, tačiau mes susisieksime vėliau.
>> BiWidth atstovauja pločio įvaizdis pikselių atėmus paminkštinimas.
BiHeight tada taip pat aukštis iš pikseliais įvaizdį.
Ir tada BITMAPFILEHEADER ir BITMAPINFOHEADER, kaip minėjau
anksčiau, tie, kurie atstovauja kaip structs.
Taigi, jūs negalite pasiekti failo antraštę pati, bet jūs norite gauti
tie kintamieji viduje.
>> Gerai.
Taigi, kaip mes atnaujinti antraštės informacijos?
Na, pirmiausia turime išsiaiškinti, ar mes reikia pakeisti bet kokią informaciją iš
INFILE, raktas, į outfile, verdiktas.
Ar kas nors keičiasi tokiu atveju?
Na, ne iš tikrųjų, nes mes ketiname reikia tiesiog pakeisti spalvas.
Mes neketiname keičiasi failą dydis, vaizdo dydį, plotis,
arba aukštis.
Taigi jūs visi tinka dabar, tiesiog kopijuojant kiekvieną pikselį.
>> Gerai.
Taigi dabar pažvelkime, kaip mes iš tikrųjų gali skaityti kiekvieną pikselį iš failo.
Kitas failą I / O funkcijos ateis į žaidimą -
fread.
Ji trunka rodyklė į struct kad bus pateiktos baitų kad
jūs skaitote.
Taigi jūs skaitote į tai.
Ir tada jūs praeiti dydžio, kuris yra kiekvieno elemento dydis, kad jūs
nori perskaityti.
Čia funkcija sizeof praverčia.
Tada pereisite skaičiaus, kuris atstovauja elementų skaičius
dydis skaityti.
Ir galiausiai, inptr, kuris yra Failas žymeklis, kad esate
ketinate skaityti.
Taigi visų šių elementų viduje inptr ir jie ketina naudotis duomenimis.
>> Pažvelkime šiek tiek pavyzdyje.
Jei aš noriu skaityti į duomenų dviem šunimis, gerai, aš galiu tai padaryti vienu iš dviejų būdų.
Galiu arba skaityti dviejų objektų dydį šuo nuo mano inptr, ar aš galiu skaityti
vienoje prieštarauti dviejų šunų dydį.
Taigi matote, kad priklausomai nuo to, kaip kad jums organizuoti dydį ir skaičių, jums
galite skaityti toje pačioje baitų skaičius.
>> Taigi dabar galime pakeisti pikselių spalvos kaip mums reikia.
Jei pažvelgti bmp.h vėl, tada pamatysite, kad apačioje
RGBTRIPLEs yra dar struct, kur jie susideda iš trijų baitų.
Vienas iš jų, rgbtBlue, rgbtGreen ir rgbtRed.
Taigi, kiekvienas iš jų yra ta suma, mėlyna, žalia suma, ir
suma raudona viduje šis pikselių, kur kiekviena suma yra atstovaujama
šešioliktainis skaičius.
>> Taigi Ff0000 bus mėlyna spalva, nes jis eina iš mėlynos,
žalia, raudona.
Ir tada visi f s bus balta.
Leiskite pažvelgti smiley.bmp išvaizdą, kuri jūs turite savo platinimo kodas.
Jei atidarote jį tik vaizdo žiūrovas, tada jūs
tiesiog pamatyti raudoną veiduką.
Tačiau atsižvelgiant giliau pasinerti mes matyti, kad struktūra
ji yra tik pikselių.
Mes turime baltos pikselių, ir tada raudonos taškų.
Baltas, FFFFFF, ir tada visi raudonos pikselių aš spalvoti už jus
čia, ir pamatysite, kad jie 0000FF.
Nulis mėlynas nulis žalia, ir visiškai raudona.
O kadangi šypsenėlių aštuonių pikselių pločio, mes neturime jokios paminkštinimas.
Gerai.
>> Taigi, jei aš buvo priskirti skirtingas reikšmes į RGBTRIPLE ir norėjau
kad ji žalia, tada ką aš norėčiau padaryti, tai Norėčiau paskelbti RGBTRIPLE, pavadintas
triviečiai, ir tada naudotis kiekvienas baitų per tą struct I
naudotų dot operatorių.
Taigi triple.rgbtBlue, galiu priskirti, kad prie 0.
Žalioji galiu priskirti ją visą - bet skaičius, iš tikrųjų, tarp 0 ir ff.
Ir tada raudona, aš taip pat ketina pasakyti 0.
Taigi, kad suteikia man žalia taškų.
>> Be to, ką daryti, jei aš noriu patikrinti kažkas vertė?
Galėjau kažką, kad patikrinimai ar trigubo savo rgbtBlue vertė yra
ff ir tada spausdinti, "Aš jaučiuosi mėlyna! ", kaip rezultatas.
Dabar, tai nebūtinai reiškia, kad pikselių yra mėlynos, tiesa?
Kadangi pikselių yra žalios ir raudonos vertės taip pat gali turėti ne 0 vertybes.
Visi, kad tai reiškia, ir visa tai tai tikrinti yra
už visą mėlynos spalvos.
Bet visi pikseliai taip pat gali turėti dalinis spalvų reikšmes, kaip tai
Kitas pavyzdys čia.
>> Tai šiek tiek sunkiau pamatyti ką šis paveikslėlis yra dabar.
Tai atrodo šiek tiek daugiau kaip clue.bmp, kad jums bus suteikta.
Dabar, fiziškai, galite išspręsti šią problemą, nes ten yra raudonos, burtų
telpa raudoną ekraną vaizdą, kad kad kitos spalvos gali atsirasti.
Taigi, kaip mes imituoti tai su C?
Na, mes galime pašalinti visus raudonai iš paveikslėlio visiškai.
Ir taip padaryti, kad mes norime nustatyti kiekvieną PIXEL raudonųjų vertė 0.
Ir todėl vaizdas atrodys šiek tiek šiek tiek, kaip tai, kur mes neturime raudona
apskritai.
>> Mes galime matyti paslėptą Pranešimu šiek tiek aiškiau dabar.
Tai dar vienas smiley veido.
O gal mes galime naudoti kitą metodą.
Galbūt, mes galime nustatyti visos raudonos pikselių -
tai yra, visi pikselių su 0 mėlynas, 0 žalios ir 0 raudona -
ir pakeisti tuos, baltos spalvos.
Ir mūsų paveikslėlis gali atrodyti kažkas panašaus į tai.
Šiek tiek lengviau pamatyti.
>> Yra daug kitų būdų, kaip atskleisti paslaptis pranešimą, taip pat,
susiduriame su spalvų manipuliacijos.
Gal galite naudoti vieną iš metodų kad aš jau minėjau.
Ir be to, galbūt norėsite padidinti kai kurių spalvų
ir patraukti dėmesį.
>> Taigi dabar, kad mes pakeitėme pikselių spalva, kitą mes tiesiog reikia parašyti jiems
prie Scanline pikselių pixel.
Ir dar kartą, jūs norėsite pažvelgti atgal į copy.c, jei nebus kopijuojamas
tai jau, ir pažvelgti į fwrite funkcija, kuri paima duomenis, žymeklis
į struct, kuriame baitus kad jūs skaitote iš jos dydis
elementus, elementų skaičius, ir tada outptr -
Šių failų paskirties.
>> Po rašote pikselių, jums taip pat turi parašyti išklojimui.
Kas yra prikimšti?
Na, kiekvienas rgbt pikselių yra trys baitų ilgio.
Bet už rastrinis vaizdas Scanline turi būti keturių baitų kartotinis.
Ir jei pikselių skaičius nėra kartotinis keturių, tada mes turime pridėti
tai apdaila.
Apmušalas yra tik atstovauja 0s.
Taigi, kaip mes rašome, ar tai perskaityti?
Na, paaiškėja, kad tu negali faktiškai fread apdaila, bet jūs galite
apskaičiuoti.
>> Šiuo atveju, raktas ir verdiktas turėti tokio pat pločio, todėl
Apmušalas yra tas pats.
Ir prikimšti, kaip pamatysite į copy.c, apskaičiuojamas
su žemiau formulę -
bi.biWidth kartus sizeof (RGBTRIPLE) bus mums duoda, kiek baitų bmp
yra kiekvienoje eilutėje.
Iš ten, modulos ir atimti su 4 galima apskaičiuoti kaip
turi būti pridėtas daug baitų kad baitų keliuose
kiekvienoje eilutėje yra keturi.
>> Dabar, mes turime už formulę kiek prikimšti turime dabar
mes galime jį rašyti.
Dabar aš jau minėta, Apmušalas yra tik 0s.
Taigi šiuo atveju, mes tiesiog išleisti char, šiuo atveju 0, į mūsų
outptr - mūsų outfile.
Taigi, kad gali būti tik fputc 0 kablelis outptr.
>> Taigi, nors mes jau skaitant į mūsų failą, failas I / O yra nuolat stebėti mūsų
pozicija tose failus su kažkuo vadinamas failą padėties indikatorius.
Pagalvokite apie tai, kaip žymeklį.
Iš esmės, tai avansų kiekvieną kartą kad mes fread, bet mes turime
kontroliuoti jį, taip pat.
>> Norėdami perkelti failą padėties indikatorius, galite naudoti funkciją fseek.
Kur inptr atstovauja failą žymeklis, kad esate ieško ir,
suma yra baitų skaičius, kad jūs norite perkelti žymeklį, tada iš
susijęs su atskaitos taško iš kur kursorius yra.
Jei praeiti SEEK_CUR, kad atstovauja srovę
pozicija faile.
Arba galite naudoti kai kuriuos kitus parametrus.
Taigi, mes galbūt norėsite naudoti fseek praleisti virš faile paminkštinimas.
Ir vėl, jei esate pakimba, ten tai yra iš copy.c. pavyzdys
>> Taigi dabar mes jau atidarė failą, raktas, ir verdiktas.
Mes atnaujinome antraštės info Mūsų verdiktas, nes kiekvienas
rastras turi antraštę.
Mes tada skaityti į clue, s Scanline pikselių pixel, keičiant
kiekviena spalva reikia, ir rašyti tie, kurie į
verdiktas pikselių pixel.
Atidarius nuosprendį, jūs galite pamatyti, kas kaltininkas, ar kas paslaptis
pranešimas.
Mano vardas Zamyla ir tai buvo Detektīvromāns.