[Speel van musiek] ZAMYLA CHAN: Dit was Mej Scarlett met die kandelaar. Detective verhaal? Wel, ons gaan om uit te vind. In die raad spel Clue, kan jy gegee word 'n fisiese rooi beeld. En dat die beeld is baie rooi en Spotty, en jou werk is om te openbaar die verborge boodskap. En gewoonlik is jy voorsien met 'n rooi vergrootglas, of 'n rooi skerm openbaar wat verborge boodskap. Wel, ons gaan dit na te boots. In detective verhaal, jy kry 'n bitmap image wat lyk baie gevlekt en rooi, en dan loop die detective verhaal program 'n verborge boodskap te openbaar. So laat breek dit in stappe. Eerstens, jy wil die lêer oop te maak - die idee dat jy aan ons gegee is. En dan ook 'n uitspraak bitmap lêer. Dan wil jy die bitmap te werk header info vir die uitspraak outfile. Meer oor dit later. En dan gaan jy om te lees in die idee, scanline, pixel deur pixel, die verandering van die pixel kleure as nodig, en skryf diegene in die uitspraak - pixel vir pixel in die uitspraak scanline. Hoe begin ons gaan oor hierdie? Wel, gelukkig, ons het copy.c in die verspreiding kode. En dit gaan om te bewys baie nuttig vir ons. Copy.c open 'n lêer, lui in daardie infile se kop, en dan werk die outfile se kop. En dan lees dit elke pixel in die scanline, pixel deur pixel, en dan skryf dat pixel in die outfile. So, jou eerste stap mag wees om die volgende te hardloop opdrag in die terminale - CP copy.c whodunit.c. Dit sal 'n kopie van die skep van copy.c vernoem whodunit.c. So ons eerste stap om oop te maak die lêer, wel, daar is 'n presiese replika van wat in copy.c. So ek sal laat jy kyk na dit. Wat ons te doen het met hierdie PSET word lêer I / O, basies om lêers, lees, skryf, redigering hulle. Hoe kan jy die eerste keer 'n lêer oop te maak? Wel, jy gaan 'n lêer te verklaar wyser, en dan kan jy bel die funksie fopen. Slaag in die pad, of die naam van daardie lêer, en dan die modus wat jy wil hê dat 'n lêer om in te open Slaag in 'n r sal oopmaak foo.bmp vir die lees. Terwyl fopen met die verbygaan in 'n w sal oop bar.bmp, vir die lêer skryf en eintlik dit hersien word. So nou dat ons die lêer oopgemaak is, ons volgende stap is om die kop inligting by te werk vir die outfile. Wat is 'n kop-info? Wel, die eerste wat ons nodig het om te weet wat 'n bitmap is. 'N bitmap is net 'n eenvoudige reëling van die grepe. En hulle verklaar in hierdie lêer Hier bmp.h, met 'n klomp van die inligting van wat 'n bitmap is eintlik gemaak uit. Maar wat ons regtig omgee is die bitmap lêer kop, reg hier, en die bitmap info kop, hier. Die kop is saamgestel uit 'n paar veranderlikes wat sal bewys dat baie nuttig. Daar is biSizeImage, wat is die totale grootte van die beeld in grepe. En dit sluit pixels en padding. Padding is baie belangrik, maar Ons sal later aan daardie. BiWidth verteenwoordig die breedte van die beeld in pixels minus die padding. BiHeight is dan ook die hoogte van die beeld in pixels. En dan is die BITMAPFILEHEADER en die BITMAPINFOHEADER, soos ek genoem Vroeër, die verteenwoordig as structs. So, jy kan nie toegang tot die lêer kop self nie, maar jy wil te kry om te daardie veranderlikes binne. OK. So hoe werk ons ​​nie die kop info? Wel, die eerste wat ons het om te sien of ons nodig het om enige inligting uit te verander die infile, die idee om die outfile, die uitspraak. Is iets te verander in hierdie geval? Wel, nie eintlik nie, want ons gaan word net die verandering van die kleure. Ons is nie van plan om die verandering van die lêer grootte, die beeld grootte, die breedte, of die hoogte. So jy is reg vir nou deur net die kopiëring elke pixel. OK. So nou laat ons kyk na hoe ons eintlik kan elke pixel te lees van die lêer. Nog 'n lêer I / O-funksie sal kom in die spel - fread. Dit neem in 'n verwysing na die struct dat die grepe sal bevat wat jy lees. So jy lees in daardie. En dan moet jy slaag in 'n grootte wat die grootte van elke element wat jy wil lees. Hier is die funksie sizeof sal handig te pas kom. Dan moet jy slaag in getal, wat verteenwoordig die aantal elemente van grootte te lees. En dan uiteindelik, inptr, wat die lêer wyser dat jy gaan lees. So al die elemente is binne inptr en hulle gaan data. Kom ons kyk na 'n bietjie voorbeeld. As ek wil lees in data twee honde, Wel, ek kan dit doen een van twee maniere. Ek kan nie gelees in twee voorwerpe van die grootte hond uit my inptr, of ek kan lees in een voorwerp van die grootte van twee honde. So jy sien dat, afhangende van die manier waarop dat jy reël grootte en aantal, jy kan lees in dieselfde aantal grepe. So nou, laat ons verander die pixel kleur as wat ons nodig het. As jy kyk na bmp.h weer, dan Jy sal sien dat aan die onderkant RGBTRIPLEs is nog 'n struct, waar Hulle is saamgestel uit drie grepe. Een, rgbtBlue, rgbtGreen, en rgbtRed. So elkeen van hierdie is die bedrag blou, die bedrag van die groen, en die bedrag van rooi binne hierdie pixel, waar elke bedrag word verteenwoordig deur 'n heksadesimale getal. So ff0000> sal 'n blou kleur, want dit gaan van blou, groen, rooi. En dan sal al f se wit wees. Kom ons neem 'n blik op smiley.bmp, wat jy in jou verspreiding kode. As jy dit oop te maak in net 'n beeld kyker, dan sal jy sien net 'n rooi gesiggie. Maar neem 'n dieper duik in, sal ons sien dat die struktuur dit is net pixels. Ons het 'n wit pixels, en dan rooi pixels. Die wit, FFFFFF, en dan is almal van die rooi pixels Ek het ingekleur vir jou hier, en jy sien dat hulle 0000FF. Zero blou, nul groen en vol rooi. En aangesien gesiggie is agt pixels wyd, Ons het nie padding nie. Alle regte. So as ek verskillende waardes toe te ken 'n RGBTRIPLE en ek wou maak dit groen, dan wat ek wil doen, is om Ek wil 'n RGBTRIPLE, vernoem verklaar trippel, en dan elke om toegang te verkry byte binne daardie struct ek sou die dot operateur gebruik. So triple.rgbtBlue, kan ek toewys wat aan 0. Groen Ek kan dit aan 'n volle - enige nommer, regtig, tussen 0 en VF. En dan rooi, Ek gaan ook om te sê 0. So dan is dit gee my 'n groen pixel. Volgende, wat as ek wil om te kyk die waarde van iets? Ek kan iets wees wat tjeks of die drie se rgbtBlue waarde is VF en dan druk, "Ek voel blou! ", as 'n gevolg. Nou, dit beteken nie noodwendig dat die pixel is blou, reg? Omdat die pixel se groen en rooi waardes kon ook nie-0-waardes. Al wat dit beteken, en alles wat dit nagaan vir is vir 'n volle blou kleur. Maar al pixels kan ook gedeeltelike kleur waardes, soos hierdie volgende voorbeeld hier. Dit is 'n bietjie moeiliker om te sien wat die beeld is nou. Dit lyk 'n bietjie meer soos die clue.bmp dat jy gegee word. Nou, fisies, kan jy dit op te los, want daar is 'n baie rooi, deur hou 'n rooi skerm die beeld so dat die ander kleure kan verskyn. So hoe kan ons naboots dit met c? Wel, ons kan verwyder al die rooi van die beeld heeltemal. En om dit te doen wat ons wil stel elke pixel se rooi waarde na 0. En so het die beeld 'n bietjie sou lyk bietjie soos hierdie, waar ons geen rooi hoegenaamd nie. Ons kan die verborge boodskap 'n sien bietjie meer duidelik nou. Dit is 'n ander gesiggie gesig. Of miskien kan ons 'n ander metode gebruik. Miskien kan ons identifiseer al die rooi pixels - dit is, is al die pixels met 0 blou, 0 groen, en 0 rooi - en verander diegene wit. En ons beeld kan sien iets soos hierdie. 'N bietjie makliker om te sien. Daar is baie ander maniere te ontbloot die geheime boodskap so goed, die hantering van die kleur manipulasie. Miskien kan jy een van die metodes gebruik dat ek hierbo genoem. En Daarbenewens, kan jy wil sommige kleure te verbeter en bring hulle uit. So nou dat ons die pixel het verander kleur, langs ons net nodig het om te skryf in die scanline, pixel deur pixel. En nog 'n keer, sal jy wil om terug te kyk te copy.c, as jy nie kopieer dit reeds, en kyk na die fwrite funksie, wat neem data, 'n wyser die struct dat die grepe bevat dat jy die lees van, die grootte van die items, die aantal items, en dan die outptr - die bestemming van die lêers. Nadat jy in die pixels skryf, sal jy het ook in die padding te skryf. Wat is padding? Wel, elke rgbt pixel is drie grepe lank. Maar, die scanline vir 'n bitmap image het 'n veelvoud van vier grepe wees. En as die aantal pixels is nie 'n verskeie van vier, dan moet ons by te voeg hierdie padding. Padding net deur 0s. So, hoe kan ons skryf, of dit lees? Wel, dit blyk dat jy nie kan eintlik fread padding, maar jy kan bereken nie. In hierdie geval, die idee en die uitspraak het dieselfde breedte, sodat die padding is dieselfde. En die padding, as jy sien in copy.c, word bereken met die onderstaande formule - bi.biWidth keer sizeof (RGBTRIPLE) sal gee ons hoeveel grepe die bmp het in elke ry. Van daar, die modulos en aftrekking met 4 kan bereken hoe baie grepe moet bygevoeg word sodat die verskeie grepe op elke ry is vier. Nou dat ons die formule vir hoeveel padding ons nodig het, nou Ons kan dit skryf. Nou, ek voorheen genoem, padding is net 0s. So in daardie geval, ons is maar net om 'n kar, in hierdie geval 'n 0, in ons outptr - ons outfile. So wat net kan wees fputc 0, komma outptr. So, terwyl ons het gelees in ons lêer, het lêer I / O spoor van hou ons posisie in die lêers met iets genoem die lêer posisie aanwyser. Dink aan dit as 'n wyser. Eintlik is dit vooruitgang elke keer dat ons fread, maar ons het beheer oor dit ook. Die lêer posisie aanwyser om te beweeg, jy kan gebruik om die funksie fseek. Waar die inptr verteenwoordig die lêer wyser wat jy soek in die bedrag is die aantal grepe wat jy wil die wyser om te beweeg, en dan van betrekking het op die verwysingspunt van waar die wyser. As jy in SEEK_CUR slaag, wat verteenwoordig die huidige posisie in die lêer. Of jy kan gebruik om 'n paar ander parameters. So, sou ons wil te gebruik fseek te slaan oor die padding van die lêer. En weer, as jy vas, daar is 'n voorbeeld van wat in copy.c. So nou het ons die lêer oopgemaak is, die idee, en die uitspraak. Ons het verander die kop info vir ons uitspraak, want elke bitmap moet 'n kop. Ons het dan gelees word in die idee's scanline, pixel deur pixel, die verandering elke kleur as dit nodig is, en skryf die in die uitspraak, pixel deur pixel. Sodra jy uitspraak maak, kan jy sien wat die skuldige, of wat die geheime boodskap is. My naam is Zamyla, en dit was detective verhaal.