1 00:00:00,000 --> 00:00:09,500 >> [Musikk spilles] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA CHAN: Det var Miss Scarlett med lysestaken. 3 00:00:12,350 --> 00:00:13,560 Whodunit? 4 00:00:13,560 --> 00:00:15,030 Vel, vi kommer til å finne ut. 5 00:00:15,030 --> 00:00:20,870 I brettspillet Clue, kanskje du gis en fysisk rødt bilde. 6 00:00:20,870 --> 00:00:24,120 Og det bildet er veldig rød og flekkete, og din jobb er å 7 00:00:24,120 --> 00:00:25,490 avdekke skjulte budskap. 8 00:00:25,490 --> 00:00:29,740 Og vanligvis du er utstyrt med en rød forstørrelsesglass, eller en rød skjerm til 9 00:00:29,740 --> 00:00:31,410 avslører at skjulte budskap. 10 00:00:31,410 --> 00:00:33,340 Vel, vi skal etterligne det. 11 00:00:33,340 --> 00:00:37,960 >> I whodunit, får du et bitmap-bilde som ser veldig ustabil og rød, 12 00:00:37,960 --> 00:00:43,430 og deretter kjøre whodunit program å avdekke et skjult budskap. 13 00:00:43,430 --> 00:00:45,650 >> Så la oss bryte dette i trinn. 14 00:00:45,650 --> 00:00:50,390 Først ønsker du å åpne filen - ledetråd som du har fått. 15 00:00:50,390 --> 00:00:53,880 Og da også skape en Dommen bitmap fil. 16 00:00:53,880 --> 00:00:58,240 Så du ønsker å oppdatere bitmap header info for dommen outfile. 17 00:00:58,240 --> 00:00:59,920 Mer om det senere. 18 00:00:59,920 --> 00:01:04,319 Og så kommer dere til å lese inn i anelse, scanline, piksel for piksel, 19 00:01:04,319 --> 00:01:07,320 endre pixel farger som nødvendig, og skriving 20 00:01:07,320 --> 00:01:08,960 de inn i dommen - 21 00:01:08,960 --> 00:01:12,000 piksel for piksel i det Dommen scanline. 22 00:01:12,000 --> 00:01:13,780 >> Hvor skal vi begynne å gå om dette? 23 00:01:13,780 --> 00:01:16,940 Vel, heldigvis, har vi copy.c i fordelingskode. 24 00:01:16,940 --> 00:01:21,240 Og dette kommer til å bevise ganske nyttig for oss. 25 00:01:21,240 --> 00:01:29,700 Copy.c åpner en fil, leser i den infile header, og deretter oppdaterer 26 00:01:29,700 --> 00:01:31,070 outfile header. 27 00:01:31,070 --> 00:01:37,010 Og så leser hver piksel i scanline, piksel for piksel, og deretter 28 00:01:37,010 --> 00:01:42,390 skriver at pixel inn i outfile. 29 00:01:42,390 --> 00:01:45,020 >> Så, det første trinnet kan være å kjøre følgende 30 00:01:45,020 --> 00:01:46,420 kommando i terminalen - 31 00:01:46,420 --> 00:01:50,270 cp copy.c whodunit.c. 32 00:01:50,270 --> 00:01:55,320 Dette vil skape en kopi av copy.c heter whodunit.c. 33 00:01:55,320 --> 00:01:58,320 Så vår første skritt til å åpne fil, vel, det er en eksakt 34 00:01:58,320 --> 00:02:00,070 kopi av det i copy.c. 35 00:02:00,070 --> 00:02:03,360 Så jeg vil forlate deg til å se på det. 36 00:02:03,360 --> 00:02:07,860 >> Hva vi har å gjøre med i denne PSett er fil I / O, i utgangspunktet å ta filer, 37 00:02:07,860 --> 00:02:10,229 lese, skrive, redigere dem. 38 00:02:10,229 --> 00:02:12,650 Hvordan kan du først åpne en fil? 39 00:02:12,650 --> 00:02:16,800 Vel, du kommer til å erklære en fil pekeren, og deretter du ringe 40 00:02:16,800 --> 00:02:18,670 funksjonen fopen. 41 00:02:18,670 --> 00:02:23,150 Pass på banen, eller navnet på det fil, og deretter den modusen du vil 42 00:02:23,150 --> 00:02:24,700 å åpne denne filen i. 43 00:02:24,700 --> 00:02:28,620 Passerer i en r vil åpne foo.bmp for lesing. 44 00:02:28,620 --> 00:02:35,670 Mens fopen med bestått i en w vil åpen bar.bmp, for skriving til fil og 45 00:02:35,670 --> 00:02:37,020 faktisk å redigere den. 46 00:02:37,020 --> 00:02:41,970 >> Så nå som vi har åpnet filen, vår Neste steg er å oppdatere header info 47 00:02:41,970 --> 00:02:43,230 for outfile. 48 00:02:43,230 --> 00:02:44,610 Hva er en header info? 49 00:02:44,610 --> 00:02:48,160 Vel, først må vi vite hva en bitmap er. 50 00:02:48,160 --> 00:02:51,000 Et bitmap er bare en enkel arrangement av bytes. 51 00:02:51,000 --> 00:02:55,480 Og de er deklarert i denne filen her, bmp.h, med en haug med 52 00:02:55,480 --> 00:02:58,610 informasjon om hva et bitmap er faktisk laget av. 53 00:02:58,610 --> 00:03:05,730 Men det vi virkelig bryr seg om er bitmap fil header, akkurat her, og 54 00:03:05,730 --> 00:03:08,460 bitmap info header, over her. 55 00:03:08,460 --> 00:03:13,170 Toppteksten er sammensatt av et par variabler som vil være svært nyttig. 56 00:03:13,170 --> 00:03:18,400 Det er biSizeImage, som er totale størrelsen på bildet i byte. 57 00:03:18,400 --> 00:03:20,890 Og dette inkluderer piksler og polstring. 58 00:03:20,890 --> 00:03:24,210 Padding er svært viktig, men vi får til det senere. 59 00:03:24,210 --> 00:03:30,000 >> BiWidth representerer bredden på bildet i piksler minus padding. 60 00:03:30,000 --> 00:03:34,220 BiHeight er da også høyden av bildet i piksler. 61 00:03:34,220 --> 00:03:38,240 Og så BITMAPFILEHEADER og BITMAPINFOHEADER, som jeg nevnte 62 00:03:38,240 --> 00:03:40,900 tidligere, er de som er representert som structs. 63 00:03:40,900 --> 00:03:45,410 Så, kan du ikke få tilgang til filen header seg selv, men du vil ønske å komme til 64 00:03:45,410 --> 00:03:47,370 disse variablene inne. 65 00:03:47,370 --> 00:03:48,170 >> OK. 66 00:03:48,170 --> 00:03:50,600 Så hvordan oppdaterer vi overskriften info? 67 00:03:50,600 --> 00:03:54,020 Vel, først må vi se om vi trenger å endre noe av informasjonen fra 68 00:03:54,020 --> 00:03:58,480 den infile, ledetråd, til outfile, dommen. 69 00:03:58,480 --> 00:04:00,250 Er det noe som endrer seg i denne saken? 70 00:04:00,250 --> 00:04:04,320 Vel, ikke egentlig, fordi vi skal skal bare endre fargene. 71 00:04:04,320 --> 00:04:07,550 Vi kommer ikke til å være i endring filen størrelse, vil bildestørrelsen, bredden, 72 00:04:07,550 --> 00:04:08,310 eller høyden. 73 00:04:08,310 --> 00:04:14,010 Så du er all right for nå ved bare å kopiere hver piksel. 74 00:04:14,010 --> 00:04:14,840 >> OK. 75 00:04:14,840 --> 00:04:20,720 Så nå la oss se på hvordan vi faktisk kan lese hver piksel fra filen. 76 00:04:20,720 --> 00:04:23,640 En annen fil I / O-funksjon kommer inn i bildet - 77 00:04:23,640 --> 00:04:24,700 fread. 78 00:04:24,700 --> 00:04:28,440 Det tar i en peker til struct som skal inneholde de bytes som 79 00:04:28,440 --> 00:04:30,110 du leser. 80 00:04:30,110 --> 00:04:31,890 Så du leser inn i det. 81 00:04:31,890 --> 00:04:36,090 Og så du passerer i en størrelse, som er størrelsen på hvert element som du 82 00:04:36,090 --> 00:04:37,360 ønsker å lese. 83 00:04:37,360 --> 00:04:40,640 Her funksjonen sizeof vil komme godt med. 84 00:04:40,640 --> 00:04:45,570 Da passerer du i antall, noe som representerer antallet elementer i 85 00:04:45,570 --> 00:04:47,480 størrelse til å lese. 86 00:04:47,480 --> 00:04:51,180 Og til slutt, inptr, som er filen peker som du er 87 00:04:51,180 --> 00:04:52,530 skal lese fra. 88 00:04:52,530 --> 00:04:58,650 Så alle disse elementene er inne inptr og de kommer til data. 89 00:04:58,650 --> 00:05:01,660 >> La oss se på et lite eksempel. 90 00:05:01,660 --> 00:05:07,590 Hvis jeg ønsker å lese inn data to hunder, vel, jeg kan gjøre det på to måter. 91 00:05:07,590 --> 00:05:15,250 Jeg kan enten lese i to objekter av størrelse hund fra min inptr, eller jeg kan lese 92 00:05:15,250 --> 00:05:19,280 i et objekt på størrelse med to hunder. 93 00:05:19,280 --> 00:05:23,580 Så du ser at avhengig av hvordan at du ordne størrelse og antall, du 94 00:05:23,580 --> 00:05:25,840 kan lese i samme antall byte. 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> Så nå, la oss endre pixel farge som vi trenger. 97 00:05:33,020 --> 00:05:37,320 Hvis du ser på bmp.h igjen, da vil du se at på bunnen 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs er en annen struct, hvor de består av tre bytes. 99 00:05:42,920 --> 00:05:49,220 One, rgbtBlue, rgbtGreen, og rgbtRed. 100 00:05:49,220 --> 00:05:52,480 Så hver av disse representerer mengden blått, mengden av grønt, og den 101 00:05:52,480 --> 00:05:57,250 mengde røde inni denne pixel, hvor hvert beløp er representert med en 102 00:05:57,250 --> 00:05:58,670 heksadesimale tall. 103 00:05:58,670 --> 00:06:04,370 >> Så FF0000 vil være en blå farge, fordi det går fra blått, 104 00:06:04,370 --> 00:06:05,850 til grønt, til rødt. 105 00:06:05,850 --> 00:06:09,300 Og så alle f-er vil være hvit. 106 00:06:09,300 --> 00:06:13,440 La oss ta en titt på smiley.bmp, som du har i din distribusjon kode. 107 00:06:13,440 --> 00:06:15,690 Hvis du åpner den i bare et bilde seer, så vil du 108 00:06:15,690 --> 00:06:17,080 bare se en rød smiley. 109 00:06:17,080 --> 00:06:20,380 Men å ta et dypere dykk i, vi vil se at konstruksjonen 110 00:06:20,380 --> 00:06:22,340 av er det bare piksler. 111 00:06:22,340 --> 00:06:25,880 Vi har hvite piksler, og deretter røde piksler. 112 00:06:25,880 --> 00:06:31,000 Den hvite, ffffff, og deretter hele røde piksler Jeg har farget i for deg 113 00:06:31,000 --> 00:06:35,440 her, og du ser at de er 0000FF. 114 00:06:35,440 --> 00:06:39,760 Zero blå, null grønn, og full red. 115 00:06:39,760 --> 00:06:45,350 Og siden smiley er åtte piksler bred, vi har ikke noe padding. 116 00:06:45,350 --> 00:06:47,360 OK. 117 00:06:47,360 --> 00:06:53,310 >> Så hvis jeg skulle tildele forskjellige verdier til en RGBTRIPLE og jeg ønsket å 118 00:06:53,310 --> 00:06:58,350 gjøre det grønne, så hva jeg ville gjøre er Jeg ville erklære en RGBTRIPLE, oppkalt 119 00:06:58,350 --> 00:07:02,660 trippel, og deretter å få tilgang til alle byte innenfor denne struct jeg 120 00:07:02,660 --> 00:07:04,030 ville bruke dot operatør. 121 00:07:04,030 --> 00:07:08,430 Så triple.rgbtBlue, kan jeg tilordne dette til 0. 122 00:07:08,430 --> 00:07:13,460 Grønn Jeg kan tildele det til fulle - noe nummer, egentlig, mellom 0 og ff. 123 00:07:13,460 --> 00:07:15,470 Og så rødt, jeg også kommer til å si 0. 124 00:07:15,470 --> 00:07:19,160 Så da det gir meg en grønn piksel. 125 00:07:19,160 --> 00:07:23,030 >> Neste, hva om jeg ønsker å sjekke verdien av noe? 126 00:07:23,030 --> 00:07:27,250 Jeg kunne ha noe som sjekker om trippel er rgbtBlue verdi er 127 00:07:27,250 --> 00:07:31,080 ff og deretter skrive ut, "Jeg føler blue ", som et resultat. 128 00:07:31,080 --> 00:07:35,640 Nå, det betyr ikke nødvendigvis at at pixel er blå, ikke sant? 129 00:07:35,640 --> 00:07:40,060 Fordi piksel grønne og røde verdier kan også ha ikke-0-verdier. 130 00:07:40,060 --> 00:07:43,470 Alt som dette innebærer, og alt som dette er å sjekke for er 131 00:07:43,470 --> 00:07:45,610 for en full blå farge. 132 00:07:45,610 --> 00:07:50,050 Men alle pikslene kan også ha delvis fargeverdier, som dette 133 00:07:50,050 --> 00:07:52,180 neste eksempel her. 134 00:07:52,180 --> 00:07:55,400 >> Det er litt vanskeligere å se hva dette bildet er nå. 135 00:07:55,400 --> 00:08:00,320 Dette ser litt mer ut som clue.bmp at du vil bli gitt. 136 00:08:00,320 --> 00:08:03,600 Nå, fysisk, kan du løse dette, fordi det er mye rødt, etter 137 00:08:03,600 --> 00:08:07,040 holder opp en rød skjerm til bildet slik at de andre fargene kan dukke opp. 138 00:08:07,040 --> 00:08:10,968 Så hvordan skal vi etterligne dette med c? 139 00:08:10,968 --> 00:08:15,640 Vel, vi kan fjerne alle røde fra bildet i sin helhet. 140 00:08:15,640 --> 00:08:21,870 Og så for å gjøre det vi ville sett hver pixel røde verdien til 0. 141 00:08:21,870 --> 00:08:25,020 Og slik at bildet vil se litt litt som dette, hvor vi har ingen rød 142 00:08:25,020 --> 00:08:26,300 hodet. 143 00:08:26,300 --> 00:08:29,390 >> Vi kan se det skjulte budskapet en litt mer tydelig nå. 144 00:08:29,390 --> 00:08:31,730 Det er en annen smiley face. 145 00:08:31,730 --> 00:08:33,870 Eller kanskje vi kunne bruke en annen metode. 146 00:08:33,870 --> 00:08:36,480 Kanskje kan vi identifisere alle de røde piksler - 147 00:08:36,480 --> 00:08:41,100 det vil si alle pikslene med 0 blå, 0 grønn, og 0 rød - 148 00:08:41,100 --> 00:08:43,169 og endre dem til hvit. 149 00:08:43,169 --> 00:08:45,470 Og vårt bilde kan se ut noe sånt som dette. 150 00:08:45,470 --> 00:08:48,250 Litt lettere å se. 151 00:08:48,250 --> 00:08:51,170 >> Det er mange andre måter å avdekke den hemmelige budskap i tillegg, 152 00:08:51,170 --> 00:08:53,730 arbeider med farge manipulasjon. 153 00:08:53,730 --> 00:08:57,050 Kanskje du kan bruke en av metodene som nevnt ovenfor. 154 00:08:57,050 --> 00:08:59,600 Og i tillegg, vil du kanskje å forbedre noen farger 155 00:08:59,600 --> 00:09:02,620 og ta dem ut. 156 00:09:02,620 --> 00:09:06,190 >> Så nå som vi har endret pixel farge, neste vi trenger bare å skrive dem 157 00:09:06,190 --> 00:09:08,500 inn til scanline, piksel for piksel. 158 00:09:08,500 --> 00:09:11,860 Og enda en gang, vil du ønsker å se tilbake å copy.c, hvis du ikke har kopiert 159 00:09:11,860 --> 00:09:18,170 det allerede, og se på fwrite funksjon, som tar data, en peker 160 00:09:18,170 --> 00:09:23,230 til struct som inneholder bytes at du leser fra, størrelsen på 161 00:09:23,230 --> 00:09:26,610 elementene, antall elementer, og deretter outptr - 162 00:09:26,610 --> 00:09:29,450 målet for disse filene. 163 00:09:29,450 --> 00:09:34,010 >> Etter at du har skrive i piksler, vil du må også skrive i padding. 164 00:09:34,010 --> 00:09:34,970 Hva er padding? 165 00:09:34,970 --> 00:09:38,670 Vel, hver rgbt pixel er tre byte. 166 00:09:38,670 --> 00:09:43,670 Men, den scanline for et punktgrafikkbilde må være et multiplum av fire bytes. 167 00:09:43,670 --> 00:09:47,650 Og hvis antall piksler er ikke et multiplum av fire, så vi må legge 168 00:09:47,650 --> 00:09:48,880 dette padding. 169 00:09:48,880 --> 00:09:51,420 Padding er bare representert ved 0s. 170 00:09:51,420 --> 00:09:54,380 Så, hvordan kan vi skrive, eller lese dette? 171 00:09:54,380 --> 00:09:59,280 Vel, det viser seg at du ikke kan faktisk fread padding, men du kan 172 00:09:59,280 --> 00:10:00,970 beregne det. 173 00:10:00,970 --> 00:10:04,400 >> I dette tilfellet, anelse og dommen har den samme bredde, slik at 174 00:10:04,400 --> 00:10:05,910 polstring er den samme. 175 00:10:05,910 --> 00:10:09,370 Og padding, som du vil se i copy.c, beregnes 176 00:10:09,370 --> 00:10:11,790 med følgende formel - 177 00:10:11,790 --> 00:10:16,690 bi.biWidth ganger sizeof (RGBTRIPLE) vil gi oss hvor mange byte den bmp 178 00:10:16,690 --> 00:10:18,280 har i hver rad. 179 00:10:18,280 --> 00:10:21,890 Derfra modulo og subtraksjonene med 4 kan beregne hvor 180 00:10:21,890 --> 00:10:25,610 mange byte må legges slik at multiplum av byte på 181 00:10:25,610 --> 00:10:27,250 hver rad er fire. 182 00:10:27,250 --> 00:10:30,490 >> Nå som vi har formelen for hvor mye padding vi trenger, nå 183 00:10:30,490 --> 00:10:31,610 vi kan skrive det. 184 00:10:31,610 --> 00:10:34,080 Nå nevnte jeg før, padding er bare 0s. 185 00:10:34,080 --> 00:10:39,730 Så i dette tilfellet, vi bare å sette en røye, i dette tilfellet en 0, inn i vår 186 00:10:39,730 --> 00:10:41,710 outptr - vår outfile. 187 00:10:41,710 --> 00:10:47,530 Så det kan bare være fputc 0, komma outptr. 188 00:10:47,530 --> 00:10:52,400 >> Så, mens vi har lest i vår fil, har fil I / O holdt orden på vår 189 00:10:52,400 --> 00:10:57,440 posisjon i disse filene med noe heter filen posisjonsindikator. 190 00:10:57,440 --> 00:10:59,350 Tenk på det som en markør. 191 00:10:59,350 --> 00:11:03,550 I utgangspunktet, fremskritt det hver gang at vi fread, men vi har 192 00:11:03,550 --> 00:11:05,671 kontroll over det, også. 193 00:11:05,671 --> 00:11:11,030 >> Å flytte filen posisjonsindikator, du kan bruke funksjonen fseek. 194 00:11:11,030 --> 00:11:15,600 Der inptr representerer filen peker som du søker i, 195 00:11:15,600 --> 00:11:20,370 beløpet er antall byte som du ønsker å flytte markøren, og deretter fra 196 00:11:20,370 --> 00:11:23,470 vedrører referansepunktet fra der markøren er. 197 00:11:23,470 --> 00:11:26,770 Hvis du passerer i SEEK_CUR, at representerer den nåværende 198 00:11:26,770 --> 00:11:28,100 posisjon i filen. 199 00:11:28,100 --> 00:11:31,020 Eller du kan bruke noen andre parametere. 200 00:11:31,020 --> 00:11:35,400 Så, kanskje vi ønsker å bruke fseek å hoppe over polstring av i filen. 201 00:11:35,400 --> 00:11:39,410 Og igjen, hvis du sitter fast, er det et eksempel på dette i copy.c. 202 00:11:39,410 --> 00:11:43,260 >> Så nå har vi åpnet filen, ledetråd, og dommen. 203 00:11:43,260 --> 00:11:46,450 Vi har oppdatert overskriften info for Vår dom, fordi hver 204 00:11:46,450 --> 00:11:48,730 bitmap trenger en header. 205 00:11:48,730 --> 00:11:52,280 Vi har deretter leses inn i ledetråd er scanline, piksel for piksel, skiftende 206 00:11:52,280 --> 00:11:55,210 hver farge som er nødvendig, og skriver de inn i 207 00:11:55,210 --> 00:11:57,340 dommen, piksel for piksel. 208 00:11:57,340 --> 00:12:01,550 Når du åpner dommen, kan du se hvem som den skyldige, eller hva hemmeligheten 209 00:12:01,550 --> 00:12:02,850 meldingen er. 210 00:12:02,850 --> 00:12:05,550 Mitt navn er Zamyla, og dette var whodunit. 211 00:12:05,550 --> 00:12:12,864