1 00:00:00,000 --> 00:00:09,500 >> [MUZYKA GRA] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA Chandler: To był pani Scarlett ze świecznika. 3 00:00:12,350 --> 00:00:13,560 Kryminał? 4 00:00:13,560 --> 00:00:15,030 Cóż, mamy zamiar się dowiedzieć. 5 00:00:15,030 --> 00:00:20,870 W Clue planszy, to polubisz nadać fizyczną czerwony obraz. 6 00:00:20,870 --> 00:00:24,120 I że obraz jest bardzo czerwony i wypryskami, a twoim zadaniem jest 7 00:00:24,120 --> 00:00:25,490 odsłonić ukrytą wiadomość. 8 00:00:25,490 --> 00:00:29,740 I zwykle jesteś wyposażony w czerwony lupy, lub czerwony ekran 9 00:00:29,740 --> 00:00:31,410 ujawniają, że ukrytą wiadomość. 10 00:00:31,410 --> 00:00:33,340 Cóż, będziemy naśladować. 11 00:00:33,340 --> 00:00:37,960 >> W whodunit, dostaniemy obraz bitmapowy że wygląda bardzo zawodny i czerwony, 12 00:00:37,960 --> 00:00:43,430 a następnie uruchomić program kryminał ujawnić ukrytą wiadomość. 13 00:00:43,430 --> 00:00:45,650 >> Więc podzielenie na etapy. 14 00:00:45,650 --> 00:00:50,390 Po pierwsze, chcesz otworzyć plik - wskazówką, że już zostały podane. 15 00:00:50,390 --> 00:00:53,880 A następnie również tworzyć Plik werdykt bitmapy. 16 00:00:53,880 --> 00:00:58,240 Potem chcesz zaktualizować mapę bitową header informacji dla outfile werdykt. 17 00:00:58,240 --> 00:00:59,920 Więcej o tym później. 18 00:00:59,920 --> 00:01:04,319 A potem idziesz do zapoznania się wskazówką, linia skanująca, piksel po pikselu, 19 00:01:04,319 --> 00:01:07,320 zmiana kolorów w pikselach konieczne i zapisu 20 00:01:07,320 --> 00:01:08,960 tych, do wyroku - 21 00:01:08,960 --> 00:01:12,000 piksel po pikselu w Werdykt linia skanująca. 22 00:01:12,000 --> 00:01:13,780 >> Jak zaczniemy iść na ten temat? 23 00:01:13,780 --> 00:01:16,940 Cóż, na szczęście, mamy copy.c w kodzie dystrybucji. 24 00:01:16,940 --> 00:01:21,240 I to będzie udowodnić bardzo przydatne do nas. 25 00:01:21,240 --> 00:01:29,700 Copy.c otwiera plik, czyta się, że Nagłówek plik_we, a następnie aktualizuje 26 00:01:29,700 --> 00:01:31,070 Nagłówek plik_wy za. 27 00:01:31,070 --> 00:01:37,010 A następnie odczytuje każdy piksel w linia skanująca, piksel po pikselu, a następnie 28 00:01:37,010 --> 00:01:42,390 pisze, że piksel w outfile. 29 00:01:42,390 --> 00:01:45,020 >> Tak więc, pierwszym krokiem może będzie uruchomić następujące 30 00:01:45,020 --> 00:01:46,420 poleceń w terminalu - 31 00:01:46,420 --> 00:01:50,270 cp copy.c whodunit.c. 32 00:01:50,270 --> 00:01:55,320 Spowoduje to utworzenie kopii copy.c nazwie whodunit.c. 33 00:01:55,320 --> 00:01:58,320 Więc nasz pierwszy krok, aby otworzyć plik, dobrze, jest dokładna 34 00:01:58,320 --> 00:02:00,070 Replika, że ​​w copy.c. 35 00:02:00,070 --> 00:02:03,360 Więc zostawię was patrzeć na to. 36 00:02:03,360 --> 00:02:07,860 >> Co mamy do czynienia w tym pset jest Plik I / O, w zasadzie biorąc pliki, 37 00:02:07,860 --> 00:02:10,229 czytanie, pisanie, ich edycji. 38 00:02:10,229 --> 00:02:12,650 Jak po raz pierwszy otworzyć plik? 39 00:02:12,650 --> 00:02:16,800 Cóż, masz zamiar oświadczyć plik wskaźnik, a następnie zadzwonić 40 00:02:16,800 --> 00:02:18,670 Funkcja fopen. 41 00:02:18,670 --> 00:02:23,150 Przejść na drodze, lub nazwy, które pliku, a następnie tryb, który chcesz 42 00:02:23,150 --> 00:02:24,700 aby otworzyć dany plik w. 43 00:02:24,700 --> 00:02:28,620 Przechodząc w r otworzy foo.bmp do czytania. 44 00:02:28,620 --> 00:02:35,670 Natomiast fopen z przechodzącą w W będzie otwarte bar.bmp, do pisania i plik 45 00:02:35,670 --> 00:02:37,020 faktycznie edycji. 46 00:02:37,020 --> 00:02:41,970 >> Więc teraz, że mamy otwarty plik, nasz Następnym krokiem jest aktualizacja informacji nagłówka 47 00:02:41,970 --> 00:02:43,230 dla outfile. 48 00:02:43,230 --> 00:02:44,610 Co jest w informacji nagłówka? 49 00:02:44,610 --> 00:02:48,160 Cóż, najpierw musimy wiedzieć, co bitmapy jest. 50 00:02:48,160 --> 00:02:51,000 Mapa bitowa jest tylko prosta układ bajtów. 51 00:02:51,000 --> 00:02:55,480 A oni oświadczył w tym pliku tutaj, bmp.h, z wieloma 52 00:02:55,480 --> 00:02:58,610 Informacje o tym, co bitmapy faktycznie wykonane z. 53 00:02:58,610 --> 00:03:05,730 Ale to, co naprawdę dbają o to Nagłówek pliku bitmapy, tutaj, i 54 00:03:05,730 --> 00:03:08,460 Informacje nagłówka bitmapy, tutaj. 55 00:03:08,460 --> 00:03:13,170 Nagłówek składa się z kilku zmienne, które będą bardzo przydatne. 56 00:03:13,170 --> 00:03:18,400 Jest biSizeImage, który jest Całkowity rozmiar obrazu w bajtach. 57 00:03:18,400 --> 00:03:20,890 I obejmuje pikseli i dopełnienie. 58 00:03:20,890 --> 00:03:24,210 Tapicerka jest bardzo ważne, ale my się do tego później. 59 00:03:24,210 --> 00:03:30,000 >> BiWidth reprezentuje szerokość obrazu w pikselach minus padding. 60 00:03:30,000 --> 00:03:34,220 BiHeight jest to również wzrost obrazu w pikselach. 61 00:03:34,220 --> 00:03:38,240 A następnie BITMAPFILEHEADER i BITMAPINFOHEADER, jak wspomniałem 62 00:03:38,240 --> 00:03:40,900 wcześniej, te są reprezentowane jako elemencie. 63 00:03:40,900 --> 00:03:45,410 Tak więc, nie można przejść do nagłówka pliku Sam, ale będziemy chcieli dostać się do 64 00:03:45,410 --> 00:03:47,370 te zmienne wewnątrz. 65 00:03:47,370 --> 00:03:48,170 >> OK. 66 00:03:48,170 --> 00:03:50,600 Więc w jaki sposób zaktualizować informacje nagłówka? 67 00:03:50,600 --> 00:03:54,020 Cóż, najpierw musimy sprawdzić, czy mamy trzeba zmieniać żadnych informacji od 68 00:03:54,020 --> 00:03:58,480 plik_we, wskazówką, do plik_wy, werdykt. 69 00:03:58,480 --> 00:04:00,250 Czy nic nie zmienia w tym przypadku? 70 00:04:00,250 --> 00:04:04,320 Cóż, właściwie nie, bo będziemy się tylko zmianę barwy. 71 00:04:04,320 --> 00:04:07,550 Nie jedziemy do zmiany pliku rozmiar, rozmiar, szerokość, 72 00:04:07,550 --> 00:04:08,310 lub wysokość. 73 00:04:08,310 --> 00:04:14,010 Więc jesteś w porządku teraz przez tylko kopiuje każdy piksel. 74 00:04:14,010 --> 00:04:14,840 >> OK. 75 00:04:14,840 --> 00:04:20,720 Teraz przyjrzyjmy się, jak właściwie może czytać każdy piksel z pliku. 76 00:04:20,720 --> 00:04:23,640 Kolejny plik I / O funkcji będzie wchodzić w grę - 77 00:04:23,640 --> 00:04:24,700 fread. 78 00:04:24,700 --> 00:04:28,440 Zajmuje się wskaźnik do struktury , który zawiera bajty 79 00:04:28,440 --> 00:04:30,110 czytasz. 80 00:04:30,110 --> 00:04:31,890 Więc czytasz w tym. 81 00:04:31,890 --> 00:04:36,090 A następnie przechodzą w rozmiarze, który jest rozmiar każdego elementu, który 82 00:04:36,090 --> 00:04:37,360 chcą czytać. 83 00:04:37,360 --> 00:04:40,640 Tutaj funkcja sizeof będzie przydatna. 84 00:04:40,640 --> 00:04:45,570 Następnie można przejść w ilości, która oznacza liczbę elementów 85 00:04:45,570 --> 00:04:47,480 Rozmiar czytać. 86 00:04:47,480 --> 00:04:51,180 I wreszcie, inptr, który jest wskaźnik pliku, że jesteś 87 00:04:51,180 --> 00:04:52,530 będzie czytać z. 88 00:04:52,530 --> 00:04:58,650 Tak więc wszystkie te elementy są wewnątrz inptr i idą do danych. 89 00:04:58,650 --> 00:05:01,660 >> Przyjrzyjmy się trochę przykład. 90 00:05:01,660 --> 00:05:07,590 Jeśli chcę przeczytać w danych dwóch psów, dobrze, może to zrobić na dwa sposoby. 91 00:05:07,590 --> 00:05:15,250 I można albo przeczytać w dwóch obiektów o wielkości pies z mojej inptr, czy mogę przeczytać 92 00:05:15,250 --> 00:05:19,280 w jednym obiekt wielkości dwóch psów. 93 00:05:19,280 --> 00:05:23,580 Więc widać, że w zależności od sposobu które organizuje rozmiar i liczbę, ty 94 00:05:23,580 --> 00:05:25,840 odczytuje się w tej samej liczbie bajtów. 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> Więc teraz, zmieńmy kolor piksela, jak trzeba. 97 00:05:33,020 --> 00:05:37,320 Jeśli spojrzeć na bmp.h ponownie, a następnie zobaczysz, że na dole 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs to kolejna struktura, gdzie Składają się one z trzech bajtów. 99 00:05:42,920 --> 00:05:49,220 Jeden, rgbtBlue, rgbtGreen i rgbtRed. 100 00:05:49,220 --> 00:05:52,480 Tak więc każdy z nich oznacza ilość niebieski, ilość zieleni, a 101 00:05:52,480 --> 00:05:57,250 ilość czerwieni wewnątrz tego piksela, gdzie każda kwota jest reprezentowany przez 102 00:05:57,250 --> 00:05:58,670 liczba szesnastkowa. 103 00:05:58,670 --> 00:06:04,370 >> Więc ff0000 będzie kolor niebieski, bo to idzie z niebieskim, 104 00:06:04,370 --> 00:06:05,850 na zielony, czerwony. 105 00:06:05,850 --> 00:06:09,300 A potem wszystko f będzie biały. 106 00:06:09,300 --> 00:06:13,440 Rzućmy okiem na smiley.bmp, które masz w kodzie dystrybucji. 107 00:06:13,440 --> 00:06:15,690 Jeśli go otworzyć tylko w obrazie widz, to będziesz 108 00:06:15,690 --> 00:06:17,080 po prostu zobaczyć czerwoną buźkę. 109 00:06:17,080 --> 00:06:20,380 Ale biorąc głębsze nurkowania w, będziemy zobaczyć, że struktura 110 00:06:20,380 --> 00:06:22,340 o to tylko piksele. 111 00:06:22,340 --> 00:06:25,880 Mamy białe piksele, a następnie czerwone pikseli. 112 00:06:25,880 --> 00:06:31,000 Biały, FFFFFF, a następnie wszystkie czerwone pikseli Mam dla Ciebie w kolorze 113 00:06:31,000 --> 00:06:35,440 tu, a zobaczysz, że są 0000FF. 114 00:06:35,440 --> 00:06:39,760 Zero niebieski, zero zielony, czerwony i pełna. 115 00:06:39,760 --> 00:06:45,350 A ponieważ buźkę ma osiem pikseli szerokości, nie mamy żadnej wyściółki. 116 00:06:45,350 --> 00:06:47,360 Dobrze. 117 00:06:47,360 --> 00:06:53,310 >> Więc gdybym przypisać różne wartości do RGBTRIPLE i chciałem 118 00:06:53,310 --> 00:06:58,350 sprawiają, że zielony, to co chciałbym zrobić, to Chciałbym zadeklarować RGBTRIPLE nazwie 119 00:06:58,350 --> 00:07:02,660 potrójne, a następnie uzyskać dostęp do każdego bajt w tym struct I 120 00:07:02,660 --> 00:07:04,030 byłoby użyć operatora kropki. 121 00:07:04,030 --> 00:07:08,430 Więc triple.rgbtBlue, mogę przypisać, że na 0. 122 00:07:08,430 --> 00:07:13,460 Zielona mogę przypisać go do pełna - każdy Numer, naprawdę, od 0 do FF. 123 00:07:13,460 --> 00:07:15,470 A następnie czerwony, ja również powiedzieć 0. 124 00:07:15,470 --> 00:07:19,160 Tak więc, że daje mi zielony piksel. 125 00:07:19,160 --> 00:07:23,030 >> Następne, co, jeśli chcę, aby sprawdzić wartość czegoś? 126 00:07:23,030 --> 00:07:27,250 Może mam coś, która sprawdza czy wartość potrójnej w rgbtBlue jest 127 00:07:27,250 --> 00:07:31,080 FF, a następnie wydrukować, "Czuję się blue ", w wyniku. 128 00:07:31,080 --> 00:07:35,640 Teraz, to nie musi oznaczać, że piksel jest czarny, tak? 129 00:07:35,640 --> 00:07:40,060 Ponieważ wartości zielone i czerwone piksela może mieć także 0 wartości. 130 00:07:40,060 --> 00:07:43,470 Wszystko to oznacza to, i to wszystko ta sprawdza się 131 00:07:43,470 --> 00:07:45,610 o kolorze niebieskim. 132 00:07:45,610 --> 00:07:50,050 Ale wszystkie pikseli może mieć także częściowe wartości kolorów, jak to 133 00:07:50,050 --> 00:07:52,180 Następny przykład tutaj. 134 00:07:52,180 --> 00:07:55,400 >> Jest to trochę trudniejsze, aby zobaczyć co ten obraz jest teraz. 135 00:07:55,400 --> 00:08:00,320 To wygląda trochę bardziej jak clue.bmp że będziesz miał. 136 00:08:00,320 --> 00:08:03,600 Teraz fizycznie, można rozwiązać ten, bo jest dużo czerwonego, przez 137 00:08:03,600 --> 00:08:07,040 trzyma się czerwony ekran z obrazem tak które mogą pojawić się inne kolory. 138 00:08:07,040 --> 00:08:10,968 Jak więc naśladować to z C? 139 00:08:10,968 --> 00:08:15,640 Cóż, możemy usunąć wszystkie czerwone całkowicie z obrazu. 140 00:08:15,640 --> 00:08:21,870 I tak zrobić, że my ustawić każdy czerwony wartość piksela na 0. 141 00:08:21,870 --> 00:08:25,020 I tak obraz będzie wyglądać trochę trochę jak ten, w którym nie mamy czerwony 142 00:08:25,020 --> 00:08:26,300 w ogóle. 143 00:08:26,300 --> 00:08:29,390 >> Możemy zobaczyć ukrytą wiadomość trochę jaśniej teraz. 144 00:08:29,390 --> 00:08:31,730 To kolejny buźkę. 145 00:08:31,730 --> 00:08:33,870 A może moglibyśmy użyć innej metody. 146 00:08:33,870 --> 00:08:36,480 Może moglibyśmy zidentyfikować wszystkich czerwonych pikseli - 147 00:08:36,480 --> 00:08:41,100 to znaczy, wszystkie piksele w 0 niebieski, 0, zielony, czerwony i 0 - 148 00:08:41,100 --> 00:08:43,169 i zmienić te do białego. 149 00:08:43,169 --> 00:08:45,470 I nasz obraz może wyglądać coś takiego. 150 00:08:45,470 --> 00:08:48,250 Trochę łatwiej zobaczyć. 151 00:08:48,250 --> 00:08:51,170 >> Istnieje wiele innych sposobów, aby odkryć tajne wiadomości, jak również, 152 00:08:51,170 --> 00:08:53,730 do czynienia z manipulacją barw. 153 00:08:53,730 --> 00:08:57,050 Być może można użyć jednej z metod że wymienione powyżej. 154 00:08:57,050 --> 00:08:59,600 A dodatkowo, możesz zwiększyć niektóre kolory 155 00:08:59,600 --> 00:09:02,620 i postawienia się. 156 00:09:02,620 --> 00:09:06,190 >> Więc teraz, że zmieniliśmy piksel kolor, obok po prostu trzeba je napisać 157 00:09:06,190 --> 00:09:08,500 się do linii skanowania, piksel po pikselu. 158 00:09:08,500 --> 00:09:11,860 I jeszcze raz, będziemy chcieli, aby spojrzeć wstecz do copy.c, jeśli nie zostały skopiowane 159 00:09:11,860 --> 00:09:18,170 to już, i spojrzeć na fwrite funkcja, która pobiera dane, wskaźnik 160 00:09:18,170 --> 00:09:23,230 do struktury zawierającej bajty że czytasz z, wielkości 161 00:09:23,230 --> 00:09:26,610 przedmioty, liczba elementów, i outptr - 162 00:09:26,610 --> 00:09:29,450 przeznaczenie tych plików. 163 00:09:29,450 --> 00:09:34,010 >> Po pisać w pikselach, będziesz również napisać w wyściółkę. 164 00:09:34,010 --> 00:09:34,970 Czym jest wypełnienie? 165 00:09:34,970 --> 00:09:38,670 Cóż, każdy rgbt piksel jest trzy bajty. 166 00:09:38,670 --> 00:09:43,670 Ale linia skanująca do bitmapy musi być wielokrotnością czterech bajtów. 167 00:09:43,670 --> 00:09:47,650 A jeśli liczba pikseli jest wielokrotnością czterech, to musimy dodać 168 00:09:47,650 --> 00:09:48,880 to wypełnienie. 169 00:09:48,880 --> 00:09:51,420 Tapicerka jest tylko przedstawiciel 0s. 170 00:09:51,420 --> 00:09:54,380 Tak więc, w jaki sposób napisać lub przeczytać? 171 00:09:54,380 --> 00:09:59,280 Cóż, okazuje się, że nie można faktycznie fread wyściółka, ale można 172 00:09:59,280 --> 00:10:00,970 obliczyć. 173 00:10:00,970 --> 00:10:04,400 >> W tym przypadku, wskazówką i werdykt mają taką samą szerokość, tak 174 00:10:04,400 --> 00:10:05,910 Wyściółka jest taka sama. 175 00:10:05,910 --> 00:10:09,370 Oraz wyściółka, jak zobaczysz w copy.c, oblicza 176 00:10:09,370 --> 00:10:11,790 z wzoru - 177 00:10:11,790 --> 00:10:16,690 bi.biWidth razy sizeof (RGBTRIPLE) będzie daje nam, jak wiele bajtów bmp 178 00:10:16,690 --> 00:10:18,280 zawiera w każdym wierszu. 179 00:10:18,280 --> 00:10:21,890 Stamtąd modulos i odejmowanie z 4 można obliczyć 180 00:10:21,890 --> 00:10:25,610 wiele bajtów, muszą być dodane tak, że bajtów na wielokrotność 181 00:10:25,610 --> 00:10:27,250 każdy rząd jest cztery. 182 00:10:27,250 --> 00:10:30,490 >> Teraz, gdy mamy wzór na ile wypełnienie musimy teraz 183 00:10:30,490 --> 00:10:31,610 możemy ją napisać. 184 00:10:31,610 --> 00:10:34,080 Teraz już wspomniałem wcześniej, Wyściółka jest zaledwie 0s. 185 00:10:34,080 --> 00:10:39,730 Więc w tym przypadku, mamy tylko wprowadzenie znamienny w tym przypadku 0, w naszym 186 00:10:39,730 --> 00:10:41,710 outptr - nasza plik_wy. 187 00:10:41,710 --> 00:10:47,530 Tak, że może być tylko fputc 0, przecinek outptr. 188 00:10:47,530 --> 00:10:52,400 >> Tak więc, podczas gdy byliśmy w naszym czytanie plik, plik I / O zachowało śledzić nasze 189 00:10:52,400 --> 00:10:57,440 Stanowisko w tych plikach z czymś zwany wskaźnik pozycji pliku. 190 00:10:57,440 --> 00:10:59,350 Potraktujcie to jako kursor. 191 00:10:59,350 --> 00:11:03,550 Zasadniczo postępuje w każdym że fread, ale mamy 192 00:11:03,550 --> 00:11:05,671 nad nim kontroli, zbyt. 193 00:11:05,671 --> 00:11:11,030 >> Aby przesunąć wskaźnik pozycji pliku, można użyć fseek funkcji. 194 00:11:11,030 --> 00:11:15,600 Gdzie inptr reprezentuje plik wskazówka, że ​​jesteś stara się, 195 00:11:15,600 --> 00:11:20,370 Kwota jest liczba bajtów, które Aby przesunąć kursor, a następnie z 196 00:11:20,370 --> 00:11:23,470 odnosi się do punktu referencyjnego skąd kursor jest. 197 00:11:23,470 --> 00:11:26,770 Jeśli przechodzą w SEEK_CUR, że oznacza prąd 198 00:11:26,770 --> 00:11:28,100 Pozycja w pliku. 199 00:11:28,100 --> 00:11:31,020 Lub można użyć kilka innych parametrów. 200 00:11:31,020 --> 00:11:35,400 Tak więc, możemy użyć fseek pominąć na dopełnienie pliku w. 201 00:11:35,400 --> 00:11:39,410 I znowu, jeśli utkniesz, nie Przykład że copy.c. 202 00:11:39,410 --> 00:11:43,260 >> Więc teraz mamy otwarty plik, wskazówką, a werdykt. 203 00:11:43,260 --> 00:11:46,450 Mamy zaktualizowane informacje dla nagłówka Nasz werdykt, ponieważ każdy 204 00:11:46,450 --> 00:11:48,730 bitmapy potrzebuje nagłówka. 205 00:11:48,730 --> 00:11:52,280 Mamy wtedy odczytać na trop jest linia skanująca, piksel po pikselu, zmieniając 206 00:11:52,280 --> 00:11:55,210 każdy kolor, jak jest to konieczne, a pisząc te do 207 00:11:55,210 --> 00:11:57,340 Werdykt, piksel po pikselu. 208 00:11:57,340 --> 00:12:01,550 Po otwarciu werdykt, który można zobaczyć winowajcą lub co tajne 209 00:12:01,550 --> 00:12:02,850 Wiadomość jest. 210 00:12:02,850 --> 00:12:05,550 Nazywam się Zamyla i było to kryminał. 211 00:12:05,550 --> 00:12:12,864