[За възпроизвеждане на музика] ZAMYLA CHAN: Това беше мис Скарлет със светилника. Кой го направи? Е, ние ще се разберем. В игра на дъска представа, може да да получат физическо червено изображение. И този образ е много червено и петна, и вашата работа е да разкрие скритото послание. И обикновено, което е предвидено с червен лупа, или червен екрана, за да разкриват, че скрито послание. Е, ние ще имитира това. В криминале, което дава растерно изображение че изглежда много петна и червено, и след това стартирайте програмата криминале за да разкрие скритата съобщение. Така че нека да се разбие в стъпки. Първо, вие искате да отворите файла - следата че сте били дадени. И тогава също да създадете присъда растерна графика файл. След това, което искате да актуализирате растерна графика заглавна информация за присъда outfile. Повече за това по-късно. И тогава започваш да прочетете в улика, Scanline, пиксел по пиксел, промяна на цветовете пиксел като необходимо, и писане тези в присъдата - пиксел по пиксел в присъда Scanline. Как да започнем ще кажеш за това? Е, за щастие, имаме резервното в кода на разпределение. И това ще се докаже доста полезно за нас. Резервното отваря файл, прочита в тази заглавна INFILE, а след това актуализира заглавна outfile е. И след това го чете всеки пиксел от Scanline, пиксел по пиксел, и след това пише, че пиксел в outfile. Така че, първата стъпка може бъде да изпълните следните команда в терминала - кп резервното whodunit.c. Това ще създаде копие на резервното име whodunit.c. Така че първата ни стъпка, за да отворите файл, добре, там е точна копие на тази в copy.c. Така че аз ще ви оставя да се търси в това. Какво си имаме работа в този PSET се файл I / O, основно като файлове, четене, писане, да ги редактирате. Как първо отваряне на файл? Е, ти започваш да се декларират файл показалеца, и след това, което наричате FОтваряне на функция. Премини в пътя, или името на този Файл, а след това на режима, който искате , за да отворите този файл инча Минавайки в R ще се отвори foo.bmp за четене. Като има предвид, FОтваряне на с преминаване в w ще отворен bar.bmp, за писане на файлове и всъщност го редактирате. Така че сега, че сме отворили файла, нашата Следващата стъпка е да се актуализира информацията за хедър за outfile. Какво е Информация за заглавие? Е, първо трябва да знаем какво е растерна графика. A растерна графика е просто подреждане на байта. И те са декларирани в този файл тук, bmp.h, с един куп информация за това какво е растерна графика всъщност е направена от. Но това, което наистина интересува е растерна графика заглавния файл, точно тук, и на растерна информация Header, насам. Таблата се състои от няколко променливи, които ще се окаже много полезно. Има biSizeImage, което е най- Общият размер на изображението в байтове. И това включва пиксела и подложка. Padding е много важно, но ние ще стигнем до това по-късно. BiWidth представлява широчината на изображението в пиксели минус пълнежа. BiHeight е след това също височината на изображението в пиксели. И тогава BITMAPFILEHEADER и BITMAPINFOHEADER, както споменах по-горе, тези са представени като structs. Така че, не можете да получите достъп до заглавната част на файла себе си, но вие ще искате да стигнем до тези променливи вътре. OK. И как ще се актуализира информацията за заглавие? Е, първо трябва да видим дали сме трябва да променим всякаква информация от на INFILE, следата, на outfile, присъдата. Дали нещо се променя в този случай? Е, всъщност не, защото ние ще да бъде само с промяна на цветовете. Ние няма да се променя файла размер, размера на изображението, широчината, или височината. Така че всичко е наред за сега от просто копиране на всеки пиксел. OK. Така че сега нека да разгледаме как ние всъщност може да чете всеки пиксел от файла. Друг I / O функция файл ще влезе в игра - fread. Това отнема в указател към структура , която ще съдържа байтове, че , което четете. Така че четете в това. И след това да премине в друг размер, който е размера на всеки елемент, който ви искате да прочетете. Тук функцията sizeof ще дойде по-удобно. След това се преминава в брой, които представлява броя на елементите на размер, за да се чете. И накрая, inptr, което е указателя на файла, който сте ще се чете от. Така че всички тези елементи са вътре inptr и те ще данни. Нека да разгледаме най-малко например. Ако искате да прочетете в данни две кучета, Е, мога да го направя един от двата начина. Аз може или да прочетете в два обекта с размер куче от моя inptr, или мога да чета в един обект на размера на две кучета. Така че виждате, че в зависимост от начина, по който че да подредите размер и брой, можете може да чете в същия брой байтове. Така че сега, нека да сменим пиксел цвят тъй като имаме нужда. Ако се вгледате в bmp.h отново, а след това ще видите, че на дъното RGBTRIPLEs са друга структура, където те се състоят от три байта. One, rgbtBlue, rgbtGreen и rgbtRed. Така всеки от тях представлява сумата от синьо, размерът на зелено, и количество червено вътре в този пиксел, където всяка сума е представена от шестнадесетичен номер. Така ff0000 ще бъде син цвят, , тъй като преминава от синьо, в зелено, на червено. И тогава всичко е ще да е бяла. Нека да разгледаме най-smiley.bmp, които имате във вашата дистрибуция код. Ако го отворите само един образ зрителя, а след това ще просто вижте червен усмивка. Но като по-дълбоко се потопите в, ние ще се види, че структурата от него е само на пиксела. Имаме бели пиксели, и след това червени пиксела. Бялото, FFFFFF, а след това всички на червени пиксела съм оцветени в за вас тук, и ще видите, че те са 0000FF. Нула синьо, зелено нула, и наситено червен. И тъй като усмивка е осем пиксела широк, ние не разполагат с никакви подплънки. Добре. Така че, ако аз трябваше да зададете различни стойности до RGBTRIPLE и аз исках да направи зелен, а след това, което аз ще направя е Бих обявят RGBTRIPLE, наречена тройна, и след това за достъп до всеки байт в рамките на тази структура I ще използва оператора на точка. Така triple.rgbtBlue, мога присвоите на 0. Green мога да го възложи на пълен - всички номер, наистина, между 0 и сл.. И след това червено, аз също щях да кажа 0. Така че след това, което ми дава зелена пиксел. На следващо място, какво ще стане ако аз искам да се провери стойността на нещо? I може да има нещо, което проверява дали rgbtBlue стойност на тройката е ее и след това да отпечатате, "Аз се чувствам син! ", като резултат. Сега, това не означава непременно, че пикселът е синьо, нали? Тъй като зелени и червени стойности на пиксела също може да има не-0 ценности. Всичко това означава, че и всички, които това е проверка е За пълния син цвят. Но всички пиксели могат да имат частични цветови стойности, като това следващия пример тук. Това е малко по-трудно да се види какво този образ е сега. Това изглежда малко повече като clue.bmp, че ще се обърне. Сега, физически, може да се разреши този проблем, защото има много на червено, от вдигнал червен екран на изображението, така че другите цветове могат да се появят. Така че как можем да имитират това с C? Е, бихме могли да се премахнат всички червени от изображението. И така да се направи, че щяхме да настроите всеки червено стойност пиксел на 0. И така че изображението да изглежда малко по- малко като този, където ние нямаме червени каквато. Ние можем да видим скритото съобщение Малко по-ясно сега. Това е още една усмивка на лицето. Или може би бихме могли да използваме друг метод. Може би, бихме могли да се идентифицират всички червени пиксели - т.е. всички пиксели с 0 синьо, 0 зелено, червено и 0 - и променете тези на бяло. И нашия имидж може да изглежда нещо като това. А малко по-лесно да се види. Има много други начини да се разкрие тайното послание, както и, занимаващи се с манипулацията цвят. Може би бихте могли да използвате един от методите, които споменах по-горе. И освен това, може да искате да се подобрят някои цветове и донесе тези навън. Така че сега, че ние променихме пиксел цвят, следващия ние просто трябва да ги напиша в до Scanline, пиксел по пиксел. И все пак, вие ще искате да погледнете назад за резервното, ако не сте копирали вече, и погледнете в неуспешно функция, която отнема данни, указател на структура, която съдържа байта че четеш от, размерът на елементите, броят на предметите, и тогава outptr - местоназначението на тези файлове. След като напишете в пикселите, ще Също така трябва да напишете в пълнежа. Какво е подложка? Е, всеки rgbt пиксел е дълъг три байта. Но, на Scanline за растерно изображение трябва да бъде кратен на четири байта. И ако броят на пиксела не е кратно на четири, а след това ние трябва да добавите тази подложка. Padding е само представлявана от 0s. Така че, как да пиша, или да прочетеш това? Е, оказва се, че не можете да всъщност fread подложка, но можете да изчисляването му. В този случай, уликата и присъдата има същата ширина, така че подложка е същото. И пълнежа, както ще видите в резервното, се изчислява с по-долу формула - bi.biWidth пъти sizeof (RGBTRIPLE) ще ни даде колко байта BMP има във всеки ред. От там, modulos и изваждания с 4 може да се изчисли колко трябва да се добавят много байта, така че кратно на байта на всеки ред е четири. Сега, когато имаме формулата за колко подложка имаме нужда, сега можем да го напиша. Сега, аз споменах и преди, подложка е само 0s. Така че в този случай, ние просто пускането Чар, в този случай на 0, в нашия outptr - нашата outfile. Така че може да бъде само fputc 0, запетая outptr. Така че, докато сме били четене в нашата файл, файл I / O е запазил следите на нашата позиция в тези файлове с нещо нарича показател на файла позиция. Мислете за това като курсора. По принцип, тя напредва всеки път че ние fread, но ние имаме контрол над него, също. За да се движи индикаторът файл позиция, можете да използвате функцията fseek. Когато inptr представлява файла показалка, че сте търси в това сума е броя на байтове, които ви искате да преместите курсора и след това от се отнася до еталонната точка от мястото, където е курсора. Ако премине в SEEK_CUR, че представлява ток позиция във файла. Или можете да използвате някои други параметри. Така че, ние може да искате да използвате fseek да пропуснете над пълнежа на във файла. И отново, ако сте остана, има пример за това в copy.c. Така че сега ние сме отвори папката, следата, и присъдата. Ние актуализира информацията за заглавния Нашата присъда, защото всеки растерна графика се нуждае от заглавието. Ние сме след това прочетете в представа-те Scanline, пиксел по пиксел, промяна всеки цвят, колкото е необходимо, и писане на тези в присъда, пиксел по пиксел. След като отворите присъда, можете да видите кой виновника, или каква е тайната съобщение е. Моето име е Zamyla, и това е криминале.