1 00:00:00,000 --> 00:00:10,210 >> [MUSIC PLAYBACK] 2 00:00:10,210 --> 00:00:13,320 >> ZAMYLA CHAN: Poďme rana čo sa s veľkosť. 3 00:00:13,320 --> 00:00:17,710 V zmeny veľkosti, bude užívateľ odovzdať prostredníctvom príkazového riadku, bitmapový obraz, ktorý 4 00:00:17,710 --> 00:00:21,860 chcú, aby ste mierku podľa čísla že tiež odovzdať, 5 00:00:21,860 --> 00:00:23,770 v príkazovom riadku. 6 00:00:23,770 --> 00:00:24,690 Ako to robíme? 7 00:00:24,690 --> 00:00:28,270 >> No, v prvej veci Po prvé, poďme rozčleniť tento systém do krokov. 8 00:00:28,270 --> 00:00:31,510 Budeš chcieť otvoriť uložená_hra že sa vám, rovnako ako 9 00:00:31,510 --> 00:00:35,560 vytvoriť a otvoriť outfile, že sa chystáte dať 10 00:00:35,560 --> 00:00:38,020 Snímku so zmenenou veľkosťou palcov 11 00:00:38,020 --> 00:00:42,050 Potom, pretože ste zmenu veľkosti, a pretože je to bitmapa, to záhlavie, tak 12 00:00:42,050 --> 00:00:46,080 budete tiež aktualizovať hlavičku Informácie o outFile, 13 00:00:46,080 --> 00:00:47,950 a napísať, že dovnútra 14 00:00:47,950 --> 00:00:51,850 Potom budete čítať do scanline na vstupný súbor, 15 00:00:51,850 --> 00:00:56,890 pixel-by-pixel, veľkosti horizontálne a písanie tých pixelov do 16 00:00:56,890 --> 00:01:00,910 outfile, ako je uvedené podľa stupnice užívateľa. 17 00:01:00,910 --> 00:01:03,940 >> Budeš mať na pamäti, pridať výplň podľa potreby. 18 00:01:03,940 --> 00:01:05,400 Viac o tom neskôr. 19 00:01:05,400 --> 00:01:07,790 A potom tiež zmeniť veľkosť v zvislom smere. 20 00:01:07,790 --> 00:01:08,890 OK. 21 00:01:08,890 --> 00:01:13,280 Takže to bude trochu viac zložitejšie, než kto to urobil, ale 22 00:01:13,280 --> 00:01:18,310 čo je podobné je to copy.c bude, opäť ukázať ako veľmi užitočné. 23 00:01:18,310 --> 00:01:23,160 Pamätajte si, že copy.c otvorí súbor, aktualizuje informácie o záhlavie pre 24 00:01:23,160 --> 00:01:28,250 outfile, potom prečíta do scanline, pixel-by-pixel, písať každý pixel 25 00:01:28,250 --> 00:01:30,510 do scanline výstupného súboru. 26 00:01:30,510 --> 00:01:37,040 >> Takže znova, môže váš prvý krok pravdepodobne bolo cp, copy.c, resize.c 27 00:01:37,040 --> 00:01:40,560 do PSET5 adresára. 28 00:01:40,560 --> 00:01:43,920 Pamätajte, že pred kopírovaním, Uistite sa, že ste pochopili, 29 00:01:43,920 --> 00:01:46,600 copy.c veľmi dôkladne. 30 00:01:46,600 --> 00:01:47,620 OK. 31 00:01:47,620 --> 00:01:49,880 >> Takže poďme otvoriť súbor. 32 00:01:49,880 --> 00:01:50,870 Viete, ako to urobiť. 33 00:01:50,870 --> 00:01:52,600 Chystám sa nechať, že na vás. 34 00:01:52,600 --> 00:01:56,050 Ďalšie, aktualizujte informácie o záhlaví outFile. 35 00:01:56,050 --> 00:01:59,240 Vzhľadom k tomu, že máme nové bitmapy, máme nové informácie hlavičky. 36 00:01:59,240 --> 00:02:00,970 Čo sa mení tu? 37 00:02:00,970 --> 00:02:06,000 No, veľkosť súboru sa zmení pretože budeme mať viac 38 00:02:06,000 --> 00:02:07,900 pixelov než predtým. 39 00:02:07,900 --> 00:02:11,060 Veľkosť obrazu, tak aj zmení, ako je 40 00:02:11,060 --> 00:02:13,050 šírka a výška. 41 00:02:13,050 --> 00:02:17,180 >> Takže, ktoré premenné sú tie, presne? 42 00:02:17,180 --> 00:02:20,960 No, keď sa pozriete do záhlavia informácie, môžete vidieť, že je 43 00:02:20,960 --> 00:02:25,640 biSizeImage, čo predstavuje celkový Veľkosť obrazu v bajtoch, 44 00:02:25,640 --> 00:02:28,340 vrátane pixelov a polstrovanie. 45 00:02:28,340 --> 00:02:32,520 biWidth je šírka obrázku v pixeloch, bez polstrovania. 46 00:02:32,520 --> 00:02:35,580 biHeight je výška obrázku v pixeloch. 47 00:02:35,580 --> 00:02:39,200 A tak tie sú obsiahnuté v structs BITMAPFILEHEADER a 48 00:02:39,200 --> 00:02:40,390 BITMAPINFOHEADER. 49 00:02:40,390 --> 00:02:45,300 Môžete povedať, ktorý z nich je ktorý by bude bmp.h a pri pohľade na 50 00:02:45,300 --> 00:02:49,670 BITMAPINFOHEADER struct a videnie premenných, ktoré sú v ňom uvedené. 51 00:02:49,670 --> 00:02:54,700 >> Takže aktualizovať outfiles záhlavia informácie, budete chcieť, aby 52 00:02:54,700 --> 00:02:57,025 Zmena týchto hodnôt výška a šírka. 53 00:02:57,025 --> 00:03:00,570 Ale šanca, že možno budete musieť niektoré informácie hlavičku v Infil je 54 00:03:00,570 --> 00:03:03,670 neskôr, tak najlepšie sledovať z oboch. 55 00:03:03,670 --> 00:03:07,770 Ale byť veľmi jasné, s premennou mená tak, že nemáte náhodou 56 00:03:07,770 --> 00:03:12,490 napísať nesprávne hodnoty v záhlavie outFile. 57 00:03:12,490 --> 00:03:16,160 >> Takže teraz poďme na čítanie do scanline pixel-by-pixel. 58 00:03:16,160 --> 00:03:20,210 Opäť budeme sa obrátiť na náš trusty súbor I / O knižnice, a pozrieť sa na 59 00:03:20,210 --> 00:03:22,100 fread funkcie. 60 00:03:22,100 --> 00:03:26,150 fread sa na ukazovateľ na struct ktorý bude obsahovať bajtov, ktoré 61 00:03:26,150 --> 00:03:30,130 čítate v, veľkosť každého prvok, ktorý čítate - 62 00:03:30,130 --> 00:03:34,410 opäť, sizeof bude užitočný funkcia tu, počet 63 00:03:34,410 --> 00:03:38,820 prvky veľkosti, veľkosti, že ste čítanie, a potom konečne, 64 00:03:38,820 --> 00:03:41,310 inpointer, súbor, ktorý čítate z 65 00:03:41,310 --> 00:03:46,770 Takže ste s číselnými prvkami veľkosti od inpointer, a 66 00:03:46,770 --> 00:03:49,040 ich uvedenie do dát. 67 00:03:49,040 --> 00:03:51,695 >> Teraz je čas na zmenu veľkosti vodorovne. 68 00:03:51,695 --> 00:03:56,880 ak n sa rovná 2, potom pre každý pixel v Infil, budeme písať 69 00:03:56,880 --> 00:04:00,870 dvakrát v outFile. 70 00:04:00,870 --> 00:04:02,210 Ako píšeme súbory? 71 00:04:02,210 --> 00:04:06,400 No, máme fwrite funkciu, tak sme vzali ukazovateľ na struct 72 00:04:06,400 --> 00:04:10,170 ktorý obsahuje bajty, že ste písomné, a potom sme sa prejsť v 73 00:04:10,170 --> 00:04:14,430 veľkosť, počet, a výstup, kde budete písať, že. 74 00:04:14,430 --> 00:04:19,200 A potom opakovať proces, bude schopní jednoduché iteračné slučky for. 75 00:04:19,200 --> 00:04:21,740 >> Ale musíme si uvedomiť, pridať výplň palcov 76 00:04:21,740 --> 00:04:26,040 Koncept polstrovanie je, že dobre, Každý pixel je tri uhryznutie, ale 77 00:04:26,040 --> 00:04:28,940 Veľkosť každého Scanline muštu byť násobkom 4 bajty. 78 00:04:28,940 --> 00:04:33,660 Takže v prípade, že počet pixelov nie je násobkom 4, musíme pridať niektoré 79 00:04:33,660 --> 00:04:36,630 polstrovanie, ktoré je len nuly. 80 00:04:36,630 --> 00:04:42,130 Teraz, na rozdiel Kto to urobil, a na rozdiel od kópie, potom Infil obrazu a 81 00:04:42,130 --> 00:04:44,370 outfile súboru sa líši majú rôzne vypchávky, pretože sú 82 00:04:44,370 --> 00:04:46,360 rôzne šírky. 83 00:04:46,360 --> 00:04:46,690 >> OK. 84 00:04:46,690 --> 00:04:51,050 Tak snáď vzorec by hodiť sem. 85 00:04:51,050 --> 00:04:55,120 Nechám to na vás, aby ste si to, ale ti, že písať polstrovanie, 86 00:04:55,120 --> 00:04:59,360 dobre, je to len jednoduchá funkcia fputc, prechádzajúcej v charaktere 87 00:04:59,360 --> 00:05:02,200 že chcete písať, a potom ukazovateľ súbor, ktorý ste 88 00:05:02,200 --> 00:05:04,280 chcem písať. 89 00:05:04,280 --> 00:05:08,670 Takže teraz, že sme zmene veľkosti horizontálne, a potom použiť padding, 90 00:05:08,670 --> 00:05:12,030 nezabudnite, že budete musieť presunúť súbor ukazovateľ polohy, pretože vám 91 00:05:12,030 --> 00:05:14,480 nemôže fread do polstrovanie. 92 00:05:14,480 --> 00:05:18,230 Takže chcete, aby sa ubezpečil, že váš súbor ukazovateľ polohy v Infil 93 00:05:18,230 --> 00:05:19,980 je v správnom mieste. 94 00:05:19,980 --> 00:05:23,970 Pretože chceme tiež, aby Zmena veľkosti zvisle. 95 00:05:23,970 --> 00:05:27,090 Nemôžeme len tak roztiahnuť vodorovne, pretože každý riadok potreby 96 00:05:27,090 --> 00:05:30,370 ktorý má byť kopírovaný n-krát. 97 00:05:30,370 --> 00:05:33,050 >> Teraz, tam je niekoľko rôznych spôsoby, ako to urobiť. 98 00:05:33,050 --> 00:05:39,010 Takže jedna, môžeme použiť metódu prepísať, v pamätať, že všetky pixely 99 00:05:39,010 --> 00:05:42,840 na daný riadok v poli, a potom napísať, že pole ako 100 00:05:42,840 --> 00:05:44,730 toľkokrát, koľkokrát je potrebné. 101 00:05:44,730 --> 00:05:49,530 Alebo je tu spôsob prekopírovať, kde po prečítaní jedného riadku v Infil 102 00:05:49,530 --> 00:05:53,530 a potom napísal, že do outFile, pridanie polstrovanie, sme fseek 103 00:05:53,530 --> 00:05:57,250 späť na začiatok pôvodného riadku, a potom opakujte horizontálne 104 00:05:57,250 --> 00:05:58,710 veľkosti od tam. 105 00:05:58,710 --> 00:06:02,280 Bez ohľadu na metódu, keď budete aby každý pixel sa bude opakovať 106 00:06:02,280 --> 00:06:06,370 n krát, a každý riadok sa opakovať n krát, rovnako. 107 00:06:06,370 --> 00:06:09,160 >> S tým budete mať bitmapu väčší ako život. 108 00:06:09,160 --> 00:06:11,760 Volám sa Zamyla, a to je CS50. 109 00:06:11,760 --> 00:06:19,542