[Музички] ZAMYLA CHAN: Тоа е Мис Скарлет со светилник. Whodunit? Па, ние ќе треба да дознаете. Во одбор игра поим, можеби да се даде физичка црвени сликата. И дека сликата е многу црвена и петна, и вашата работа е да се открие скриените порака. И обично сте се предвидени со црвен лупа, или црвен екранот за да откриваат дека скриени порака. Па, ние ќе треба да го имитираат тоа. Во whodunit, ти си даде bitmap слика што изгледа многу петна и црвена, а потоа извршете ја whodunit програма да се открие скриен порака. Па ајде да се скрши оваа во чекори. Прво, вие сакате да ја отворам датотеката - поим дека сте биле дадени. А потоа, исто така, создаде Пресудата bitmap датотека. Тогаш ќе сакате да го обновите на bitmap заглавието информации за пресудата outfile. Повеќе за тоа подоцна. А потоа ви се случува да прочитате во поим, scanline, пиксел од пиксел, менување на пиксел бои, како е потребно, и пишување оние во пресудата - пиксел од пиксел во Пресудата scanline. Како ние да тргнат за ова? Па, за среќа, имаме copy.c во дистрибуција код. И ова се случува да се докаже доста корисно за нас. Copy.c отвора датотека, се наведува во таа насловот infile, а потоа ги ажурира насловот outfile е. А потоа го чита секој пиксел во scanline, пиксел од пиксел, а потоа пишува дека пиксели во outfile. Значи, вашиот прв чекор може биде да се кандидира на следните команда во терминал - cp copy.c whodunit.c. Ова ќе создаде копија од copy.c име whodunit.c. Значи нашиот прв чекор за да го отворите датотека, добро, тука е точна реплика на тоа во copy.c. Па јас ќе те оставам да се погледне во тоа. Што си имаме работа со нив, во овој PSET е датотека I / O, во основа преземање на датотеки, читање, пишување, уредување на нив. Како ви се прв отворите датотека? Па, си оди за да се прогласи датотека покажувач, а потоа ќе се јавите на функција fopen. Помине во патот, или името на таа датотека, а потоа на владата што ќе посакате да се отвори таа датотека внатре Поминува во Р ќе се отвори foo.bmp за читање. Додека fopen со донесување на w ќе отворен bar.bmp, за пишување на датотека и всушност тоа уредување. Па сега дека ние сме ја отвори датотеката, нашите Следниот чекор е да го обновите насловот инфо за outfile. Што е насловот инфо? Па, прво треба да знаеме што битмапа е. Битмапа е само едноставна уредување на бајти. И тие се декларирани во оваа датотека тука, bmp.h, со еден куп на информации за тоа што битмапа е всушност направен од. Но, она што навистина се грижат за е bitmap датотека насловот, токму тука, и на bitmap инфо насловот, овде. Насловот е составен од неколку варијабли кои ќе се покаже како многу корисно. Постои biSizeImage, кое е вкупната големина на сликата во бајти. И ова ги вклучува пиксели и баласт. Соочи е многу важна, но ние ќе дојдеме до тоа подоцна. BiWidth претставува ширината на сликата во пиксели минус баласт. BiHeight е тогаш, исто така, висината на сликата во пиксели. А потоа BITMAPFILEHEADER и BITMAPINFOHEADER, како што споменав порано, оние се застапени како structs. Значи, вие не може да пристапите до хедер датотека себе, но вие ќе сакате да се дојде до овие променливи внатре. OK. Така како ние да се ажурира заглавието инфо? Па, прво мораме да видиме дали можеме треба да се промени било информација од на infile, поим, на outfile, пресудата. Е ништо менува во овој случај? Па, не, всушност, затоа што ние ќе да биде само менување на боите. Ние нема да се менува датотеката големина, големината на сликата, ширина, или висина. Па ти си во ред сега за сега од страна на само копирање на секој пиксел. OK. Па сега ајде да погледнеме како ние всушност може да се прочита секој пиксел од датотеката. Друга датотека I / O функција ќе влезе во игра - fread. Таа ги зема во покажувач на struct која ќе содржат бајти кои ти ја читаш. Па што ти ја читаш во тоа. А потоа ќе помине во големина, што е големината на секој елемент кој го сакате да ја прочитате. Тука, функцијата sizeof ќе ни се најде. Тогаш ќе помине на број, кој претставува број на елементи големина да ја прочитате. А потоа, конечно, inptr, што е на датотеката покажувачот дека сте ќе се чита од. Па сите тие елементи се внатре inptr и тие ќе податоците. Ајде да погледнеме во малку пример. Ако сакам да го прочитате во податоците две кучиња, Па, можам да го направи тоа на два начина. Јас или да прочитате во два објекти на големината куче од мојот inptr, или можам да ги читам во еден објект со големина на две кучиња. Така што гледате дека во зависност од начинот на кој дека ќе организира големина и број, може да се прочита во ист број на бајти. Па сега, ајде да го промените пиксели во боја како што треба. Ако се погледне на bmp.h повторно, тогаш ќе видите дека на дното RGBTRIPLEs се уште struct, каде тие се составени од три бајти. Еден, rgbtBlue, rgbtGreen и rgbtRed. Така што секоја од овие претставува износ на сино, износот на зелена, а износот на црвена во овој пиксел, каде секој износ е претставена со хексадецимален број. Па FF0000 ќе биде сина боја, бидејќи тоа оди од сина, до зелена, на црвено. А потоа сите ѓ ќе биде бело. Ајде да ги разгледаме во smiley.bmp, која имате во вашата дистрибуција код. Ако го отворите во само една слика гледачот, тогаш ќе само види црвено смешковци. Но, земајќи подлабоко се нурне во, ние ќе види дека структурата од тоа е само пиксели. Имаме бела пиксели, и потоа црвени точки. Вајт, FFFFFF, а потоа сите црвени пиксели Сум обоени во за вас тука, и ќе видите дека тие се 0000ff. Нула сина, зелена нула, како и целосна црвено. И бидејќи смешковци е осум пиксели широк, ние не се имате било какви баласт. Во ред е. Значи, ако јас требаше да доделите различни вредности до RGBTRIPLE и јас сакав да го прават тоа зелена, а потоа она што јас би го направил е Јас би прогласи RGBTRIPLE, именуван тројна, а потоа да се пристапи секој бајт во рамките на таа struct јас ќе го користи операторот точка. Па triple.rgbtBlue, можам да доделите дека на 0. Зелени можам да ја доделите на целосна - било број, навистина, помеѓу 0 и понатаму. А потоа црвено, јас сум исто така, ќе каже 0. Па тогаш што ми дава зелена пиксели. Следно, што ако сакам да се провери вредноста на нешто? Јас би можеле да имаат нешто што проверува дали rgbtBlue вредност трокреветни е ff, а потоа печати, "Јас сум чувство сини! ", како резултат. Сега, тоа не мора да значи дека пиксел е сино, нели? Бидејќи зелени и црвени вредности пиксел е исто така би можеле да имаат не-0 вредности. Сите што тоа значи, а сето тоа ова е проверка за е за целосна сина боја. Но сите пиксели, исто така, би можеле да имаат делумна боја вредности, како овој Следниот пример тука. Тоа е малку потешко да се види што е ова на сликата е сега. Ова изгледа малку повеќе како clue.bmp дека ќе им се даде. Сега, физички, може да се реши овој, затоа што има многу црвени, со држи до црвен екран на сликата, па дека други бои може да се појави. Така како ние да го имитираат тоа со Ц? Па, ние би можеле да се отстранат сите црвени од сликата во целост. И така да го направите тоа ние би го поставите секој пиксел црвено вредноста на 0. И така сликата ќе изгледа малку малку вака, каде што ние немаме црвена она. Можеме да видиме скриената порака на малку појасно сега. Тоа е уште еден лице смешковци. Или можеби ние би можеле да користи друг метод. Можеби, би можеле да се идентификуваат сите црвени пиксели - што е, сите од точките со 0 сина, 0 зелена, и 0 црвено - и промена на оние на бело. И нашиот имиџ може да изгледа нешто како ова. А малку полесно да се види. Постојат многу други начини да се открие тајната порака, како и, се занимаваат со манипулација на бојата. Можеби можете да го користите еден од методите што ги спомнав погоре. И дополнително, можеби ќе сакате за подобрување на некои бои и донесе оние надвор. Па сега дека ние сме го смени пиксели боја, следната ние само треба да ги пишувам во на scanline, пиксел од пиксел. И уште еднаш, ќе сакате да се погледне назад да copy.c, ако не сте го копирале тоа веќе, и се погледне на запишување функција, кој се земаат податоци, покажувач на struct, која содржи бајти дека сте читање од, големината на предмети, бројот на предмети, а потоа outptr - дестинацијата на овие датотеки. Откако ќе напишете во пиксели, да ќе исто така мора да пишуваат во баласт. Што е баласт? Добро, секој rgbt пиксели е три бајти долго. Но, scanline за bitmap слика мора да биде повеќе од четири бајти. И ако бројот на пиксели не е повеќе од четири, тогаш ние треба да го додадете овој баласт. Соочи е само претставени од 0-ти. Значи, како да се пишува, или да прочитате ова? Па, излегува дека не можете всушност fread баласт, но можете да пресмета тоа. Во овој случај, поим и пресудата имаат иста ширина, така што вата е иста. И баласт, како што ќе видите во copy.c, се пресметува со под формулата - bi.biWidth пати sizeof (RGBTRIPLE) ќе ни даде колку бајти на BMP има во секој ред. Од таму, modulos и одземање со 4 може да се пресмета колку многу бајти мора да се додаде, така што на повеќе од бајти на секој ред е четири. Сега кога имаме формулата за колку баласт ни треба, сега ние може да го напише. Сега, јас напоменав претходно, Соочи е само 0-ти. Значи во тој случај, ние сме само ставање char, во овој случај 0, во нашите outptr - нашиот outfile. Така што само може да биде fputc 0, запирка outptr. Така, додека ние сме биле читање во нашите датотека, фајл I / O го чува песна на нашата позиција во овие датотеки со нешто наречен датотека позиција индикатор. Сфатете го тоа како курсорот. Во суштина, тоа аванси во секое време дека ние fread, но имаме контрола над него, исто така. Да ја преместам датотеката позиција индикатор, можете да го користите функцијата fseek. Каде inptr претставува датотеката покажувач, кој си бараат во, износ е бројот на бајти кои ќе сакате да го преместите курсорот, а потоа од се однесува на референтна точка од каде курсорот е. Ако помине во SEEK_CUR, дека е тековниот позиција во датотеката. Или можете да го користите некои други параметри. Значи, ние можеби ќе сакате да го користите fseek за да го прескокнете во текот на баласт на во датотека. И повторно, ако сте заглавени, има пример за тоа во copy.c. Така, сега сме ја отвори датотеката, поим, а пресудата. Ние сме нема насловот информации за Нашите пресудата, бидејќи секој битмапа треба заглавието. Ние сме тогаш прочитате во поим за scanline, пиксел од пиксел, менување секоја боја како што е потребно, и пишувам оние во пресудата, пиксел од пиксел. Откако ќе ја отворите пресудата, можете да видите кој виновникот, или она што тајната Пораката е. Моето име е Zamyla, и ова беше whodunit.