1 00:00:00,000 --> 00:00:10,210 >> [MUZYKA GRA] 2 00:00:10,210 --> 00:00:13,320 >> ZAMYLA Chandler: Miejmy cios rzeczy z rozmiaru. 3 00:00:13,320 --> 00:00:17,710 W zmianą rozmiaru, użytkownik przejdzie w, poprzez linii poleceń, obraz bitmapowy, który 4 00:00:17,710 --> 00:00:21,860 chcą skalowanie przez szereg że również przejść w, 5 00:00:21,860 --> 00:00:23,770 w wierszu poleceń. 6 00:00:23,770 --> 00:00:24,690 W jaki sposób możemy to zrobić? 7 00:00:24,690 --> 00:00:28,270 >> Cóż, po pierwsze rzeczy pierwsze, niech podzielenie go na etapy. 8 00:00:28,270 --> 00:00:31,510 Będziesz chciał otworzyć plik_we że dają ci, jak również 9 00:00:31,510 --> 00:00:35,560 tworzyć i otwierać outfile że masz zamiar umieścić 10 00:00:35,560 --> 00:00:38,020 Zmniejszone zdjęcie w. 11 00:00:38,020 --> 00:00:42,050 Następnie, ponieważ jesteś zmiany rozmiaru i bo to bitmapy, to nagłówek, więc 12 00:00:42,050 --> 00:00:46,080 będziesz również zaktualizować nagłówek Informacje dla pliku wynikowego, 13 00:00:46,080 --> 00:00:47,950 i pisać, że w. 14 00:00:47,950 --> 00:00:51,850 Potem idziesz do zapoznania się SCANLINE z pliku wejściowego, 15 00:00:51,850 --> 00:00:56,890 piksel po pikselu, zmiana rozmiaru w poziomie i pisania tych pikseli w 16 00:00:56,890 --> 00:01:00,910 plik_wy, jak określono według skali użytkownika. 17 00:01:00,910 --> 00:01:03,940 >> Będziesz pamiętać, aby dodać dopełnienie w razie potrzeby. 18 00:01:03,940 --> 00:01:05,400 Więcej o tym później. 19 00:01:05,400 --> 00:01:07,790 A następnie, również zmienić rozmiar w pionie. 20 00:01:07,790 --> 00:01:08,890 OK. 21 00:01:08,890 --> 00:01:13,280 Więc to będzie trochę więcej skomplikowane niż Kto zrobił, ale 22 00:01:13,280 --> 00:01:18,310 co podobne jest, że copy.c będzie, znowu okazać się bardzo przydatne. 23 00:01:18,310 --> 00:01:23,160 Pamiętaj, że copy.c otwiera plik, aktualizuje informacje nagłówka dla 24 00:01:23,160 --> 00:01:28,250 plik_wy, następnie odczytuje do scanline, piksel po pikselu, pisząc każdy piksel 25 00:01:28,250 --> 00:01:30,510 do scanline pliku wyjściowego za. 26 00:01:30,510 --> 00:01:37,040 >> Więc jeszcze raz, może pierwszy krok prawdopodobnie być cp, copy.c, resize.c 27 00:01:37,040 --> 00:01:40,560 do katalogu PSET5. 28 00:01:40,560 --> 00:01:43,920 Pamiętaj jednak, zanim go skopiować, aby upewnić się, że rozumiesz 29 00:01:43,920 --> 00:01:46,600 copy.c bardzo dokładnie. 30 00:01:46,600 --> 00:01:47,620 OK. 31 00:01:47,620 --> 00:01:49,880 >> Warto więc otworzyć plik. 32 00:01:49,880 --> 00:01:50,870 Wiesz, jak to zrobić. 33 00:01:50,870 --> 00:01:52,600 Zamierzam opuścić to do ciebie. 34 00:01:52,600 --> 00:01:56,050 Następnie zaktualizować informacje z nagłówka dla outfile. 35 00:01:56,050 --> 00:01:59,240 Bo mamy nową bitmapę, mamy nowe informacje nagłówka. 36 00:01:59,240 --> 00:02:00,970 Co się zmienia tutaj? 37 00:02:00,970 --> 00:02:06,000 Cóż, rozmiar pliku się zmieni bo będziemy mieć więcej 38 00:02:06,000 --> 00:02:07,900 pikseli niż wcześniej. 39 00:02:07,900 --> 00:02:11,060 Rozmiar obrazu jest więc również ulegnie zmianie, co jest 40 00:02:11,060 --> 00:02:13,050 szerokość i wysokość. 41 00:02:13,050 --> 00:02:17,180 >> Więc, które zmienne są te, dokładnie? 42 00:02:17,180 --> 00:02:20,960 Cóż, jeśli spojrzeć w nagłówku informacje, widać nie jest 43 00:02:20,960 --> 00:02:25,640 biSizeImage, co stanowi sumę rozmiar obrazu w bajtach, 44 00:02:25,640 --> 00:02:28,340 tym pikseli i obicia. 45 00:02:28,340 --> 00:02:32,520 biWidth jest szerokość obrazu w pikselach, minus wyściółka. 46 00:02:32,520 --> 00:02:35,580 biHeight jest wysokość obrazu w pikselach. 47 00:02:35,580 --> 00:02:39,200 I tak te zawarte są w elemencie BITMAPFILEHEADER i 48 00:02:39,200 --> 00:02:40,390 BITMAPINFOHEADER. 49 00:02:40,390 --> 00:02:45,300 Można powiedzieć, który z nich jest który przez będzie bmp.h i patrząc na 50 00:02:45,300 --> 00:02:49,670 BITMAPINFOHEADER struktura i widzenie które zmienne są wymienione tam. 51 00:02:49,670 --> 00:02:54,700 >> Tak, aby zaktualizować outfiles nagłówek informacje, będziesz chciał 52 00:02:54,700 --> 00:02:57,025 zmienić te wartości wysokość i szerokość. 53 00:02:57,025 --> 00:03:00,570 Ale są szanse, może trzeba jakiś informacji w nagłówku plik_we 54 00:03:00,570 --> 00:03:03,670 później, więc najlepiej, aby śledzić oba. 55 00:03:03,670 --> 00:03:07,770 Ale być bardzo jasne, z zmiennej nazwy tak, że nie przypadkowo 56 00:03:07,770 --> 00:03:12,490 Napisać nieprawidłowe wartości w Nagłówek dla outfile. 57 00:03:12,490 --> 00:03:16,160 >> Teraz przejdźmy do czytania w SCANLINE piksel po pikselu. 58 00:03:16,160 --> 00:03:20,210 Ponownie mamy zamiar włączyć do naszego trusty plik biblioteki I / O, i spojrzeć na 59 00:03:20,210 --> 00:03:22,100 fread funkcji. 60 00:03:22,100 --> 00:03:26,150 fread odbywa się wskaźnik do struktury , który zawiera bajty 61 00:03:26,150 --> 00:03:30,130 czytasz w wielkość każdego Element, który czytasz - 62 00:03:30,130 --> 00:03:34,410 kolejny sizeof będzie użyteczny funkcjonują tu szereg 63 00:03:34,410 --> 00:03:38,820 elementy formatu, rozmiaru, których jesteś wczytywanie, a następnie ostatecznie 64 00:03:38,820 --> 00:03:41,310 inpointer, plik czytasz od. 65 00:03:41,310 --> 00:03:46,770 Więc bierzesz elementów numerycznych od wielkości i od inpointer 66 00:03:46,770 --> 00:03:49,040 wprowadzenie ich do danych. 67 00:03:49,040 --> 00:03:51,695 >> Teraz nadszedł czas, aby zmienić rozmiar w poziomie. 68 00:03:51,695 --> 00:03:56,880 gdy n jest równe 2, to dla każdego piksela plik_we, mamy zamiar napisać 69 00:03:56,880 --> 00:04:00,870 dwa razy w plik wyjściowy. 70 00:04:00,870 --> 00:04:02,210 Jak piszemy pliki? 71 00:04:02,210 --> 00:04:06,400 Cóż, mamy funkcję fwrite, więc podjęliśmy wskaźnik do struktury 72 00:04:06,400 --> 00:04:10,170 że zawiera bajtów, że jesteś piśmie z, a następnie przechodzimy w 73 00:04:10,170 --> 00:04:14,430 wielkość, ilość i moc, gdzie masz zamiar pisać, że. 74 00:04:14,430 --> 00:04:19,200 A następnie powtórzyć proces, będzie stanie proste iteracyjny dla pętli. 75 00:04:19,200 --> 00:04:21,740 >> Ale musimy pamiętać, dodać dopełnienie w. 76 00:04:21,740 --> 00:04:26,040 Pojęcie wypełnienia jest, że dobrze, Każdy piksel ma trzy ugryzienia, ale 77 00:04:26,040 --> 00:04:28,940 Rozmiar każdego moszczu Scanline być wielokrotnością 4 bajtów. 78 00:04:28,940 --> 00:04:33,660 Tak więc, jeśli liczba pikseli jest wielokrotnością 4, musimy dodać kilka 79 00:04:33,660 --> 00:04:36,630 wyściółka, która znajduje się zaledwie zera. 80 00:04:36,630 --> 00:04:42,130 Teraz, w przeciwieństwie Kto zrobił, iw przeciwieństwie do kopię, a następnie plik_we obrazu i 81 00:04:42,130 --> 00:04:44,370 plik_wy plik ma się inaczej inaczej, ponieważ są wyściółka 82 00:04:44,370 --> 00:04:46,360 różne szerokości. 83 00:04:46,360 --> 00:04:46,690 >> OK. 84 00:04:46,690 --> 00:04:51,050 Więc może formuła się przydać tutaj. 85 00:04:51,050 --> 00:04:55,120 Zostawię to do Ciebie, aby dowiedzieć się, ale powiedzieć, że do napisania dopełnienie, 86 00:04:55,120 --> 00:04:59,360 dobrze, że to tylko prosta funkcja fputc, przechodząc w charakterze 87 00:04:59,360 --> 00:05:02,200 , które chcesz napisać, a następnie wskaźnik pliku, który 88 00:05:02,200 --> 00:05:04,280 chcę napisać do. 89 00:05:04,280 --> 00:05:08,670 Więc teraz, kiedy zmieniany poziomo, , a następnie stosuje się wkładki, 90 00:05:08,670 --> 00:05:12,030 pamiętaj, że trzeba przenieść plik wskaźnik położenia, ponieważ 91 00:05:12,030 --> 00:05:14,480 nie może fread do wypełnienia. 92 00:05:14,480 --> 00:05:18,230 Więc chcesz, aby upewnić się, że plik wskaźnik pozycji w pliku wejściowego 93 00:05:18,230 --> 00:05:19,980 znajduje się w odpowiednim miejscu. 94 00:05:19,980 --> 00:05:23,970 Ponieważ chcemy również rozmiar w pionie. 95 00:05:23,970 --> 00:05:27,090 Nie możemy po prostu rozciągnąć poziomo, bo każdy rząd potrzebuje 96 00:05:27,090 --> 00:05:30,370 do skopiowania n razy. 97 00:05:30,370 --> 00:05:33,050 >> Teraz istnieje kilka różnych sposobów, aby to zrobić. 98 00:05:33,050 --> 00:05:39,010 Tak jeden, możemy użyć metody przepisywania, w że pamiętamy wszystkie piksele 99 00:05:39,010 --> 00:05:42,840 danego wiersza w tablicy, i Następnie piszemy tę tablicę jako 100 00:05:42,840 --> 00:05:44,730 tyle razy, ile potrzeba. 101 00:05:44,730 --> 00:05:49,530 Czy istnieje sposób ponownie skopiować gdzie, Po przeczytaniu w jednym rzędzie w pliku wejściowego 102 00:05:49,530 --> 00:05:53,530 i piśmie, że do pliku wynikowego, dodając dopełnienie, my fseek 103 00:05:53,530 --> 00:05:57,250 powrotem do początku pierwotnego rzędu a następnie powtórz poziomej 104 00:05:57,250 --> 00:05:58,710 zmiana rozmiaru stamtąd. 105 00:05:58,710 --> 00:06:02,280 Niezależnie od stosowanej metody, chociaż, LL aby każdy piksel być powtarzane 106 00:06:02,280 --> 00:06:06,370 n razy, a każdy wiersz jest powtarzane n razy, jak również. 107 00:06:06,370 --> 00:06:09,160 >> Z tym, będziesz miał bitmapy większa niż życie. 108 00:06:09,160 --> 00:06:11,760 Nazywam się Zamyla, i to jest CS50. 109 00:06:11,760 --> 00:06:19,542