1 00:00:00,000 --> 00:00:09,500 >> [Musikgengivelse] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA CHAN: Det var Miss Scarlett med lysestage. 3 00:00:12,350 --> 00:00:13,560 Krimi? 4 00:00:13,560 --> 00:00:15,030 Nå, vi kommer til at finde ud af. 5 00:00:15,030 --> 00:00:20,870 I brætspillet Clue, kan du givet et fysisk røde billede. 6 00:00:20,870 --> 00:00:24,120 Og at billedet er meget rød og plettet, og dit job er at 7 00:00:24,120 --> 00:00:25,490 afsløre skjulte budskab. 8 00:00:25,490 --> 00:00:29,740 Og som regel er du udstyret med en rød forstørrelsesglas eller et rødt skærmen 9 00:00:29,740 --> 00:00:31,410 viser, at skjult besked. 10 00:00:31,410 --> 00:00:33,340 Nå, vi kommer til at efterligne det. 11 00:00:33,340 --> 00:00:37,960 >> I mordmysterium, får du et bitmap billede der ser meget plettet og rød, 12 00:00:37,960 --> 00:00:43,430 og derefter køre krimi-programmet at afsløre en skjult besked. 13 00:00:43,430 --> 00:00:45,650 >> Så lad os bryde dette i trin. 14 00:00:45,650 --> 00:00:50,390 Først, du ønsker at åbne filen - fingerpeg, at du har fået. 15 00:00:50,390 --> 00:00:53,880 Og så også skabe en Dommen bitmap-fil. 16 00:00:53,880 --> 00:00:58,240 Så du ønsker at opdatere bitmap header info for dommen outfile. 17 00:00:58,240 --> 00:00:59,920 Mere om det senere. 18 00:00:59,920 --> 00:01:04,319 Og så er du kommer til at læse i det fingerpeg, scanlinie, pixel for pixel, 19 00:01:04,319 --> 00:01:07,320 ændre pixel farver nødvendigt, og skrivning 20 00:01:07,320 --> 00:01:08,960 dem i dommen - 21 00:01:08,960 --> 00:01:12,000 pixel for pixel i Dommen scanlinie. 22 00:01:12,000 --> 00:01:13,780 >> Hvordan kan vi begynde at gå om dette? 23 00:01:13,780 --> 00:01:16,940 Nå, heldigvis har vi copy.c i fordelingen kode. 24 00:01:16,940 --> 00:01:21,240 Og det kommer til at bevise ganske nyttigt for os. 25 00:01:21,240 --> 00:01:29,700 Copy.c åbner en fil, læser i det infile overskrift, og opdaterer derefter 26 00:01:29,700 --> 00:01:31,070 outfile overskrift. 27 00:01:31,070 --> 00:01:37,010 Og så læser hver pixel i scanlinie, pixel for pixel, og derefter 28 00:01:37,010 --> 00:01:42,390 skriver, at pixel i outfile. 29 00:01:42,390 --> 00:01:45,020 >> Så dit første skridt måske være at kø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 skabe en kopi af copy.c opkaldt whodunit.c. 33 00:01:55,320 --> 00:01:58,320 Så vores første skridt til at åbne fil, ja, der er en nøjagtig 34 00:01:58,320 --> 00:02:00,070 replika af at copy.c. 35 00:02:00,070 --> 00:02:03,360 Så jeg vil forlade dig til at se på det. 36 00:02:03,360 --> 00:02:07,860 >> Hvad vi har at gøre med i denne PSET er fil I / O, dybest set at tage filer, 37 00:02:07,860 --> 00:02:10,229 læsning, skrivning, redigere dem. 38 00:02:10,229 --> 00:02:12,650 Hvordan du først åbner en fil? 39 00:02:12,650 --> 00:02:16,800 Nå, er du nødt til at erklære en fil pointer, og derefter ringe dig 40 00:02:16,800 --> 00:02:18,670 funktionen fopen. 41 00:02:18,670 --> 00:02:23,150 Pass i stien, eller navnet på denne fil og derefter den funktion, som du vil 42 00:02:23,150 --> 00:02:24,700 for at åbne filen i. 43 00:02:24,700 --> 00:02:28,620 Passing i en r vil åbne foo.bmp for læsning. 44 00:02:28,620 --> 00:02:35,670 Betragtninger fopen med passerer i en w vil åben bar.bmp, for at skrive filen og 45 00:02:35,670 --> 00:02:37,020 faktisk redigere den. 46 00:02:37,020 --> 00:02:41,970 >> Så nu, at vi har åbnet filen, vores næste skridt er at opdatere header info 47 00:02:41,970 --> 00:02:43,230 for outfile. 48 00:02:43,230 --> 00:02:44,610 Hvad er en header info? 49 00:02:44,610 --> 00:02:48,160 Nå, vi først nødt til at vide hvad en bitmap er. 50 00:02:48,160 --> 00:02:51,000 En bitmap er bare en simpel arrangement af byte. 51 00:02:51,000 --> 00:02:55,480 Og de er erklæret i denne fil her, bmp.h, med en flok 52 00:02:55,480 --> 00:02:58,610 oplysninger om, hvad en bitmap er faktisk lavet af. 53 00:02:58,610 --> 00:03:05,730 Men hvad vi virkelig bekymrer sig om, er bitmap-fil header, lige her, og 54 00:03:05,730 --> 00:03:08,460 bitmap info header, herovre. 55 00:03:08,460 --> 00:03:13,170 Headeren består af et par variabler, der vil vise sig meget nyttig. 56 00:03:13,170 --> 00:03:18,400 Der er biSizeImage, som er samlede størrelse af billedet i byte. 57 00:03:18,400 --> 00:03:20,890 Og dette inkluderer pixels og polstring. 58 00:03:20,890 --> 00:03:24,210 Polstring er meget vigtig, men vi får til senere. 59 00:03:24,210 --> 00:03:30,000 >> BiWidth repræsenterer bredden af billede i pixels minus polstringen. 60 00:03:30,000 --> 00:03:34,220 BiHeight er da også højden af billedet i pixel. 61 00:03:34,220 --> 00:03:38,240 Og så BITMAPFILEHEADER og BITMAPINFOHEADER, som jeg nævnte 62 00:03:38,240 --> 00:03:40,900 tidligere, er de repræsenteret som structs. 63 00:03:40,900 --> 00:03:45,410 Så kan du ikke få adgang til filen header selv, men du vil få lyst til at komme til 64 00:03:45,410 --> 00:03:47,370 disse variabler inde. 65 00:03:47,370 --> 00:03:48,170 >> OK. 66 00:03:48,170 --> 00:03:50,600 Så hvordan vi opdaterer header info? 67 00:03:50,600 --> 00:03:54,020 Nå, vi først nødt til at se, om vi nødt til at ændre alle oplysninger fra 68 00:03:54,020 --> 00:03:58,480 den infile, fingerpeg, til outfile, dommen. 69 00:03:58,480 --> 00:04:00,250 Er der noget ændrer sig i denne sag? 70 00:04:00,250 --> 00:04:04,320 Tja, faktisk ikke, fordi vi vil skal bare ændre farverne. 71 00:04:04,320 --> 00:04:07,550 Vi kommer ikke til at ændre sig filen størrelse, billedets størrelse, bredde, 72 00:04:07,550 --> 00:04:08,310 eller højden. 73 00:04:08,310 --> 00:04:14,010 Så du er okay for nu ved blot at kopiere hver pixel. 74 00:04:14,010 --> 00:04:14,840 >> OK. 75 00:04:14,840 --> 00:04:20,720 Så lad os nu se på, hvordan vi rent faktisk kan læse hver pixel fra filen. 76 00:04:20,720 --> 00:04:23,640 Anden fil I / O-funktion vil komme i spil - 77 00:04:23,640 --> 00:04:24,700 fread. 78 00:04:24,700 --> 00:04:28,440 Det tager i en pointer til struct , der skal indeholde de byte, der 79 00:04:28,440 --> 00:04:30,110 du læser. 80 00:04:30,110 --> 00:04:31,890 Så du læser ind i det. 81 00:04:31,890 --> 00:04:36,090 Og så skal du passere i en størrelse, som er størrelsen af ​​hvert element, som du 82 00:04:36,090 --> 00:04:37,360 vil læse. 83 00:04:37,360 --> 00:04:40,640 Her funktionen sizeof vil komme i handy. 84 00:04:40,640 --> 00:04:45,570 Så er du passerer i antal, som repræsenterer antallet af elementer i 85 00:04:45,570 --> 00:04:47,480 størrelse til at læse. 86 00:04:47,480 --> 00:04:51,180 Og så endelig, inptr, hvilket er filpointeren, at du er 87 00:04:51,180 --> 00:04:52,530 kommer til at læse fra. 88 00:04:52,530 --> 00:04:58,650 Så alle disse elementer er inde inptr og de kommer til data. 89 00:04:58,650 --> 00:05:01,660 >> Lad os se på et lille eksempel. 90 00:05:01,660 --> 00:05:07,590 Hvis jeg ønsker at læse i data to hunde, godt, jeg kan gøre det på to måder. 91 00:05:07,590 --> 00:05:15,250 Jeg kan enten læses på to objekter af størrelse hund fra min inptr, eller jeg kan læse 92 00:05:15,250 --> 00:05:19,280 i et objekt på størrelse med to hunde. 93 00:05:19,280 --> 00:05:23,580 Så du kan se, at afhængigt af den måde at du arrangerer størrelse og antal, du 94 00:05:23,580 --> 00:05:25,840 kan læse i samme antal bytes. 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> Så nu, lad os ændre pixel farve som vi har brug for. 97 00:05:33,020 --> 00:05:37,320 Hvis man ser på bmp.h igen, så du vil se, at i bunden 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs er en anden struct, hvor de består af 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 af disse repræsenterer den mængde blå, mængden af ​​grønt, og 101 00:05:52,480 --> 00:05:57,250 mængden af ​​rødt inde i denne pixel, hvor hvert beløb er repræsenteret ved en 102 00:05:57,250 --> 00:05:58,670 hexadecimalt tal. 103 00:05:58,670 --> 00:06:04,370 >> Så ff0000 vil være en blå farve, fordi det går fra blå, 104 00:06:04,370 --> 00:06:05,850 til grøn, til rød. 105 00:06:05,850 --> 00:06:09,300 Og så F'er bliver hvid. 106 00:06:09,300 --> 00:06:13,440 Lad os tage et kig på smiley.bmp, som du har i din distribution kode. 107 00:06:13,440 --> 00:06:15,690 Hvis du åbner det i bare et billede viewer, 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 at tage et dybere dyk i, vi vil se, at strukturen 110 00:06:20,380 --> 00:06:22,340 af det er bare pixels. 111 00:06:22,340 --> 00:06:25,880 Vi har hvide pixels, og derefter røde pixels. 112 00:06:25,880 --> 00:06:31,000 Den hvide, ffffff og derefter alle de røde pixels jeg har farvet i for dig, 113 00:06:31,000 --> 00:06:35,440 her, og du kan se, at de er 0000FF. 114 00:06:35,440 --> 00:06:39,760 Nul blå, nul grøn og fuld rød. 115 00:06:39,760 --> 00:06:45,350 Og da smiley er otte pixels bred, vi ikke har nogen polstring. 116 00:06:45,350 --> 00:06:47,360 Ok. 117 00:06:47,360 --> 00:06:53,310 >> Så hvis jeg skulle tildele forskellige værdier til en RGBTRIPLE og jeg ønskede at 118 00:06:53,310 --> 00:06:58,350 gøre det grønne, så hvad jeg ville gøre, er Jeg vil erklære en RGBTRIPLE, opkaldt 119 00:06:58,350 --> 00:07:02,660 tredobbelt, og derefter at få adgang til alle byte i denne struct I 120 00:07:02,660 --> 00:07:04,030 ville bruge dot operatør. 121 00:07:04,030 --> 00:07:08,430 Så triple.rgbtBlue, kan jeg tildele det til 0. 122 00:07:08,430 --> 00:07:13,460 Grøn Jeg kan tildele den til fulde - enhver nummer, virkelig, mellem 0 og ff. 123 00:07:13,460 --> 00:07:15,470 Og så rød, jeg vil også sige 0. 124 00:07:15,470 --> 00:07:19,160 Så det giver mig en grøn pixel. 125 00:07:19,160 --> 00:07:23,030 >> Dernæst hvad hvis jeg ønsker at kontrollere værdien af ​​noget? 126 00:07:23,030 --> 00:07:27,250 Jeg kunne have noget, der kontrollerer hvorvidt den tredobbelte s rgbtBlue værdi 127 00:07:27,250 --> 00:07:31,080 FF og derefter udskrive, "Jeg føler mig blå ", som et resultat. 128 00:07:31,080 --> 00:07:35,640 Nu, det betyder ikke nødvendigvis, at pixel er blå, højre? 129 00:07:35,640 --> 00:07:40,060 Fordi pixel grønne og røde værdier kunne også have ikke-0-værdier. 130 00:07:40,060 --> 00:07:43,470 Alt, dette betyder, og alt, dette er at kontrollere for, er 131 00:07:43,470 --> 00:07:45,610 for en fuld blå farve. 132 00:07:45,610 --> 00:07:50,050 Men alle pixels kunne også have delvis farveværdier, som denne 133 00:07:50,050 --> 00:07:52,180 næste eksempel her. 134 00:07:52,180 --> 00:07:55,400 >> Det er lidt sværere at se hvad dette billede er nu. 135 00:07:55,400 --> 00:08:00,320 Det ser lidt mere som clue.bmp, at du vil blive givet. 136 00:08:00,320 --> 00:08:03,600 Nu, fysisk, kan du løse dette, fordi der er en masse af røde, ved 137 00:08:03,600 --> 00:08:07,040 holder op en rød skærm til billedet, så at de andre farver kan vises. 138 00:08:07,040 --> 00:08:10,968 Så hvordan kan vi efterligne dette med c? 139 00:08:10,968 --> 00:08:15,640 Nå, kan vi fjerne alle røde helt fra billedet. 140 00:08:15,640 --> 00:08:21,870 Og så for at gøre, at vi ville sætte hver pixel røde værdi til 0. 141 00:08:21,870 --> 00:08:25,020 Og så billedet ville se lidt lidt ligesom det, hvor vi har ingen rød 142 00:08:25,020 --> 00:08:26,300 eksklusionen. 143 00:08:26,300 --> 00:08:29,390 >> Vi kan se det skjulte budskab en lidt mere klart nu. 144 00:08:29,390 --> 00:08:31,730 Det er en anden smilende ansigt. 145 00:08:31,730 --> 00:08:33,870 Eller måske kunne vi bruge en anden metode. 146 00:08:33,870 --> 00:08:36,480 Måske kunne vi identificere alle de røde pixels - 147 00:08:36,480 --> 00:08:41,100 det vil sige, alle de pixel med 0 blå, 0 grøn og 0 rød - 148 00:08:41,100 --> 00:08:43,169 og ændre dem til hvid. 149 00:08:43,169 --> 00:08:45,470 Og vores image kan se noget som dette. 150 00:08:45,470 --> 00:08:48,250 En lille smule lettere at se. 151 00:08:48,250 --> 00:08:51,170 >> Der er masser af andre måder at afdække det hemmelige budskab så godt, 152 00:08:51,170 --> 00:08:53,730 beskæftiger sig med farven manipulation. 153 00:08:53,730 --> 00:08:57,050 Måske du kan bruge en af ​​de metoder, som jeg nævnte ovenfor. 154 00:08:57,050 --> 00:08:59,600 Og derudover vil du måske at forbedre nogle farver 155 00:08:59,600 --> 00:09:02,620 og bringe dem ud. 156 00:09:02,620 --> 00:09:06,190 >> Så nu, at vi har ændret pixel farve, næste vi bare nødt til at skrive dem 157 00:09:06,190 --> 00:09:08,500 i til scanlinie, pixel for pixel. 158 00:09:08,500 --> 00:09:11,860 Og endnu en gang, vil du ønsker at se tilbage at copy.c, hvis du ikke har kopieret 159 00:09:11,860 --> 00:09:18,170 det allerede, og se på fwrite funktion, der tager data, en pointer 160 00:09:18,170 --> 00:09:23,230 til struct, der indeholder bytes at du læser fra, størrelsen af 161 00:09:23,230 --> 00:09:26,610 de elementer, antallet af elementer, og derefter outptr - 162 00:09:26,610 --> 00:09:29,450 bestemmelsesstedet for disse filer. 163 00:09:29,450 --> 00:09:34,010 >> Når du skriver i pixels, vil du også nødt til at skrive i polstring. 164 00:09:34,010 --> 00:09:34,970 Hvad er polstring? 165 00:09:34,970 --> 00:09:38,670 Nå, hver rgbt pixel tre bytes langt. 166 00:09:38,670 --> 00:09:43,670 Men den scanlinie for et bitmap billede skal være et multiplum af fire bytes. 167 00:09:43,670 --> 00:09:47,650 Og hvis antallet af pixels er ikke multiplum af fire, så er vi nødt til at tilføje 168 00:09:47,650 --> 00:09:48,880 denne polstring. 169 00:09:48,880 --> 00:09:51,420 Polstring er blot repræsenteret ved 0'er. 170 00:09:51,420 --> 00:09:54,380 Så hvordan kan vi skrive eller læse dette? 171 00:09:54,380 --> 00:09:59,280 Tja, det viser sig, at du ikke kan faktisk fread polstring, 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 tilfælde clue og dommen have samme bredde, så 174 00:10:04,400 --> 00:10:05,910 polstring er den samme. 175 00:10:05,910 --> 00:10:09,370 Og polstring, som du vil se i copy.c, beregnes 176 00:10:09,370 --> 00:10:11,790 med nedenstående formel - 177 00:10:11,790 --> 00:10:16,690 bi.biWidth gange sizeof (RGBTRIPLE) vil give os, hvor mange bytes bmp 178 00:10:16,690 --> 00:10:18,280 har i hver række. 179 00:10:18,280 --> 00:10:21,890 Derfra modulos og subtraktioner med 4 kan beregne, hvor 180 00:10:21,890 --> 00:10:25,610 mange bytes skal tilføjes, således at multiplum af bytes på 181 00:10:25,610 --> 00:10:27,250 hver række er fire. 182 00:10:27,250 --> 00:10:30,490 >> Nu, hvor vi har formlen for hvor meget polstring vi har brug for, nu 183 00:10:30,490 --> 00:10:31,610 vi kan skrive det. 184 00:10:31,610 --> 00:10:34,080 Nu, jeg nævnte før, polstring er kun 0'er. 185 00:10:34,080 --> 00:10:39,730 Så i dette tilfælde, er vi bare at sætte en char, i dette tilfælde et 0, i vores 186 00:10:39,730 --> 00:10:41,710 outptr - vores 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 læst i vores fil, har fil I / O holdt styr på vores 189 00:10:52,400 --> 00:10:57,440 position i disse filer med noget kaldte fil positionsindikator. 190 00:10:57,440 --> 00:10:59,350 Tænk på det som en markør. 191 00:10:59,350 --> 00:11:03,550 Dybest set, det fremskridt hver gang at vi fread, men vi har 192 00:11:03,550 --> 00:11:05,671 kontrol over det, også. 193 00:11:05,671 --> 00:11:11,030 >> At flytte filen position indikator, kan du bruge funktionen fseek. 194 00:11:11,030 --> 00:11:15,600 Hvor inptr repræsenterer fil pointer, du søger i, den 195 00:11:15,600 --> 00:11:20,370 mængde er antallet af bytes, som du ønsker at flytte markøren, og derefter fra 196 00:11:20,370 --> 00:11:23,470 angår referencepunktet fra hvor markøren er. 197 00:11:23,470 --> 00:11:26,770 Hvis du passerer i SEEK_CUR, at repræsenterer den aktuelle 198 00:11:26,770 --> 00:11:28,100 position i filen. 199 00:11:28,100 --> 00:11:31,020 Eller du kan bruge nogle andre parametre. 200 00:11:31,020 --> 00:11:35,400 Så kan vi ønsker at bruge fseek at springe over polstring af i filen. 201 00:11:35,400 --> 00:11:39,410 Og igen, hvis du sidder fast, er der et eksempel på, at der i copy.c. 202 00:11:39,410 --> 00:11:43,260 >> Så nu har vi åbnet filen, fingerpeg, og dommen. 203 00:11:43,260 --> 00:11:46,450 Vi har opdateret header info for vores dom, fordi hver 204 00:11:46,450 --> 00:11:48,730 bitmap brug for en header. 205 00:11:48,730 --> 00:11:52,280 Vi har så læs i clue s scanlinie, pixel for pixel, ændre 206 00:11:52,280 --> 00:11:55,210 hver farve som er nødvendigt, og skrive dem ind i 207 00:11:55,210 --> 00:11:57,340 dom, pixel for pixel. 208 00:11:57,340 --> 00:12:01,550 Når du åbner dom, kan du se, hvem synderen, eller hvad den hemmelige 209 00:12:01,550 --> 00:12:02,850 budskab er. 210 00:12:02,850 --> 00:12:05,550 Mit navn er Zamyla, og dette var krimi. 211 00:12:05,550 --> 00:12:12,864