[Музыка гуляе] ZAMYLA Чан: Гэта была міс Скарлет з падсвечнікам. Дэтэктыўны раман? Ну, мы збіраемся высветліць. У настольнай гульні Clue, вы, магчыма, быць нададзена фізічнай чырвоны малюнак. І, што выява вельмі чырвоны і плямістыя, і ваша задача, каб выявіць схаваныя паведамленні. І, як правіла, вы забяспечаны чырвоны павелічальнае шкло, ці чырвоны экран паказваюць, што схаванае пасланне. Ну, мы збіраемся, каб імітаваць, што. У дэтэктыўны раман, вам даюць растравы малюнак , Які выглядае вельмі плямістым і чырвоны, а затым запусціць праграму дэтэктыўны раман выявіць схаванае паведамленне. Так давайце разбярэм гэта ў крокаў. Па-першае, вы хочаце, каб адкрыць файл - прыкмета таго, што вы атрымалі. А потым яшчэ і стварыць Прысуд растравы файл. Тады вы хочаце абнавіць растравы малюнак загаловак інфармацыю для Прысуд OUTFILE. Больш падрабязна аб гэтым пазней. А потым вы збіраецеся чытаць у ключ, Scanline, піксель за пікселем, змены колеру пікселяў, як неабходна, і ліст тыя, у прысудзе - піксель за пікселем ў Прысуд Scanline. Як мы пачынаем ісці з гэтай нагоды? Ну, на шчасце, у нас ёсць copy.c у кодзе размеркавання. І гэта збіраецца даказаць вельмі карысныя для нас. Copy.c адкрывае файл, счытвае, што Загаловак INFILE, а затым абнаўляе Загаловак OUTFILE ст. А потым ён чытае кожны піксель ў Scanline, піксель за пікселем, а затым піша, што піксель ў выходны файл. Такім чынам, ваш першы крок мог бы у тым, каб запусціць наступнае Каманда ў тэрмінале - ча copy.c whodunit.c. Гэта створыць копію copy.c імя whodunit.c. Такім чынам, наш першы крок, каб адкрыць файл, ну, ёсць дакладная копія, што ў copy.c. Таму я пакідаю вас паглядзець на гэта. Тое, што мы маем справу з такім PSET будзе файлавы ўвод / выснова, у асноўным прымаючы файлы, чытанне, пісьмо, іх рэдагавання. Як вы ўпершыню адкрываеце файл? Ну, вы збіраецеся абвясціць файл паказальнік, а затым вы называеце Функцыя Еореп. Перайдзіце ў шляху, або імя, што файл, а затым рэжым, які вы хочаце для адкрыцця гэтага файла цалі Пас у г адкрые foo.bmp для чытання. У той час як Еореп з праходжаннем ў З будуць адкрыты bar.bmp, для запісу файла і на самай справе рэдагавання. Так што цяпер мы адкрылі файл, наш Наступным крокам з'яўляецца абнаўленне інфармацыі загалоўка для OUTFILE. Што такое інфармацыйная загаловак? Ну, па-першае, мы павінны ведаць, што растравы малюнак. Растравы малюнак просты размяшчэнне байтаў. І яны абвешчаныя ў гэтым файле тут, bmp.h, з кучай Інфармацыя пра тое, што растравы малюнак на самой справе складаецца з. Але тое, што мы сапраўды клапоцімся аб тым, загаловак графічнага файла, прама тут, і растравы інфармацыі загалоўка, тут. Загаловак складаецца з некалькіх зменныя, якія апынуцца вельмі карыснымі. Існуе biSizeImage, якая з'яўляецца Агульны памер выявы ў байтах. І гэта ўключае ў сябе пікселяў і водступы. Запаўненне вельмі важна, але мы вернемся да гэтага пазней. BiWidth ўяўляе шырыню выявы ў пікселях мінус запаўнення. BiHeight затым таксама вышыня выявы ў пікселях. І тады BITMAPFILEHEADER і BITMAPINFOHEADER, як я ўжо казаў раней, тых, прадстаўлены як структуры. Такім чынам, вы не можаце атрымаць доступ загаловак файла Сам, але вы хочаце, каб дабрацца да гэтыя зменныя ўнутры. ОК. Так як жа мы абнаўляем інфармацыю загалоўка? Ну, па-першае, мы павінны бачыць ці мы трэба змяніць любую інфармацыю ад входной_файл, ключ, каб выходной_файл, прысуд. Што-небудзь змяняецца ў гэтым выпадку? Ну, на самай справе не, таму што мы збіраемся быць толькі змяняючы колеру. Мы не збіраемся быць змены файла памер, памер малюнка, шырыня, або вышыня. Так што ты ў парадку на дадзены момант па проста капіраванне кожнага пікселя. ОК. А цяпер давайце паглядзім, як мы на самай справе можаце прачытаць кожны піксель з файла. Яшчэ адзін файл функцыя ўводу / вываду ўступіць у гульню - FREAD. Яна займае ў паказальнік на структуры , Які будзе ўтрымліваць байты, вы чытаеце. Такім чынам, вы чытаеце ў гэта. А потым вы праходзіце ў памеры, які з'яўляецца памер кожнага элемента, які вы хочаце чытаць. Тут функцыя SizeOf спатрэбіцца. Затым праходзьце ў колькасці, якія азначае колькасць элементаў Памер чытаць. І, нарэшце, inptr, які файл паказальнік, які вы буду чытаць з. Так усе гэтыя элементы знаходзяцца ўнутры inptr і яны збіраюцца дадзеных. Давайце паглядзім на невялікі прыклад. Калі я хачу прачытаць у дадзеных двух сабак, ну, я магу зрабіць гэта адным з двух спосабаў. Я магу альбо чытаць у двух аб'ектаў памерам сабака з маёй inptr, ці я магу чытаць ў адным аб'екце памер двух сабак. Такім чынам, вы бачыце, што ў залежнасці ад спосабу што вы наладжваеце памер і колькасць, вам можна прачытаць у той жа лік байтаў. Так што цяпер, давайце зменім колеру кропак, як нам трэба. Калі вы паглядзіце на bmp.h зноў, то вы ўбачыце, што на дне RGBTRIPLEs з'яўляюцца яшчэ адным структура, дзе яны складаюцца з трох байтаў. Адзін з іх, rgbtBlue, rgbtGreen і rgbtRed. Такім чынам, кожны з іх уяўляе сабой суму з блакітнай, колькасць зялёным, а колькасць чырвонага ўнутры гэтага пікселя, дзе кожная сума прадстаўлена шаснаццатковы лік. Так ff0000 будзе сіні колер, таму што ён ідзе ад сіняга, на зялёны, на чырвоны. А потым усё е будзе белы. Давайце зірнем на smiley.bmp, які у вас ёсць у вашым кодзе размеркавання. Калі вы адкрыеце яго ў проста малюнак глядач, то вы будзеце проста бачыце чырвоны смайлік. Але, прымаючы больш глыбокае апусканне ў, мы будзем бачыць, што структура з гэта ўсяго толькі пікселяў. У нас ёсць белыя пікселі, а затым чырвоныя пікселяў. Белы, FFFFFF, а затым усё чырвоныя пікселяў Я пафарбаваны ў для вас тут, і вы бачыце, што яны 0000ff. Нулявы сіні, нулявы зялёны і поўны чырвоны. А так як смайлік ў восем пікселяў у шырыню, мы не маем ніякага запаўнення. Добра. Так што, калі б я павінен быў прызначыць розныя значэнні да RGBTRIPLE, і я хацеў зрабіць яго зялёным, тое, што я хацеў бы зрабіць гэта Я б аб'явіць RGBTRIPLE, названы патройны, а затым, каб атрымаць доступ кожны байт у межах гэтай структуры I будзе выкарыстоўваць аператар кропкі. Так triple.rgbtBlue, я магу прызначаць што ў 0. Зялёны я магу прызначыць яго на поўны - любы лік, сапраўды, ад 0 да FF. А потым чырвоны, я таксама збіраюся сказаць 0. Такім чынам, што дае мне зялёны піксель. Далей, то, што, калі я хачу, каб праверыць значэнне чагосьці? Я мог мець тое, што правярае Ці значэнне rgbtBlue патройны з'яўляецца і далей, а затым раздрукаваць, "Я адчуваю сябе сіні ", у якасці выніку. Цяпер, гэта не абавязкова азначае, што піксель сіняга колеру, ці не так? Таму што зялёныя і чырвоныя значэнні пікселя таксама можа мець не-0 значэння. Усё, што гэта значыць, і ўсё, што гэта праверка на гэта для поўнага сіняга колеру. Але ўсё пікселі таксама можа мець частковае каляровыя значэнні, як гэта Наступны прыклад тут. Гэта крыху больш складана ўбачыць што гэты вобраз цяпер. Гэта выглядае крыху больш, як clue.bmp, што вам будзе прадастаўлена. Цяпер, фізічна, вы можаце вырашыць гэтую праблему, таму што ёсць шмат чырвонага, па падняўшы чырвоны экран з выявай так якія могуць з'явіцца іншыя колеры. Так як жа нам імітаваць гэта з с? Ну, мы маглі б выдаліць усе чырвоныя з малюнка цалкам. І так рабіць, што мы кожны набор чырвоны значэнне пікселя ў 0. І таму малюнак будзе выглядаць трохі трохі, як гэта, дзе нас няма ніякай чырвоны б там ні было. Мы можам убачыць схаваны паведамленне пра трохі больш ясна цяпер. Гэта яшчэ адзін смайлік. Ці, можа быць, мы маглі б выкарыстоўваць іншы метад. Можа быць, мы маглі б вызначыць усе чырвоныя пікселяў - гэта значыць, усе пікселі з 0 сіні, 0 зялёны, і 0 чырвоны - і змяніць тыя на белы. І наша малюнак можа выглядаць нешта накшталт гэтага. Крыху лягчэй ўбачыць. Ёсць шмат іншых спосабаў раскрыць Сакрэтнае паведамленне, а таксама, справу з каляровай маніпуляцыі. Можа быць, вы маглі б выкарыстоўваць адзін з метадаў што я ўжо згадваў вышэй. І акрамя таго, вы можаце для павышэння некаторых кветак і прыцягнуць вінаватых па-за. Так што цяпер мы змянілі піксель колер, затым мы проста трэба запісаць іх ў да радкі разгорткі, піксель за пікселем. І яшчэ раз, вы хочаце, каб азірнуцца назад каб copy.c, калі вы не скапіявалі гэта ўжо, і паглядзець на FWRITE Функцыя, якая прымае дадзеныя, паказальнік да структуры, якая змяшчае байт што вы чытаеце з, памеру элементы, колькасць элементаў, а затым outptr - прызначэнне гэтых файлаў. Пасля напісання ў пікселях, вы будзеце таксама павінны напісаць у абіўцы. Што такое абіўка? Ну, кожны rgbt пікселяў тры байта. Але, Scanline для растравага малюнка Павінна быць кратна чатыром байтах. І калі колькасць пікселяў ня кратна чатыром, то нам трэба дадаць гэта абіўка. Запаўненне проста прадстаўлена 0s. Такім чынам, як мы пішам, або чытаць гэта? Ну, атрымліваецца, што вы не можаце фактычна FREAD абіўка, але вы можаце вылічыць яго. У гэтым выпадку, ключ і прысуд маюць аднолькавую шырыню, так абіўка тое ж самае. І абіўка, як вы ўбачыце у copy.c, разлічваецца з прыведзенай ніжэй формуле - bi.biWidth раз SizeOf (RGBTRIPLE) будзе даць нам, колькі байтаў BMP мае ў кожнай радку. Адтуль, модуляў і вылікі з 4 можна разлічыць як колькасць байтаў павінны быць дададзены так, каб кратным байт на кожны радок з'яўляецца чатыры. Цяпер, калі ў нас ёсць формула для колькі абіўка нам трэба, цяпер мы можам запісаць яго. Зараз, я ўжо казаў, абіўка знаходзіцца ўсяго 0s. Так што ў гэтым выпадку мы проста пакласці сімвал, у дадзеным выпадку 0, у нашай outptr - наш выхадны файл. Так што можа быць проста fputc 0, коска outptr. Так, у той час як мы чыталі ў нашых , Файл уводу / высновы сачыў за нашай Становішча ў гэтых файлах з чымсьці называецца індыкатар пазіцыі файла. Думайце пра яго, як курсор. У асноўным, гэта сродкі, кожны раз, калі што мы FREAD, але ў нас ёсць кантроль над ім, таксама. Для перамяшчэння індыкатар пазіцыі файла, Вы можаце выкарыстоўваць функцыю FSEEK. Дзе inptr ўяўляе файл паказальнік, які вы шукаеце ў, сума колькасць байт, што вы хочаце, каб перамясціць курсор, а затым з ставіцца да апорнай кропцы адкуль курсор знаходзіцца. Калі вы перадаеце ў SEEK_CUR, што ўяўляе сабой ток становішча ў файле. Ці вы можаце выкарыстоўваць некаторыя іншыя параметры. Такім чынам, мы, магчыма, захочаце выкарыстоўваць FSEEK прапусціць над пракладкай файла ст. І зноў жа, калі вы затрымаліся, ёсць прыклад, што ў copy.c. Так што цяпер мы адкрылі файл, разгадка, і прысуд. Мы абнавілі інфармацыю загалоўка для наш вердыкт, таму што кожны бітаў карта мае патрэбу ў загаловак. Мы то чытайце ў разгадка'S Scanline, піксель за пікселем, змяненне кожны колер па меры неабходнасці, і пісаць тыя, у Прысуд, піксель за пікселем. Як толькі вы адкрываеце прысуд, вы можаце бачыць, хто злачынец, або ў чым сакрэт паведамленне. Мяне клічуць Zamyla, і гэта было дэтэктыўны раман.