[MUSIC PLAYING] ZAMYLA Chan: Bu Miss Scarlett idi şamdan ilə. Whodunit? Yaxşı, biz tapmaq olacaq. Board oyun Açar, siz bilər fiziki qırmızı image veriləcək. Və image çox qırmızı və xallı, və sizin iş üçün gizli mesaj aşkar. Və adətən bir qırmızı ilə təmin edirik büyüteç, və ya bir qırmızı ekran ki, gizli mesaj aşkar. Yaxşı, ki, taklit olacaq. Whodunit, bir bitmap image sunulur ki, çox xallı və qırmızı görünür və sonra whodunit proqram run bir gizli mesaj aşkar. Belə ki, addımlar bu pozub bildirin. Birincisi, siz faylı açmaq istəyirsinizsə - Sizə verilən etdik ki, ipucu. Və sonra da yaratmaq hökmü bitmap fayl. Sonra bitmap yeniləmək istəyirsinizsə hökmü outfile üçün info header. Ki, sonra daha çox. Və sonra oxumaq olacaq ipucu, scanline, pixel tərəfindən pixel, kimi pixel rəng dəyişən zəruri və yazı hökmü o - daxil pixel tərəfindən pixel hökmü scanline. Biz bu barədə gedən başlar? Yaxşı, xoşbəxtlikdən, biz copy.c var bölüşdürülməsi kodu. Bu sübut edir bizə olduqca faydalı. Copy.c, bir fayl açılır ki, deyilir sonra INFILE nin header, və yenilikləri OUTFILE nin header. Və sonra bu hər pixel oxuyur sonra scanline, pixel tərəfindən pixel, və Bu outfile daxil pixel yazır. Belə ki, ilk addım ola bilər Aşağıdakı çalıştırmak olacaq Terminalda komanda - cp copy.c whodunit.c. Bu surətini yaradacaq copy.c whodunit.c adına. Belə ki, açmaq üçün ilk addım fayl, yaxşı, dəqiq var copy.c. ki replica Mən ki, baxmaq üçün tərk edəcəyik. Biz bu PSET ilə edilir məşğul olduğunuz fayl I / O, əsasən faylları alaraq, , oxu, yazı, onları redaktə. Siz ilk bir fayl açmaq edirsiniz? Yaxşı, siz bir fayl bəyan olacaq pointer, və sonra zəng funksiyası fopen. Yolu, və ya adı Pass fayl və sonra istədiyiniz rejimi daxil faylı açmaq üçün Bir r keçən açılacaq oxumaq üçün foo.bmp. Halbuki w keçən ilə fopen olacaq açıq bar.bmp, fayl yazmaq üçün və həqiqətən redaktə. Belə ki, indi biz fayl açdı etdik ki, bizim Növbəti addım header info yeniləmək üçün Bu outfile üçün. Bir header info nədir? Bəli, ilk bilmək lazımdır nə bitmap edir. A bitmap yalnız bir sadə bytes təşkili. Onlar bu faylı elan edirik bir dəstə ilə burada bmp.h, nə bitmap məlumat həqiqətən həyata edilir. Amma nə biz, həqiqətən, qayğı deyil bitmap fayl header, burada, və burada artıq bitmap info header. The header bir neçə ibarətdir çox faydalı sübut edəcək ki, dəyişənlərin. Bu olan biSizeImage var bayt image ümumi ölçüsü. Bu piksel və padding daxildir. Padding çox vacibdir, lakin biz daha sonra almaq lazımdır. BiWidth nın eni təmsil piksel mənfi padding image. BiHeight da sonra hündürlüyü piksel təsvirin. Və sonra BITMAPFILEHEADER və Mən qeyd etdiyim kimi BITMAPINFOHEADER, əvvəllər, o təmsil olunur Structs kimi. Belə ki, fayl mövzu gedə bilməz özü, lakin siz almaq lazımdır içərisində bu dəyişənlərin. OK. Belə ki, necə biz header info yeniləyə bilərəm? Bəli, ilk biz görmək lazımdır biz olub hər hansı bir məlumat dəyişdirmək lazımdır Bu üçün INFILE, ipucu, outfile, hökmü. Bir şey bu halda dəyişir? Yaxşı, həqiqətən, biz gedirik, çünki yalnız rəngləri dəyişdirilməsi üçün. Biz faylı dəyişən etmək fikrində deyilik ölçüsü, resim ölçüsü, eni, və ya hündürlüyü. Belə ki, indi üçün bütün doğru danışırsınızsa yalnız hər pixel çıxarmaq. OK. Belə ki, indi, necə biz həqiqətən baxaq fayl hər pixel oxuya bilərsiniz. Başqa bir fayl I / O funksiyası oyun minir - fread. Bu struct bir pointer edir bytes ehtiva edir ki, Siz oxuyursunuz. Belə ki, daxil oxuyursunuz. Və sonra olan bir ölçüsü keçmək hər element ölçüsü ki, oxumaq istəyirəm. Burada funksiyası sizeof lazımlı olacaq. Sonra, sayı keçmək elementlərinin sayı təmsil oxumaq ölçüsü. Və sonra nəhayət, inptr, olan siz ki, fayl pointer oxumaq gedir. Belə ki, həmin elementlərin bütün daxilində var inptr və onlar data olacaq. Bir az Məsələn baxaq. I data iki itlər daxil oxumaq istəyirsinizsə, yaxşı, mən bu iki yoldan birini edə bilərsiniz. Mən ya ölçüsü iki obyektlərində oxuya bilərsiniz Mənim inptr dən it, və ya oxuya bilərsiniz bir iki itlər ölçüsü etiraz. Siz görəcəksiniz ki, yol asılı olaraq , siz ölçüsü və nömrə təşkil ki, bytes eyni sayda oxuya bilərsiniz. Belə ki, indi dəyişmək bildirin Biz lazımdır kimi pixel color. Yenidən bmp.h baxmaq, onda siz altındakı ki, görürsünüz RGBTRIPLEs başqa struct olduğu onlar üç bayt təşkil edir. One, rgbtBlue, rgbtGreen, və rgbtRed. Belə ki, bu hər məbləğini mavi, yaşıl məbləği, və Bu pixel daxilində qırmızı məbləği burada hər məbləğ ilə təmsil olunur hexadecimal sayı. Belə ki, ff0000 mavi rəng olacaq, mavi gedir, çünki qırmızı, yaşıl. Və sonra bütün f ağ olacaq. Nin smiley.bmp nəzər almaq imkan olan Siz distribution kodu var. Yalnız bir resim açmaq əgər Viewer, sonra will yalnız bir qırmızı smiley görürük. Amma biz will, bir dərin dive alaraq görürük ki, strukturu bu yalnız piksel. Biz ağ piksel, və sonra qırmızı piksel. Bu bütün sonra, ağ ffffff, və Mən sizin üçün rəngli etdik qırmızı piksel burada, və onlar 0000ff olduğunu görürük. Zero mavi, sıfır yaşıl, və tam red. Və smiley səkkiz piksel geniş olduğundan, Biz hər hansı bir padding yoxdur. Bütün hüquqlar. Mən müxtəlif dəyərlər təyin etmək idi əgər bir RGBTRIPLE və mən istədim yaşıl, sonra mən nə edirəm Mən adlı RGBTRIPLE bəyan üç, və sonra hər daxil olmaq üçün ki, struct I daxilində byte dot operator istifadə edir. Belə ki triple.rgbtBlue, mən 0 ki, təyin. Green Mən tam təyin edə bilərsiniz - hər hansı bir sayı, həqiqətən, 0 və ff arasında. Və sonra qırmızı, mən də 0 demək gedirəm. Belə ki, o mənə bir yaşıl pixel verir. Sonra, mən yoxlamaq üçün nə istəyirsinizsə bir şey dəyəri? Mən yoxlayır ki, bir şey ola bilər Triple-nin rgbtBlue dəyəri olub ff və sonra çap, "Mən hiss edirəm blue! "nəticəsində. İndi ki, mütləq demək deyil pixel sağ, mavi olduğunu? Pixel yaşıl və qırmızı dəyərlər Çünki də qeyri-0 dəyərlər ola bilər. Bu o deməkdir ki, bütün və bütün bu yoxlanılması olunur tam mavi rəng üçün. Lakin bütün piksel da qismən ola bilər bu kimi rəng dəyərlər, burada növbəti nümunəsidir. Bu bir az daha görmək üçün Bu image indi nə. Bu bir az daha çox kimi görünür siz veriləcək lazımdır ki clue.bmp. İndi, fiziki, siz bu həll edə bilər, ilə, qırmızı bir çox var, çünki image qırmızı ekran keçirilməsi belə digər rəng görünür edə bilər ki,. Belə ki, necə biz c bu təqlid edirsiniz? Bəli, biz bütün qırmızı aradan qaldırılması bilər image tamamilə. Və belə ki, biz hər set istədiyiniz etmək 0 Pixel qırmızı dəyəri. Və belə image bir az baxmaq biz heç bir qırmızı olduğu bu kimi bit heç. Biz gizli mesaj bilərsiniz az daha aydın indi. Bu başqa bir smiley face var. Və ya bəlkə biz başqa bir metodu istifadə edə bilər. Bəlkə, biz müəyyən edə bilər qırmızı piksel bütün - ki, piksel bütün ilə 0 mavi, 0, yaşıl və qırmızı 0 - və ağ o dəyişir. Və bizim image ola bilər bu kimi bir şey. Görmək üçün bir az daha asan. Açmaq üçün başqa yollar çox var gizli mesaj, eləcə də rəng manipulyasiya ilə məşğul. Bəlkə üsullardan birini istifadə edə bilər Mən yuxarıda qeyd. Və əlavə, istədiyiniz bilər bir rəng artırmaq üçün və o həyata gətirir. Belə ki, indi biz pixel değiştirdik ki, rəng, növbəti biz yalnız onları yazmaq lazımdır pixel tərəfindən scanline üçün, pixel. Və yenə, geri baxmaq lazımdır Siz sitemizi əgər, copy.c üçün artıq və fwrite baxmaq məlumat alan funksiyası, bir pointer bytes ehtiva struct Siz ölçüsü, oxu etdiyiniz maddələr, maddələr sayı, və sonra outptr - bu faylların təyinat. Siz piksel yazmaq sonra, will də padding yazmaq lazımdır. Padding nədir? Yaxşı, hər rgbt pixel üç bytes uzun. Lakin, bir bitmap image scanline dörd bayt bir çox olmalıdır. Və piksel sayı deyil, əgər bir dörd çox, sonra biz əlavə etmək lazımdır Bu padding. Dolgu yalnız 0s təmsil edir. Belə ki, necə biz yazmaq, və ya bu oxuyursunuz? Bəli, bu çıxır siz bilməzsiniz ki, həqiqətən fread padding, lakin siz hesablamaq. Bu halda, ipucu və hökmü eyni eni var, belə ki, padding eyni. Və padding, siz görəcəksiniz kimi copy.c ildə hesablanır aşağıdakı formula ilə - bi.biWidth dəfə sizeof (RGBTRIPLE) olacaq neçə bayt bmp bizə hər bir sıra var. Oradan modulos və subtractions 4 hesablamaq bilərsiniz necə çox bytes əlavə edilməlidir ki, üzrə bytes çox hər satır dörd edir. İndi biz üçün formula var ki, biz lazımdır nə qədər padding, indi biz onu yaza bilərsiniz. İndi mən əvvəl qeyd, padding yalnız 0s edir. Belə ki, bu halda, biz yalnız qoyulması edirik bu halda 0 char, bizim outptr - bizim outfile. Belə ki, yalnız fputc ola bilər 0, vergül outptr. Belə ki, biz daxil oxu etdik isə bizim fayl, fayl I / O takip saxlanılır bizim bir şey ilə bu faylları mövqeyi fayl mövqe göstərici adlanır. Bir kursor kimi düşünün. Əsasən, bu hər dəfə avanslar biz fread, amma biz ki, də, bu nəzarət. Fayl mövqe göstərici hərəkət etmək, Siz funksiyası fseek istifadə edə bilərsiniz. Bu inptr fayl təmsil yerləşir Siz axtarır etdiyiniz göstərici, məbləği bytes sayı, siz sonra kursor hərəkət və istədiyiniz istinad nöqtəsi aiddir Sizin kursor edir harada. Siz SEEK_CUR keçmək Əgər ki, cari təmsil fayl mövqe. Yoxsa bəzi digər parametrləri istifadə edə bilərsiniz. Belə ki, biz keçmək fseek istifadə edə bilərsiniz Bu fayl padding üzərində. Zorlandığınız əgər yenə, var copy.c. ki nümunəsi Belə ki, indi biz fayl açmıştınız ipucu, və hökmü. Biz üçün header info yeniləndi etdik Bizim hökmü, çünki hər bitmap bir mövzu lazımdır. Biz sonra ipucu nin daxil oxumaq etdik scanline, pixel tərəfindən pixel, dəyişən hər rəngi kimi zəruri və Bu o yazı hökmü, pixel tərəfindən pixel. Siz hökmü açıq bir dəfə, siz bilərsiniz olan günahkar, və ya nə gizli mesaj. My name Zamyla və bu whodunit idi.