1 00:00:00,000 --> 00:00:09,500 >> [MUSIK SPELA] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA CHAN: Det var Miss Scarlett med ljusstaken. 3 00:00:12,350 --> 00:00:13,560 DECKARE? 4 00:00:13,560 --> 00:00:15,030 Nåväl, vi ska ta reda på. 5 00:00:15,030 --> 00:00:20,870 I brädspelet Clue, kanske du ges en fysisk röda bilden. 6 00:00:20,870 --> 00:00:24,120 Och den bilden är väldigt röd och fläckig, och ditt jobb är att 7 00:00:24,120 --> 00:00:25,490 avslöja dolda budskap. 8 00:00:25,490 --> 00:00:29,740 Och brukar du försedd med en röd förstoringsglas, eller en röd skärm till 9 00:00:29,740 --> 00:00:31,410 avslöjar att dolda budskap. 10 00:00:31,410 --> 00:00:33,340 Nåväl, vi kommer att efterlikna det. 11 00:00:33,340 --> 00:00:37,960 >> I deckare, du får en bitmappsbild som ser mycket prickig och röd, 12 00:00:37,960 --> 00:00:43,430 och sedan köra DECKARE programmet att visa ett dolt budskap. 13 00:00:43,430 --> 00:00:45,650 >> Så låt oss bryta detta i steg. 14 00:00:45,650 --> 00:00:50,390 Först vill du att öppna filen - den ledtråd som du har fått. 15 00:00:50,390 --> 00:00:53,880 Och då också skapa en dom bitmap-fil. 16 00:00:53,880 --> 00:00:58,240 Då du vill uppdatera bitmapp header information för domen utfil. 17 00:00:58,240 --> 00:00:59,920 Mer om det senare. 18 00:00:59,920 --> 00:01:04,319 Och då du kommer att läsa in den ledtråd, scanline, pixel för pixel, 19 00:01:04,319 --> 00:01:07,320 ändra färgerna pixel som nödvändigt, och skrivning 20 00:01:07,320 --> 00:01:08,960 de i domen - 21 00:01:08,960 --> 00:01:12,000 pixel för pixel in i dom scanline. 22 00:01:12,000 --> 00:01:13,780 >> Hur ska vi börja gå om det här? 23 00:01:13,780 --> 00:01:16,940 Nå, som tur har vi copy.c i distributionskoden. 24 00:01:16,940 --> 00:01:21,240 Och detta kommer att visa sig ganska bra för oss. 25 00:01:21,240 --> 00:01:29,700 Copy.c öppnar en fil, läser av att infil sidhuvud, och uppdaterar sedan 26 00:01:29,700 --> 00:01:31,070 utfil nick. 27 00:01:31,070 --> 00:01:37,010 Och sedan läser varje pixel i scanline, pixel för pixel, och sedan 28 00:01:37,010 --> 00:01:42,390 skriver att pixel i utfil. 29 00:01:42,390 --> 00:01:45,020 >> Så ditt första steg kanske vara att köra följande 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 Detta kommer att skapa en kopia av copy.c namnges whodunit.c. 33 00:01:55,320 --> 00:01:58,320 Så vår första steg för att öppna fil, det är väl en exakt 34 00:01:58,320 --> 00:02:00,070 replik av det i copy.c. 35 00:02:00,070 --> 00:02:03,360 Så jag lämnar er att titta på det. 36 00:02:03,360 --> 00:02:07,860 >> Vad vi har att göra med i denna PSET är fil-I / O, i princip ta filer, 37 00:02:07,860 --> 00:02:10,229 läsa, skriva, redigera dem. 38 00:02:10,229 --> 00:02:12,650 Hur öppnar du först en fil? 39 00:02:12,650 --> 00:02:16,800 Tja, du kommer att deklarera en fil pekare, och sedan ringa 40 00:02:16,800 --> 00:02:18,670 Funktionen fopen. 41 00:02:18,670 --> 00:02:23,150 Pass i vägen, eller namnet på det fil, och sedan det läge som du vill 42 00:02:23,150 --> 00:02:24,700 öppna filen i. 43 00:02:24,700 --> 00:02:28,620 Passning i ett r öppnas foo.bmp för läsning. 44 00:02:28,620 --> 00:02:35,670 Av följande skäl: fopen med passerar i en w kommer öppen bar.bmp, för att skriva filen och 45 00:02:35,670 --> 00:02:37,020 faktiskt redigera den. 46 00:02:37,020 --> 00:02:41,970 >> Så nu när vi har öppnat filen, vår Nästa steg är att uppdatera sidhuvudet info 47 00:02:41,970 --> 00:02:43,230 för utfil. 48 00:02:43,230 --> 00:02:44,610 Vad är en header information? 49 00:02:44,610 --> 00:02:48,160 Tja, först måste vi veta vad en bitmapp är. 50 00:02:48,160 --> 00:02:51,000 En bitmapp är bara en enkel arrangemang av byte. 51 00:02:51,000 --> 00:02:55,480 Och de deklareras i den här filen Här, bmp.h, med ett gäng 52 00:02:55,480 --> 00:02:58,610 Information om vad en bitmapp är faktiskt gjord av. 53 00:02:58,610 --> 00:03:05,730 Men vad vi verkligen bryr oss om är det bitmap-fil header, just här, och 54 00:03:05,730 --> 00:03:08,460 bitmappen info header, här borta. 55 00:03:08,460 --> 00:03:13,170 Huvudet består av ett par av variabler som kommer att vara mycket användbar. 56 00:03:13,170 --> 00:03:18,400 Det finns biSizeImage, som är den totala storleken på bilden i byte. 57 00:03:18,400 --> 00:03:20,890 Och detta inkluderar bildpunkter och utfyllnad. 58 00:03:20,890 --> 00:03:24,210 Padding är mycket viktigt, men vi kommer till det senare. 59 00:03:24,210 --> 00:03:30,000 >> BiWidth representerar bredden på den bilden i bildpunkter minus stoppning. 60 00:03:30,000 --> 00:03:34,220 BiHeight är då också höjden av bildpunkter. 61 00:03:34,220 --> 00:03:38,240 Och sedan BITMAPFILEHEADER och BITMAPINFOHEADER, som jag nämnde 62 00:03:38,240 --> 00:03:40,900 tidigare, är de som representeras som structs. 63 00:03:40,900 --> 00:03:45,410 Så kan du inte komma åt filen header själv, men du kommer att vilja komma till 64 00:03:45,410 --> 00:03:47,370 dessa variabler inuti. 65 00:03:47,370 --> 00:03:48,170 >> OK. 66 00:03:48,170 --> 00:03:50,600 Så hur ska vi uppdaterar rubrik information? 67 00:03:50,600 --> 00:03:54,020 Tja, först måste vi se om vi behöver ändra någon information från 68 00:03:54,020 --> 00:03:58,480 den infil, ledtråd, till utfil, domen. 69 00:03:58,480 --> 00:04:00,250 Finns det något att ändra i det här fallet? 70 00:04:00,250 --> 00:04:04,320 Tja, egentligen inte, eftersom vi ska att bara ändra färgerna. 71 00:04:04,320 --> 00:04:07,550 Vi kommer inte att ändra filen storlek, bildstorlek, bredden, 72 00:04:07,550 --> 00:04:08,310 eller höjden. 73 00:04:08,310 --> 00:04:14,010 Så du är okej för nu genom bara kopierar varje pixel. 74 00:04:14,010 --> 00:04:14,840 >> OK. 75 00:04:14,840 --> 00:04:20,720 Så nu ska vi titta på hur vi faktiskt kan läsa varje pixel från filen. 76 00:04:20,720 --> 00:04:23,640 En annan fil I / O-funktion kommer in i bilden - 77 00:04:23,640 --> 00:04:24,700 fread. 78 00:04:24,700 --> 00:04:28,440 Det tar en pekare till struct som kommer att innehålla de bytes som 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 in i det. 81 00:04:31,890 --> 00:04:36,090 Och då du passerar i en storlek, som är storleken på varje element som du 82 00:04:36,090 --> 00:04:37,360 vill läsa. 83 00:04:37,360 --> 00:04:40,640 Här funktionen sizeof kommer väl till hands. 84 00:04:40,640 --> 00:04:45,570 Då du passerar i antal, vilket representerar antalet element i 85 00:04:45,570 --> 00:04:47,480 storlek för att läsa. 86 00:04:47,480 --> 00:04:51,180 Och sedan slutligen, inptr, vilket är filen pekare som du är 87 00:04:51,180 --> 00:04:52,530 går att läsa från. 88 00:04:52,530 --> 00:04:58,650 Så alla dessa element är inne inptr och de ska data. 89 00:04:58,650 --> 00:05:01,660 >> Låt oss titta på ett litet exempel. 90 00:05:01,660 --> 00:05:07,590 Om jag vill läsa till data två hundar, Tja, jag kan göra det på två sätt. 91 00:05:07,590 --> 00:05:15,250 Jag kan antingen läsas på två föremål av storlek hund från min inptr, eller jag kan läsa 92 00:05:15,250 --> 00:05:19,280 i en protes storleken på två hundar. 93 00:05:19,280 --> 00:05:23,580 Så du ser att beroende på hur att du ordnar storlek och antal, du 94 00:05:23,580 --> 00:05:25,840 kan läsas i samma antal byte. 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> Så nu ska vi ändra pixel färg som vi behöver. 97 00:05:33,020 --> 00:05:37,320 Om man tittar på bmp.h igen, då ser du att längst ner 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs är en annan struct, där De består av tre bitgrupper. 99 00:05:42,920 --> 00:05:49,220 Ett, rgbtBlue, rgbtGreen och rgbtRed. 100 00:05:49,220 --> 00:05:52,480 Så var och en av dem representerar den mängd blå, mängden grönt, och 101 00:05:52,480 --> 00:05:57,250 mängd rött inuti denna pixel, där varje belopp representeras av en 102 00:05:57,250 --> 00:05:58,670 hexadecimalt nummer. 103 00:05:58,670 --> 00:06:04,370 >> Så ff0000 blir en blå färg, eftersom det går från blå, 104 00:06:04,370 --> 00:06:05,850 till grönt till rött. 105 00:06:05,850 --> 00:06:09,300 Och sedan alla f s kommer att vara vit. 106 00:06:09,300 --> 00:06:13,440 Låt oss ta en titt på smiley.bmp, vilket du har i din distribution kod. 107 00:06:13,440 --> 00:06:15,690 Om du öppnar det på bara en bild betraktaren, då du kommer 108 00:06:15,690 --> 00:06:17,080 bara se en röd smiley. 109 00:06:17,080 --> 00:06:20,380 Men att ta en djupare dykning i, vi ska se att strukturen 110 00:06:20,380 --> 00:06:22,340 det är bara bildpunkter. 111 00:06:22,340 --> 00:06:25,880 Vi har vita pixlar, och sedan röda pixlar. 112 00:06:25,880 --> 00:06:31,000 Den vita, ffffff, och sedan alla röda pixlar jag färgade in för dig 113 00:06:31,000 --> 00:06:35,440 här, och du ser att de är 0000ff. 114 00:06:35,440 --> 00:06:39,760 Noll blå, noll grön och fullt rött. 115 00:06:39,760 --> 00:06:45,350 Och eftersom smiley är åtta pixlar bred, Vi har ingen utfyllnad. 116 00:06:45,350 --> 00:06:47,360 Okej. 117 00:06:47,360 --> 00:06:53,310 >> Så om jag skulle tilldela olika värden till en RGBTRIPLE och jag ville 118 00:06:53,310 --> 00:06:58,350 göra det grönt, vad jag skulle göra är Jag skulle förklara en RGBTRIPLE, som heter 119 00:06:58,350 --> 00:07:02,660 trippel, och sedan komma åt alla byte inom den struct jag 120 00:07:02,660 --> 00:07:04,030 skulle använda punktoperatorn. 121 00:07:04,030 --> 00:07:08,430 Så triple.rgbtBlue, jag kan tilldela den till 0. 122 00:07:08,430 --> 00:07:13,460 Grön Jag kan koppla den till fullo - alla nummer, verkligen, mellan 0 och ff. 123 00:07:13,460 --> 00:07:15,470 Och sedan rött, jag också kommer att säga 0. 124 00:07:15,470 --> 00:07:19,160 Så då det ger mig en grön pixel. 125 00:07:19,160 --> 00:07:23,030 >> Nästa, tänk om jag vill kontrollera värdet av något? 126 00:07:23,030 --> 00:07:27,250 Jag skulle kunna ha något som kontrollerar om triple s rgbtBlue värde är 127 00:07:27,250 --> 00:07:31,080 ff och sedan skriva ut, "Jag känner mig blå ", som följd. 128 00:07:31,080 --> 00:07:35,640 Nu, som inte nödvändigtvis att pixeln är blå, eller hur? 129 00:07:35,640 --> 00:07:40,060 Eftersom pixel gröna och röda värden kan också ha icke-0-värden. 130 00:07:40,060 --> 00:07:43,470 Allt som detta innebär, och allt det där detta kontrollerar för är 131 00:07:43,470 --> 00:07:45,610 för en fullständig blå färg. 132 00:07:45,610 --> 00:07:50,050 Men alla bildpunkter kan också ha delvis färgvärden, som den här 133 00:07:50,050 --> 00:07:52,180 Nästa exempel här. 134 00:07:52,180 --> 00:07:55,400 >> Det är lite svårare att se vad denna bild är nu. 135 00:07:55,400 --> 00:08:00,320 Detta ser lite mer ut som den clue.bmp att du kommer att ges. 136 00:08:00,320 --> 00:08:03,600 Nu, fysiskt, kan du lösa detta, eftersom det finns en hel del rött, genom 137 00:08:03,600 --> 00:08:07,040 håller upp en röd skärm på bilden så att de andra färger kan visas. 138 00:08:07,040 --> 00:08:10,968 Så hur ska vi efterlikna det med c? 139 00:08:10,968 --> 00:08:15,640 Tja, kan vi ta bort alla röda från bilden helt. 140 00:08:15,640 --> 00:08:21,870 Och så för att göra att vi skulle sätta alla pixel röda värdet till 0. 141 00:08:21,870 --> 00:08:25,020 Och så att bilden skulle se lite lite så här, där vi inte har någon röd 142 00:08:25,020 --> 00:08:26,300 helst. 143 00:08:26,300 --> 00:08:29,390 >> Vi kan se det dolda budskapet en lite tydligare nu. 144 00:08:29,390 --> 00:08:31,730 Det är en annan smiley. 145 00:08:31,730 --> 00:08:33,870 Eller kanske kunde vi använda en annan metod. 146 00:08:33,870 --> 00:08:36,480 Kanske kunde vi identifiera alla de röda pixlar - 147 00:08:36,480 --> 00:08:41,100 det vill säga, samtliga bildelement med 0 blå, 0 grön, och 0 röd - 148 00:08:41,100 --> 00:08:43,169 och ändra dem till vitt. 149 00:08:43,169 --> 00:08:45,470 Och vår bild kan se ut ungefär så här. 150 00:08:45,470 --> 00:08:48,250 Lite lättare att se. 151 00:08:48,250 --> 00:08:51,170 >> Det finns många andra sätt att avslöja det hemliga budskapet också, 152 00:08:51,170 --> 00:08:53,730 behandlar färgmanipulering. 153 00:08:53,730 --> 00:08:57,050 Kanske du kan använda någon av metoderna som jag nämnde ovan. 154 00:08:57,050 --> 00:08:59,600 Och dessutom, kanske du vill för att förbättra vissa färger 155 00:08:59,600 --> 00:09:02,620 och ta med dem ut. 156 00:09:02,620 --> 00:09:06,190 >> Så nu när vi har ändrat pixeln färg, nästa vi behöver bara skriva dem 157 00:09:06,190 --> 00:09:08,500 in till scanline, pixel för pixel. 158 00:09:08,500 --> 00:09:11,860 Och ännu en gång, men du vill se tillbaka att copy.c, om du inte har kopierat 159 00:09:11,860 --> 00:09:18,170 det redan, och titta på fwrite funktion, som tar data, en pekare 160 00:09:18,170 --> 00:09:23,230 till den struct som innehåller byte att du läser från, storleken på 161 00:09:23,230 --> 00:09:26,610 objekten, antalet objekt, och därefter outptr - 162 00:09:26,610 --> 00:09:29,450 destinationen för dessa filer. 163 00:09:29,450 --> 00:09:34,010 >> När du skriver i bildpunkter, kommer du också behöva skriva i stoppningen. 164 00:09:34,010 --> 00:09:34,970 Vad är utfyllnad? 165 00:09:34,970 --> 00:09:38,670 Tja, varje rgbt pixel är tre byte lång. 166 00:09:38,670 --> 00:09:43,670 Men, det scanline för en bitmappsbild måste vara en multipel av fyra byte. 167 00:09:43,670 --> 00:09:47,650 Och om antalet pixlar är inte multipel av fyra, då måste vi lägga 168 00:09:47,650 --> 00:09:48,880 denna stoppning. 169 00:09:48,880 --> 00:09:51,420 Padding är bara representeras av 0: or. 170 00:09:51,420 --> 00:09:54,380 Så, hur ska vi skriva eller läsa det här? 171 00:09:54,380 --> 00:09:59,280 Jo, det visar sig att du inte kan faktiskt fread stoppning, men du kan 172 00:09:59,280 --> 00:10:00,970 beräkna den. 173 00:10:00,970 --> 00:10:04,400 >> I det här fallet, den ledtråd och domen ha samma bredd, så 174 00:10:04,400 --> 00:10:05,910 stoppning är densamma. 175 00:10:05,910 --> 00:10:09,370 Och stoppningen, som du ser i copy.c, beräknas 176 00:10:09,370 --> 00:10:11,790 med nedanstående formel - 177 00:10:11,790 --> 00:10:16,690 bi.biWidth gånger sizeof (RGBTRIPLE) kommer att ge oss hur många byte den bmp 178 00:10:16,690 --> 00:10:18,280 har i varje rad. 179 00:10:18,280 --> 00:10:21,890 Därifrån modulos och subtraktioner med 4 kan beräkna hur 180 00:10:21,890 --> 00:10:25,610 många byte måste tillsättas så att multipeln av byte på 181 00:10:25,610 --> 00:10:27,250 varje rad är fyra. 182 00:10:27,250 --> 00:10:30,490 >> Nu när vi har formeln för hur mycket stoppning vi behöver, nu 183 00:10:30,490 --> 00:10:31,610 Vi kan skriva det. 184 00:10:31,610 --> 00:10:34,080 Nu, nämnde jag tidigare, stoppning är bara 0: or. 185 00:10:34,080 --> 00:10:39,730 Så i det fallet, vi bara sätta en röding, i detta fall en 0, in i vår 186 00:10:39,730 --> 00:10:41,710 outptr - vår utfil. 187 00:10:41,710 --> 00:10:47,530 Så som kan bara vara fputc 0, kommatecken outptr. 188 00:10:47,530 --> 00:10:52,400 >> Så, medan vi har läst i vår fil, har fil-I / O hållit koll på vår 189 00:10:52,400 --> 00:10:57,440 ställning på dessa filer med något heter filen lägesindikator. 190 00:10:57,440 --> 00:10:59,350 Se det som en markör. 191 00:10:59,350 --> 00:11:03,550 I grund och botten, avancerar det varje gång att vi fread, men vi har 192 00:11:03,550 --> 00:11:05,671 kontroll över det också. 193 00:11:05,671 --> 00:11:11,030 >> För att flytta filen lägesindikator, Du kan använda funktionen fseek. 194 00:11:11,030 --> 00:11:15,600 Om inptr representerar filen pekare som du söker i, den 195 00:11:15,600 --> 00:11:20,370 beloppet är antalet byte som du vill flytta markören, och sedan från 196 00:11:20,370 --> 00:11:23,470 hänför sig till referenspunkten från där markören är. 197 00:11:23,470 --> 00:11:26,770 Om du passerar i SEEK_CUR, att representerar den aktuella 198 00:11:26,770 --> 00:11:28,100 position i filen. 199 00:11:28,100 --> 00:11:31,020 Eller så kan du använda några andra parametrar. 200 00:11:31,020 --> 00:11:35,400 Så kanske vi vill använda fseek att hoppa över stoppningen av i filen. 201 00:11:35,400 --> 00:11:39,410 Och återigen, om du har fastnat, det finns ett exempel på det i copy.c. 202 00:11:39,410 --> 00:11:43,260 >> Så nu har vi öppnat filen, ledtråd, och domen. 203 00:11:43,260 --> 00:11:46,450 Vi har uppdaterat rubriken information för vår dom, eftersom varje 204 00:11:46,450 --> 00:11:48,730 bitmapp behöver en rubrik. 205 00:11:48,730 --> 00:11:52,280 Vi har sedan läsa in i ledtråd s scanline, pixel för pixel, ändra 206 00:11:52,280 --> 00:11:55,210 varje färg som behövs, och skriver de in i 207 00:11:55,210 --> 00:11:57,340 dom, pixel för pixel. 208 00:11:57,340 --> 00:12:01,550 När du öppnar dom, kan du se vem den skyldige, eller vad hemligheten 209 00:12:01,550 --> 00:12:02,850 budskap är. 210 00:12:02,850 --> 00:12:05,550 Mitt namn är Zamyla, och detta var DECKARE. 211 00:12:05,550 --> 00:12:12,864