1 00:00:00,000 --> 00:00:09,500 >> [Speel van musiek] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA CHAN: Dit was Mej Scarlett met die kandelaar. 3 00:00:12,350 --> 00:00:13,560 Detective verhaal? 4 00:00:13,560 --> 00:00:15,030 Wel, ons gaan om uit te vind. 5 00:00:15,030 --> 00:00:20,870 In die raad spel Clue, kan jy gegee word 'n fisiese rooi beeld. 6 00:00:20,870 --> 00:00:24,120 En dat die beeld is baie rooi en Spotty, en jou werk is om te 7 00:00:24,120 --> 00:00:25,490 openbaar die verborge boodskap. 8 00:00:25,490 --> 00:00:29,740 En gewoonlik is jy voorsien met 'n rooi vergrootglas, of 'n rooi skerm 9 00:00:29,740 --> 00:00:31,410 openbaar wat verborge boodskap. 10 00:00:31,410 --> 00:00:33,340 Wel, ons gaan dit na te boots. 11 00:00:33,340 --> 00:00:37,960 >> In detective verhaal, jy kry 'n bitmap image wat lyk baie gevlekt en rooi, 12 00:00:37,960 --> 00:00:43,430 en dan loop die detective verhaal program 'n verborge boodskap te openbaar. 13 00:00:43,430 --> 00:00:45,650 >> So laat breek dit in stappe. 14 00:00:45,650 --> 00:00:50,390 Eerstens, jy wil die lêer oop te maak - die idee dat jy aan ons gegee is. 15 00:00:50,390 --> 00:00:53,880 En dan ook 'n uitspraak bitmap lêer. 16 00:00:53,880 --> 00:00:58,240 Dan wil jy die bitmap te werk header info vir die uitspraak outfile. 17 00:00:58,240 --> 00:00:59,920 Meer oor dit later. 18 00:00:59,920 --> 00:01:04,319 En dan gaan jy om te lees in die idee, scanline, pixel deur pixel, 19 00:01:04,319 --> 00:01:07,320 die verandering van die pixel kleure as nodig, en skryf 20 00:01:07,320 --> 00:01:08,960 diegene in die uitspraak - 21 00:01:08,960 --> 00:01:12,000 pixel vir pixel in die uitspraak scanline. 22 00:01:12,000 --> 00:01:13,780 >> Hoe begin ons gaan oor hierdie? 23 00:01:13,780 --> 00:01:16,940 Wel, gelukkig, ons het copy.c in die verspreiding kode. 24 00:01:16,940 --> 00:01:21,240 En dit gaan om te bewys baie nuttig vir ons. 25 00:01:21,240 --> 00:01:29,700 Copy.c open 'n lêer, lui in daardie infile se kop, en dan werk die 26 00:01:29,700 --> 00:01:31,070 outfile se kop. 27 00:01:31,070 --> 00:01:37,010 En dan lees dit elke pixel in die scanline, pixel deur pixel, en dan 28 00:01:37,010 --> 00:01:42,390 skryf dat pixel in die outfile. 29 00:01:42,390 --> 00:01:45,020 >> So, jou eerste stap mag wees om die volgende te hardloop 30 00:01:45,020 --> 00:01:46,420 opdrag in die terminale - 31 00:01:46,420 --> 00:01:50,270 CP copy.c whodunit.c. 32 00:01:50,270 --> 00:01:55,320 Dit sal 'n kopie van die skep van copy.c vernoem whodunit.c. 33 00:01:55,320 --> 00:01:58,320 So ons eerste stap om oop te maak die lêer, wel, daar is 'n presiese 34 00:01:58,320 --> 00:02:00,070 replika van wat in copy.c. 35 00:02:00,070 --> 00:02:03,360 So ek sal laat jy kyk na dit. 36 00:02:03,360 --> 00:02:07,860 >> Wat ons te doen het met hierdie PSET word lêer I / O, basies om lêers, 37 00:02:07,860 --> 00:02:10,229 lees, skryf, redigering hulle. 38 00:02:10,229 --> 00:02:12,650 Hoe kan jy die eerste keer 'n lêer oop te maak? 39 00:02:12,650 --> 00:02:16,800 Wel, jy gaan 'n lêer te verklaar wyser, en dan kan jy bel die 40 00:02:16,800 --> 00:02:18,670 funksie fopen. 41 00:02:18,670 --> 00:02:23,150 Slaag in die pad, of die naam van daardie lêer, en dan die modus wat jy wil hê 42 00:02:23,150 --> 00:02:24,700 dat 'n lêer om in te open 43 00:02:24,700 --> 00:02:28,620 Slaag in 'n r sal oopmaak foo.bmp vir die lees. 44 00:02:28,620 --> 00:02:35,670 Terwyl fopen met die verbygaan in 'n w sal oop bar.bmp, vir die lêer skryf en 45 00:02:35,670 --> 00:02:37,020 eintlik dit hersien word. 46 00:02:37,020 --> 00:02:41,970 >> So nou dat ons die lêer oopgemaak is, ons volgende stap is om die kop inligting by te werk 47 00:02:41,970 --> 00:02:43,230 vir die outfile. 48 00:02:43,230 --> 00:02:44,610 Wat is 'n kop-info? 49 00:02:44,610 --> 00:02:48,160 Wel, die eerste wat ons nodig het om te weet wat 'n bitmap is. 50 00:02:48,160 --> 00:02:51,000 'N bitmap is net 'n eenvoudige reëling van die grepe. 51 00:02:51,000 --> 00:02:55,480 En hulle verklaar in hierdie lêer Hier bmp.h, met 'n klomp van die 52 00:02:55,480 --> 00:02:58,610 inligting van wat 'n bitmap is eintlik gemaak uit. 53 00:02:58,610 --> 00:03:05,730 Maar wat ons regtig omgee is die bitmap lêer kop, reg hier, en 54 00:03:05,730 --> 00:03:08,460 die bitmap info kop, hier. 55 00:03:08,460 --> 00:03:13,170 Die kop is saamgestel uit 'n paar veranderlikes wat sal bewys dat baie nuttig. 56 00:03:13,170 --> 00:03:18,400 Daar is biSizeImage, wat is die totale grootte van die beeld in grepe. 57 00:03:18,400 --> 00:03:20,890 En dit sluit pixels en padding. 58 00:03:20,890 --> 00:03:24,210 Padding is baie belangrik, maar Ons sal later aan daardie. 59 00:03:24,210 --> 00:03:30,000 >> BiWidth verteenwoordig die breedte van die beeld in pixels minus die padding. 60 00:03:30,000 --> 00:03:34,220 BiHeight is dan ook die hoogte van die beeld in pixels. 61 00:03:34,220 --> 00:03:38,240 En dan is die BITMAPFILEHEADER en die BITMAPINFOHEADER, soos ek genoem 62 00:03:38,240 --> 00:03:40,900 Vroeër, die verteenwoordig as structs. 63 00:03:40,900 --> 00:03:45,410 So, jy kan nie toegang tot die lêer kop self nie, maar jy wil te kry om te 64 00:03:45,410 --> 00:03:47,370 daardie veranderlikes binne. 65 00:03:47,370 --> 00:03:48,170 >> OK. 66 00:03:48,170 --> 00:03:50,600 So hoe werk ons ​​nie die kop info? 67 00:03:50,600 --> 00:03:54,020 Wel, die eerste wat ons het om te sien of ons nodig het om enige inligting uit te verander 68 00:03:54,020 --> 00:03:58,480 die infile, die idee om die outfile, die uitspraak. 69 00:03:58,480 --> 00:04:00,250 Is iets te verander in hierdie geval? 70 00:04:00,250 --> 00:04:04,320 Wel, nie eintlik nie, want ons gaan word net die verandering van die kleure. 71 00:04:04,320 --> 00:04:07,550 Ons is nie van plan om die verandering van die lêer grootte, die beeld grootte, die breedte, 72 00:04:07,550 --> 00:04:08,310 of die hoogte. 73 00:04:08,310 --> 00:04:14,010 So jy is reg vir nou deur net die kopiëring elke pixel. 74 00:04:14,010 --> 00:04:14,840 >> OK. 75 00:04:14,840 --> 00:04:20,720 So nou laat ons kyk na hoe ons eintlik kan elke pixel te lees van die lêer. 76 00:04:20,720 --> 00:04:23,640 Nog 'n lêer I / O-funksie sal kom in die spel - 77 00:04:23,640 --> 00:04:24,700 fread. 78 00:04:24,700 --> 00:04:28,440 Dit neem in 'n verwysing na die struct dat die grepe sal bevat wat 79 00:04:28,440 --> 00:04:30,110 jy lees. 80 00:04:30,110 --> 00:04:31,890 So jy lees in daardie. 81 00:04:31,890 --> 00:04:36,090 En dan moet jy slaag in 'n grootte wat die grootte van elke element wat jy 82 00:04:36,090 --> 00:04:37,360 wil lees. 83 00:04:37,360 --> 00:04:40,640 Hier is die funksie sizeof sal handig te pas kom. 84 00:04:40,640 --> 00:04:45,570 Dan moet jy slaag in getal, wat verteenwoordig die aantal elemente van 85 00:04:45,570 --> 00:04:47,480 grootte te lees. 86 00:04:47,480 --> 00:04:51,180 En dan uiteindelik, inptr, wat die lêer wyser dat jy 87 00:04:51,180 --> 00:04:52,530 gaan lees. 88 00:04:52,530 --> 00:04:58,650 So al die elemente is binne inptr en hulle gaan data. 89 00:04:58,650 --> 00:05:01,660 >> Kom ons kyk na 'n bietjie voorbeeld. 90 00:05:01,660 --> 00:05:07,590 As ek wil lees in data twee honde, Wel, ek kan dit doen een van twee maniere. 91 00:05:07,590 --> 00:05:15,250 Ek kan nie gelees in twee voorwerpe van die grootte hond uit my inptr, of ek kan lees 92 00:05:15,250 --> 00:05:19,280 in een voorwerp van die grootte van twee honde. 93 00:05:19,280 --> 00:05:23,580 So jy sien dat, afhangende van die manier waarop dat jy reël grootte en aantal, jy 94 00:05:23,580 --> 00:05:25,840 kan lees in dieselfde aantal grepe. 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> So nou, laat ons verander die pixel kleur as wat ons nodig het. 97 00:05:33,020 --> 00:05:37,320 As jy kyk na bmp.h weer, dan Jy sal sien dat aan die onderkant 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs is nog 'n struct, waar Hulle is saamgestel uit drie grepe. 99 00:05:42,920 --> 00:05:49,220 Een, rgbtBlue, rgbtGreen, en rgbtRed. 100 00:05:49,220 --> 00:05:52,480 So elkeen van hierdie is die bedrag blou, die bedrag van die groen, en die 101 00:05:52,480 --> 00:05:57,250 bedrag van rooi binne hierdie pixel, waar elke bedrag word verteenwoordig deur 'n 102 00:05:57,250 --> 00:05:58,670 heksadesimale getal. 103 00:05:58,670 --> 00:06:04,370 >> So ff0000> sal 'n blou kleur, want dit gaan van blou, 104 00:06:04,370 --> 00:06:05,850 groen, rooi. 105 00:06:05,850 --> 00:06:09,300 En dan sal al f se wit wees. 106 00:06:09,300 --> 00:06:13,440 Kom ons neem 'n blik op smiley.bmp, wat jy in jou verspreiding kode. 107 00:06:13,440 --> 00:06:15,690 As jy dit oop te maak in net 'n beeld kyker, dan sal jy 108 00:06:15,690 --> 00:06:17,080 sien net 'n rooi gesiggie. 109 00:06:17,080 --> 00:06:20,380 Maar neem 'n dieper duik in, sal ons sien dat die struktuur 110 00:06:20,380 --> 00:06:22,340 dit is net pixels. 111 00:06:22,340 --> 00:06:25,880 Ons het 'n wit pixels, en dan rooi pixels. 112 00:06:25,880 --> 00:06:31,000 Die wit, FFFFFF, en dan is almal van die rooi pixels Ek het ingekleur vir jou 113 00:06:31,000 --> 00:06:35,440 hier, en jy sien dat hulle 0000FF. 114 00:06:35,440 --> 00:06:39,760 Zero blou, nul groen en vol rooi. 115 00:06:39,760 --> 00:06:45,350 En aangesien gesiggie is agt pixels wyd, Ons het nie padding nie. 116 00:06:45,350 --> 00:06:47,360 Alle regte. 117 00:06:47,360 --> 00:06:53,310 >> So as ek verskillende waardes toe te ken 'n RGBTRIPLE en ek wou 118 00:06:53,310 --> 00:06:58,350 maak dit groen, dan wat ek wil doen, is om Ek wil 'n RGBTRIPLE, vernoem verklaar 119 00:06:58,350 --> 00:07:02,660 trippel, en dan elke om toegang te verkry byte binne daardie struct ek 120 00:07:02,660 --> 00:07:04,030 sou die dot operateur gebruik. 121 00:07:04,030 --> 00:07:08,430 So triple.rgbtBlue, kan ek toewys wat aan 0. 122 00:07:08,430 --> 00:07:13,460 Groen Ek kan dit aan 'n volle - enige nommer, regtig, tussen 0 en VF. 123 00:07:13,460 --> 00:07:15,470 En dan rooi, Ek gaan ook om te sê 0. 124 00:07:15,470 --> 00:07:19,160 So dan is dit gee my 'n groen pixel. 125 00:07:19,160 --> 00:07:23,030 >> Volgende, wat as ek wil om te kyk die waarde van iets? 126 00:07:23,030 --> 00:07:27,250 Ek kan iets wees wat tjeks of die drie se rgbtBlue waarde is 127 00:07:27,250 --> 00:07:31,080 VF en dan druk, "Ek voel blou! ", as 'n gevolg. 128 00:07:31,080 --> 00:07:35,640 Nou, dit beteken nie noodwendig dat die pixel is blou, reg? 129 00:07:35,640 --> 00:07:40,060 Omdat die pixel se groen en rooi waardes kon ook nie-0-waardes. 130 00:07:40,060 --> 00:07:43,470 Al wat dit beteken, en alles wat dit nagaan vir is 131 00:07:43,470 --> 00:07:45,610 vir 'n volle blou kleur. 132 00:07:45,610 --> 00:07:50,050 Maar al pixels kan ook gedeeltelike kleur waardes, soos hierdie 133 00:07:50,050 --> 00:07:52,180 volgende voorbeeld hier. 134 00:07:52,180 --> 00:07:55,400 >> Dit is 'n bietjie moeiliker om te sien wat die beeld is nou. 135 00:07:55,400 --> 00:08:00,320 Dit lyk 'n bietjie meer soos die clue.bmp dat jy gegee word. 136 00:08:00,320 --> 00:08:03,600 Nou, fisies, kan jy dit op te los, want daar is 'n baie rooi, deur 137 00:08:03,600 --> 00:08:07,040 hou 'n rooi skerm die beeld so dat die ander kleure kan verskyn. 138 00:08:07,040 --> 00:08:10,968 So hoe kan ons naboots dit met c? 139 00:08:10,968 --> 00:08:15,640 Wel, ons kan verwyder al die rooi van die beeld heeltemal. 140 00:08:15,640 --> 00:08:21,870 En om dit te doen wat ons wil stel elke pixel se rooi waarde na 0. 141 00:08:21,870 --> 00:08:25,020 En so het die beeld 'n bietjie sou lyk bietjie soos hierdie, waar ons geen rooi 142 00:08:25,020 --> 00:08:26,300 hoegenaamd nie. 143 00:08:26,300 --> 00:08:29,390 >> Ons kan die verborge boodskap 'n sien bietjie meer duidelik nou. 144 00:08:29,390 --> 00:08:31,730 Dit is 'n ander gesiggie gesig. 145 00:08:31,730 --> 00:08:33,870 Of miskien kan ons 'n ander metode gebruik. 146 00:08:33,870 --> 00:08:36,480 Miskien kan ons identifiseer al die rooi pixels - 147 00:08:36,480 --> 00:08:41,100 dit is, is al die pixels met 0 blou, 0 groen, en 0 rooi - 148 00:08:41,100 --> 00:08:43,169 en verander diegene wit. 149 00:08:43,169 --> 00:08:45,470 En ons beeld kan sien iets soos hierdie. 150 00:08:45,470 --> 00:08:48,250 'N bietjie makliker om te sien. 151 00:08:48,250 --> 00:08:51,170 >> Daar is baie ander maniere te ontbloot die geheime boodskap so goed, 152 00:08:51,170 --> 00:08:53,730 die hantering van die kleur manipulasie. 153 00:08:53,730 --> 00:08:57,050 Miskien kan jy een van die metodes gebruik dat ek hierbo genoem. 154 00:08:57,050 --> 00:08:59,600 En Daarbenewens, kan jy wil sommige kleure te verbeter 155 00:08:59,600 --> 00:09:02,620 en bring hulle uit. 156 00:09:02,620 --> 00:09:06,190 >> So nou dat ons die pixel het verander kleur, langs ons net nodig het om te skryf 157 00:09:06,190 --> 00:09:08,500 in die scanline, pixel deur pixel. 158 00:09:08,500 --> 00:09:11,860 En nog 'n keer, sal jy wil om terug te kyk te copy.c, as jy nie kopieer 159 00:09:11,860 --> 00:09:18,170 dit reeds, en kyk na die fwrite funksie, wat neem data, 'n wyser 160 00:09:18,170 --> 00:09:23,230 die struct dat die grepe bevat dat jy die lees van, die grootte van 161 00:09:23,230 --> 00:09:26,610 die items, die aantal items, en dan die outptr - 162 00:09:26,610 --> 00:09:29,450 die bestemming van die lêers. 163 00:09:29,450 --> 00:09:34,010 >> Nadat jy in die pixels skryf, sal jy het ook in die padding te skryf. 164 00:09:34,010 --> 00:09:34,970 Wat is padding? 165 00:09:34,970 --> 00:09:38,670 Wel, elke rgbt pixel is drie grepe lank. 166 00:09:38,670 --> 00:09:43,670 Maar, die scanline vir 'n bitmap image het 'n veelvoud van vier grepe wees. 167 00:09:43,670 --> 00:09:47,650 En as die aantal pixels is nie 'n verskeie van vier, dan moet ons by te voeg 168 00:09:47,650 --> 00:09:48,880 hierdie padding. 169 00:09:48,880 --> 00:09:51,420 Padding net deur 0s. 170 00:09:51,420 --> 00:09:54,380 So, hoe kan ons skryf, of dit lees? 171 00:09:54,380 --> 00:09:59,280 Wel, dit blyk dat jy nie kan eintlik fread padding, maar jy kan 172 00:09:59,280 --> 00:10:00,970 bereken nie. 173 00:10:00,970 --> 00:10:04,400 >> In hierdie geval, die idee en die uitspraak het dieselfde breedte, sodat die 174 00:10:04,400 --> 00:10:05,910 padding is dieselfde. 175 00:10:05,910 --> 00:10:09,370 En die padding, as jy sien in copy.c, word bereken 176 00:10:09,370 --> 00:10:11,790 met die onderstaande formule - 177 00:10:11,790 --> 00:10:16,690 bi.biWidth keer sizeof (RGBTRIPLE) sal gee ons hoeveel grepe die bmp 178 00:10:16,690 --> 00:10:18,280 het in elke ry. 179 00:10:18,280 --> 00:10:21,890 Van daar, die modulos en aftrekking met 4 kan bereken hoe 180 00:10:21,890 --> 00:10:25,610 baie grepe moet bygevoeg word sodat die verskeie grepe op 181 00:10:25,610 --> 00:10:27,250 elke ry is vier. 182 00:10:27,250 --> 00:10:30,490 >> Nou dat ons die formule vir hoeveel padding ons nodig het, nou 183 00:10:30,490 --> 00:10:31,610 Ons kan dit skryf. 184 00:10:31,610 --> 00:10:34,080 Nou, ek voorheen genoem, padding is net 0s. 185 00:10:34,080 --> 00:10:39,730 So in daardie geval, ons is maar net om 'n kar, in hierdie geval 'n 0, in ons 186 00:10:39,730 --> 00:10:41,710 outptr - ons outfile. 187 00:10:41,710 --> 00:10:47,530 So wat net kan wees fputc 0, komma outptr. 188 00:10:47,530 --> 00:10:52,400 >> So, terwyl ons het gelees in ons lêer, het lêer I / O spoor van hou ons 189 00:10:52,400 --> 00:10:57,440 posisie in die lêers met iets genoem die lêer posisie aanwyser. 190 00:10:57,440 --> 00:10:59,350 Dink aan dit as 'n wyser. 191 00:10:59,350 --> 00:11:03,550 Eintlik is dit vooruitgang elke keer dat ons fread, maar ons het 192 00:11:03,550 --> 00:11:05,671 beheer oor dit ook. 193 00:11:05,671 --> 00:11:11,030 >> Die lêer posisie aanwyser om te beweeg, jy kan gebruik om die funksie fseek. 194 00:11:11,030 --> 00:11:15,600 Waar die inptr verteenwoordig die lêer wyser wat jy soek in die 195 00:11:15,600 --> 00:11:20,370 bedrag is die aantal grepe wat jy wil die wyser om te beweeg, en dan van 196 00:11:20,370 --> 00:11:23,470 betrekking het op die verwysingspunt van waar die wyser. 197 00:11:23,470 --> 00:11:26,770 As jy in SEEK_CUR slaag, wat verteenwoordig die huidige 198 00:11:26,770 --> 00:11:28,100 posisie in die lêer. 199 00:11:28,100 --> 00:11:31,020 Of jy kan gebruik om 'n paar ander parameters. 200 00:11:31,020 --> 00:11:35,400 So, sou ons wil te gebruik fseek te slaan oor die padding van die lêer. 201 00:11:35,400 --> 00:11:39,410 En weer, as jy vas, daar is 'n voorbeeld van wat in copy.c. 202 00:11:39,410 --> 00:11:43,260 >> So nou het ons die lêer oopgemaak is, die idee, en die uitspraak. 203 00:11:43,260 --> 00:11:46,450 Ons het verander die kop info vir ons uitspraak, want elke 204 00:11:46,450 --> 00:11:48,730 bitmap moet 'n kop. 205 00:11:48,730 --> 00:11:52,280 Ons het dan gelees word in die idee's scanline, pixel deur pixel, die verandering 206 00:11:52,280 --> 00:11:55,210 elke kleur as dit nodig is, en skryf die in die 207 00:11:55,210 --> 00:11:57,340 uitspraak, pixel deur pixel. 208 00:11:57,340 --> 00:12:01,550 Sodra jy uitspraak maak, kan jy sien wat die skuldige, of wat die geheime 209 00:12:01,550 --> 00:12:02,850 boodskap is. 210 00:12:02,850 --> 00:12:05,550 My naam is Zamyla, en dit was detective verhaal. 211 00:12:05,550 --> 00:12:12,864