[MUSIC Playing] ZAMYLA CHAN: Ishte Mis Scarlett me shandanit. Roman policor? E pra, ne jemi duke shkuar për të mësuar. Në të lojës Clue, ju mund të jepet një imazh fizik të kuqe. Dhe se imazhi është shumë e kuqe dhe njolla, dhe puna juaj është për të zbulojë mesazhin fshehur. Dhe zakonisht ju jeni të pajisur me një të kuqe lupë, ose një ekran të kuqe për të zbulojnë këtë mesazh fshehur. E pra, ne do të imitoj atë. Në roman policor, ju jeni të dhënë një imazh bitmap që duket shumë njolla dhe të kuqe, dhe pastaj të drejtuar programin roman policor për të zbuluar një mesazh të fshehur. Pra, le të thyejnë këtë në hapa. Së pari, ju doni të hapur dosjen - dhënë që ju keni qenë dhënë. Dhe pastaj të krijojë një Verdikti bitmap fotografi. Pastaj ju doni të rinovuar bitmap header info për outfile aktgjykimit. Më shumë për këtë më vonë. Dhe atëherë ju do të jeni për të lexuar në clue, scanline, pixel nga pixel, duke ndryshuar ngjyrat pixel si nevojshme, dhe shkrim ata në aktgjykimit - pixel nga pixel në scanline aktgjykimi. Si mund të fillojnë të shkuar në lidhje me këtë? E pra, për fat të mirë, ne kemi copy.c në kodin e shpërndarjes. Dhe kjo do të provojë mjaft e dobishme për ne. Copy.c hap një dosje, thuhet në se header infile-së, dhe pastaj përditëson header outfile-së. Dhe pastaj ai lexon çdo piksel në scanline, pixel nga pixel, dhe më pas shkruan se piksel në outfile. Pra, hapi juaj i parë mund të jetë për të drejtuar në vijim komandës në terminal - cp copy.c whodunit.c. Kjo do të krijojë një kopje të copy.c quajtur whodunit.c. Pra, hapi ynë i parë për të hapur fotografi, mirë, ka një saktë kopje e se në copy.c. Kështu që unë do të largohet nga ju për të parë në se. Ajo që ne jemi që kanë të bëjnë me të në këtë PSET është file I / O, në thelb duke marrë fotografi, lexim, shkrim, redaktimi ata. Si e keni hapur një skedar? E pra, ju jeni do të shpallë një skedar akrep, dhe pastaj ju e quani fopen Funksioni. Pass në rrugën, ose emrin e që paraqesë, dhe pastaj mënyra që ju dëshironi për të hapur këtë dosje in Kalimi në një r do të hapet foo.bmp për lexim. Ndërsa fopen me kalimin në një w do bar.bmp hapur, për të shkruar dosjen dhe në fakt redaktonit. Pra, tani që ne kemi hapur dosjen, tona Hapi tjetër është për të rinovuar info header për outfile. Çfarë është një info header? E pra, së pari ne duhet të dimë çfarë është një bitmap është. Një bitmap është vetëm një e thjeshtë marrëveshje e bytes. Dhe ata janë deklaruar në këtë fotografi këtu, bmp.h, me një bandë e Informata për atë që një bitmap është bërë në të vërtetë jashtë. Por ajo që ne me të vërtetë intereson është fotografi bitmap header, të drejtë këtu, dhe header bitmap info, mbi këtu. Header është i përbërë nga disa Variablat që do të provojë shumë i dobishëm. Ka biSizeImage, e cila është Madhësia e përgjithshme të imazhit në bytes. Dhe kjo përfshin pixels dhe mbushje. Mbushje është shumë e rëndësishme, por ne do të merrni për këtë më vonë. BiWidth përfaqëson gjerësia e image në minus pixels mbushje. BiHeight është atëherë edhe lartësia e imazhit në pixel. Dhe pastaj BITMAPFILEHEADER dhe BITMAPINFOHEADER, siç e përmenda më parë, ata që janë të përfaqësuara si structs. Pra, ju nuk mund të hyni në fotografi header vetë, por ju do të dëshironi të merrni për të ato variabla brenda. OK. Deri sa nuk kemi update info header? E pra, së pari ne duhet të shohim nëse ne nevojë për të ndryshuar ndonjë informacion nga infile, çelës, për të outfile, aktgjykimi. A është çdo gjë ndryshon në këtë rast? E pra, jo të vërtetë, sepse ne jemi duke shkuar që duhet vetëm të ndryshuar ngjyrat. Ne nuk do të jetë ndryshuar skedarin madhësia, madhësia imazhit, gjerësia, ose lartësia. Pra, ju jeni të gjithë të drejtë tani për tani nga vetëm kopjimi çdo piksel. OK. Pra, tani le të shohim se si ne në të vërtetë mund të lexoni çdo piksel nga file. Një tjetër fotografi I / O Funksioni do të hyjë në lojë - fread. Ajo merr në një tregues të struct që do të përmbajë bytes që ju jeni duke lexuar. Pra, ju jeni duke e lexuar në atë. Dhe pastaj ju të kalojë në një madhësi, e cila është madhësia e çdo element që ju dëshironi të lexoni. Këtu, funksioni sizeof do të jetë në dispozicion. Pastaj ju të kalojë në numër, të cilat paraqet numrin e elementeve të Madhësia për të lexuar. Dhe pastaj në fund, inptr, e cila është file pointer që ju jeni duke shkuar për të lexuar nga. Pra, të gjitha këto elemente janë brenda inptr dhe ata do të të dhënave. Le të shikojmë një shembull të vogël. Nëse unë dua të lexuar në të dhënat e dy qentë, mirë, unë mund të bëjë atë një nga dy mënyra. Unë mund të lexoj as në dy objektet e madhësisë qen nga inptr ime, ose unë mund të lexoni në një objekt madhësinë e dy qenve. Kështu që ju të shihni se në varësi të rrugës që ju të caktoni madhësinë dhe numrin, ju mund të lexoni në numrin e njëjtë të bytes. Deri tani, le të ndryshojë Ngjyra pixel si ne kemi nevojë. Nëse ju shikoni në bmp.h përsëri, atëherë ju do të shihni se në pjesën e poshtme RGBTRIPLEs janë një struct, ku ata janë të përbërë nga tre bytes. Një, rgbtBlue, rgbtGreen, dhe rgbtRed. Pra, secili prej tyre paraqet shumën e blu, shuma e gjelbër, dhe Shuma e kuqe brenda këtij pixel, ku çdo sasi është e përfaqësuar nga një numër heksadecimal. Pra ff0000 do të jetë një ngjyrë blu, për shkak se ajo shkon nga blu, për të gjelbër, të kuqe. Dhe pastaj të gjithë f-të do të jetë e bardhë. Le të bëjmë një vështrim në smiley.bmp, e cila ju keni në kodin tuaj të shpërndarjes. Nëse ju të hapur atë në vetëm një imazh viewer, atëherë ju do të vetëm të shihni një smiley kuqe. Por, duke marrë një pikiatë të thellë në, ne do të shohim se struktura e kjo është vetëm pixels. Ne kemi pixels të bardhë, dhe pastaj pixels kuqe. Bardhë, ffffff, dhe pastaj të gjithë pixels kuqe kam me ngjyrë në për ju këtu, dhe ju shihni se ata janë 0000ff. Zero blu, zero jeshile, të kuqe dhe të plotë. Dhe që smiley është tetë pixels i gjerë, ne nuk kemi asnjë mbushje. Dakord. Pra, nëse unë do të caktojë vlera të ndryshme në një RGBTRIPLE dhe kam kërkuar për të bërë atë të gjelbër, atëherë çfarë do të bëj është Unë do të shpallë një RGBTRIPLE, të quajtur trefishtë, dhe pastaj për të hyrë në çdo bajt brenda këtij struct I do të përdorni dot operatorin. Pra triple.rgbtBlue, unë mund caktojë që në 0. Green I mund të caktojë atë për të plotë - çdo numër, me të vërtetë, në mes 0 dhe ff. Dhe pastaj të kuqe, unë jam gjithashtu do të thotë 0. Prandaj që më jep një pixel gjelbër. Tjetra, ajo që në qoftë se unë dua të kontrolloni vlera e diçka? Unë mund të ketë diçka që kontrollon nëse vlera e trefishtë e rgbtBlue është ff dhe pastaj të shtypura, "Unë jam ndjenjë blu! ", si rezultat i kësaj. Tani, kjo nuk do të thotë që pixel është blu, e drejtë? Për shkak se vlera e gjelbër dhe të kuqe të pixel-së mund të ketë jo-0 vlerave. E gjithë kjo do të thotë kjo, dhe të gjitha që kjo është e kontrolluar për të është për një ngjyrë të plotë blu. Por të gjitha piksele mund të ketë të pjesshme Vlerat e ngjyra, si kjo shembull tjetër këtu. Kjo është pak e vështirë për të parë ajo që ky imazh është tani. Kjo duket pak më shumë si clue.bmp që ju do të jepet. Tani, fizikisht, ju mund të zgjidhur këtë, sepse nuk është një shumë e kuqe, nga mbajtjen e një ekran të kuqe për imazhin në mënyrë se ngjyrat e tjera mund të shfaqen. Deri sa nuk kemi të imitoj këtë me c? E pra, ne mund të hiqni të gjithë të kuqe nga imazhi krejtësisht. Dhe në mënyrë për të bërë këtë ne do të vendosin secili Vlera e kuqe pixel në 0. Dhe kështu imazhi do të dukej pak pak si kjo, ku ne nuk kemi të kuqe whatsoever. Ne mund të shohim mesazhin e fshehur a pak më qartë tani. Kjo është një tjetër fytyrë smiley. Apo ndoshta ne mund të përdorim një metodë tjetër. Ndoshta, ne mund të identifikojë gjitha piksel kuqe - që është, të gjithë nga piksel me 0 blu, jeshile 0, dhe 0 kuqe - dhe për të ndryshuar ato në të bardhë. Dhe imazhin tonë mund të duket diçka e tillë. A pak më e lehtë për të parë. Ka shumë mënyra të tjera për të zbuluar Mesazhi sekret, si dhe, që kanë të bëjnë me manipulimin ngjyra. Ndoshta ju mund të përdorni një nga metodat e që kam përmendur më lart. Dhe përveç kësaj, ju mund të dëshironi për të rritur disa ngjyra dhe për të sjellë ato jashtë. Pra, tani që ne kemi ndryshuar pixel ngjyra, e ardhshëm ne vetëm duhet të shkruani ato në të scanline, pixel nga pixel. Dhe përsëri, ju do të dëshironi të shikoni prapa të copy.c, në qoftë se ju nuk e keni kopjuar ajo tashmë, dhe të kërkoni në fwrite funksion, i cili merr të dhënat, një akrep në struct që përmban byte që ju jeni duke lexuar nga, madhësia e sendet, numri i artikujve, dhe pastaj outptr - destinacioni i këtyre dosjeve. Pasi ta shkruani në pixels, ju do të gjithashtu duhet të shkruani në mbushje. Çfarë është mbushje? E pra, çdo pixel rgbt është tre bytes të gjatë. Por, scanline për një imazh bitmap duhet të jetë një shumëfish i katër bytes. Dhe nese numri i piksel nuk është një të shumta e katër, atëherë ne duhet të shtoni kjo mbushje. Mbushje është e përfaqësuar vetëm nga 0s. Pra, si nuk kemi shkruaj, apo lexoni këtë? E pra, ajo rezulton se ju nuk mund të mbushje të vërtetë fread, por ju mund të të llogaritur atë. Në këtë rast, çelës dhe vendimi kanë të njëjtën gjerësi, në mënyrë mbushje është njëjtë. Dhe mbushje, si ju do të shihni në copy.c, llogaritet me formulen e meposhtme - herë bi.biWidth sizeof (RGBTRIPLE) do të na japin sa bytes bmp ka në çdo rresht. Nga atje, modulos dhe ZBRITJET me 4 mund të llogarisim se si shumë bytes duhet të shtohen në mënyrë që shumta të bytes në çdo rresht është katër. Tani që ne kemi formulën për se sa mbushje ne kemi nevojë, tani ne mund të shkruajnë atë. Tani, e përmenda më parë, mbushje është vetëm 0s. Pra, në këtë rast, ne jemi vetëm duke një char, në këtë rast një 0, në tonë outptr - outfile tonë. Kështu që mund të jetë vetëm fputc 0, presje outptr. Kështu, ndërsa ne kemi qenë duke lexuar në tonë fotografi, file I / O ka mbajtur gjurmët e tona Pozita në ato fotografi me diçka quajtur tregues pozita fotografi. Mendoni se si një kursorit. Në thelb, ajo përparon çdo herë se ne fread, por ne kemi kontroll mbi të, too. Për të lëvizur treguesin e pozicionit fotografi, ju mund të përdorni fseek funksion. Ku inptr përfaqëson fotografi tregues që ju jeni duke kërkuar në, shumë është numri i bytes që ju dëshironi të lëvizur kursorin, dhe pastaj nga të bëjë me pikë referimi nga ku kursori juaj është. Nëse ju të kalojë në SEEK_CUR, që përfaqëson rrymën Pozita në dosjen. Ose ju mund të përdorni disa parametra të tjera. Pra, ne mund të dëshironi të përdorni fseek të kaloni mbi mbushje e në dosje. Dhe përsëri, në qoftë se ju jeni të mbërthyer, ka një shembull i se në copy.c. Deri tani ne kemi hapur skedarin, çelës, dhe aktgjykimi. Ne kemi përditësuar header info për Verdikti tonë, sepse çdo bitmap ka nevojë për një kokë. Ne kemi lexuar pastaj në çelës të scanline, pixel nga pixel, ndryshuar çdo ngjyrë sipas nevojës, dhe shkruar ato në vendimi, pixel nga pixel. Pasi ta keni hapur verdiktin, ju mund të shihni që fajtor, ose çfarë sekret Mesazhi është. Emri im është Zamyla, dhe kjo ishte roman policor.