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