1 00:00:00,000 --> 00:00:10,210 >> [MUSIC PŘEHRÁVÁNÍ] 2 00:00:10,210 --> 00:00:13,320 >> ZAMYLA CHAN: Pojďme rána co se s velikost. 3 00:00:13,320 --> 00:00:17,710 V změny velikosti, bude uživatel předat prostřednictvím příkazového řádku, bitmapový obraz, který 4 00:00:17,710 --> 00:00:21,860 chtějí, abyste měřítko podle čísla že také předat, 5 00:00:21,860 --> 00:00:23,770 v příkazovém řádku. 6 00:00:23,770 --> 00:00:24,690 Jak to děláme? 7 00:00:24,690 --> 00:00:28,270 >> No, v první věci Za prvé, pojďme rozčlenit tento systém do kroků. 8 00:00:28,270 --> 00:00:31,510 Budeš chtít otevřít soubor_se_hrou že se vám, stejně jako 9 00:00:31,510 --> 00:00:35,560 vytvořit a otevřít outfile, že se chystáte dát 10 00:00:35,560 --> 00:00:38,020 Snímek se změněnou velikostí palců 11 00:00:38,020 --> 00:00:42,050 Potom, protože jste změnu velikosti, a protože je to bitmapa, to záhlaví, tak 12 00:00:42,050 --> 00:00:46,080 budete také aktualizovat záhlaví Informace o outFile, 13 00:00:46,080 --> 00:00:47,950 a napsat, že dovnitř 14 00:00:47,950 --> 00:00:51,850 Pak budete číst do scanline na vstupni soubor, 15 00:00:51,850 --> 00:00:56,890 pixel-by-pixel, velikosti horizontálně a psaní těch pixelů do 16 00:00:56,890 --> 00:01:00,910 outfile, jak je uvedeno podle stupnice uživatele. 17 00:01:00,910 --> 00:01:03,940 >> Budeš mít na paměti, přidat výplň podle potřeby. 18 00:01:03,940 --> 00:01:05,400 Více o tom později. 19 00:01:05,400 --> 00:01:07,790 A pak také změnit velikost ve svislém směru. 20 00:01:07,790 --> 00:01:08,890 OK. 21 00:01:08,890 --> 00:01:13,280 Takže to bude trochu víc složitější, než kdo to udělal, ale 22 00:01:13,280 --> 00:01:18,310 co je podobné je to copy.c bude, opět ukázat jako velmi užitečné. 23 00:01:18,310 --> 00:01:23,160 Pamatujte si, že copy.c otevře soubor, aktualizuje informace o záhlaví pro 24 00:01:23,160 --> 00:01:28,250 outfile, pak přečte do scanline, pixel-by-pixel, psát každý pixel 25 00:01:28,250 --> 00:01:30,510 do scanline výstupního souboru. 26 00:01:30,510 --> 00:01:37,040 >> Takže znovu, může váš první krok pravděpodobně bylo cp, copy.c, resize.c 27 00:01:37,040 --> 00:01:40,560 do PSET5 adresáře. 28 00:01:40,560 --> 00:01:43,920 Pamatujte, že před kopírováním, Ujistěte se, že jste pochopili, 29 00:01:43,920 --> 00:01:46,600 copy.c velmi důkladně. 30 00:01:46,600 --> 00:01:47,620 OK. 31 00:01:47,620 --> 00:01:49,880 >> Takže pojďme otevřít soubor. 32 00:01:49,880 --> 00:01:50,870 Víte, jak to udělat. 33 00:01:50,870 --> 00:01:52,600 Chystám se nechat, že na vás. 34 00:01:52,600 --> 00:01:56,050 Další, aktualizujte informace o záhlaví outFile. 35 00:01:56,050 --> 00:01:59,240 Vzhledem k tomu, že máme nové bitmapy, máme nové informace záhlaví. 36 00:01:59,240 --> 00:02:00,970 Co se mění tady? 37 00:02:00,970 --> 00:02:06,000 No, velikost souboru se změní protože budeme mít více 38 00:02:06,000 --> 00:02:07,900 pixelů než dříve. 39 00:02:07,900 --> 00:02:11,060 Velikost obrazu, tak i změní, jak je 40 00:02:11,060 --> 00:02:13,050 šířka a výška. 41 00:02:13,050 --> 00:02:17,180 >> Takže, které proměnné jsou ty, přesně? 42 00:02:17,180 --> 00:02:20,960 No, když se podíváte do záhlaví informace, můžete vidět, že je 43 00:02:20,960 --> 00:02:25,640 biSizeImage, což představuje celkový Velikost obrazu v bajtech, 44 00:02:25,640 --> 00:02:28,340 včetně pixelů a polstrování. 45 00:02:28,340 --> 00:02:32,520 biWidth je šířka obrázku v pixelech, bez polstrování. 46 00:02:32,520 --> 00:02:35,580 biHeight je výška obrázku v pixelech. 47 00:02:35,580 --> 00:02:39,200 A tak ty jsou obsaženy 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 říci, který z nich je který by bude bmp.h a při pohledu na 50 00:02:45,300 --> 00:02:49,670 BITMAPINFOHEADER struct a vidění proměnných, které jsou v něm uvedeny. 51 00:02:49,670 --> 00:02:54,700 >> Takže aktualizovat outfiles záhlaví informace, budete chtít, aby 52 00:02:54,700 --> 00:02:57,025 Změna těchto hodnot výška a šířka. 53 00:02:57,025 --> 00:03:00,570 Ale šance, že možná budete muset některé informace záhlaví v INFILE je 54 00:03:00,570 --> 00:03:03,670 později, tak nejlépe sledovat z obou. 55 00:03:03,670 --> 00:03:07,770 Ale být velmi jasné, s proměnnou jména tak, že nemáte náhodou 56 00:03:07,770 --> 00:03:12,490 napsat nesprávné hodnoty v záhlaví outFile. 57 00:03:12,490 --> 00:03:16,160 >> Takže teď pojďme na čtení do scanline pixel-by-pixel. 58 00:03:16,160 --> 00:03:20,210 Opět budeme se obrátit na náš trusty soubor I / O knihovny, a podívat se na 59 00:03:20,210 --> 00:03:22,100 fread funkce. 60 00:03:22,100 --> 00:03:26,150 fread se na ukazatel na struct který bude obsahovat bajtů, které 61 00:03:26,150 --> 00:03:30,130 čtete v, velikost každého prvek, který čtete - 62 00:03:30,130 --> 00:03:34,410 opět, sizeof bude užitečný funkce zde, počet 63 00:03:34,410 --> 00:03:38,820 prvky velikosti, velikosti, že jste čtení, a pak konečně, 64 00:03:38,820 --> 00:03:41,310 inpointer, soubor, který čtete z. 65 00:03:41,310 --> 00:03:46,770 Takže jste s číselnými prvky velikosti od inpointer, a 66 00:03:46,770 --> 00:03:49,040 jejich uvedení do dat. 67 00:03:49,040 --> 00:03:51,695 >> Nyní je čas na změnu velikosti vodorovně. 68 00:03:51,695 --> 00:03:56,880 pokud n se rovná 2, pak pro každý pixel v infile, budeme psát 69 00:03:56,880 --> 00:04:00,870 dvakrát v outFile. 70 00:04:00,870 --> 00:04:02,210 Jak píšeme soubory? 71 00:04:02,210 --> 00:04:06,400 No, máme fwrite funkci, tak jsme vzali ukazatel na struct 72 00:04:06,400 --> 00:04:10,170 který obsahuje bajty, že jste písemné, a pak jsme se projít v 73 00:04:10,170 --> 00:04:14,430 velikost, počet, a výstup, kde budete psát, že. 74 00:04:14,430 --> 00:04:19,200 A pak opakovat proces, bude schopni jednoduché iterační smyčky for. 75 00:04:19,200 --> 00:04:21,740 >> Ale musíme si uvědomit, přidat výplň palců 76 00:04:21,740 --> 00:04:26,040 Koncept polstrování je, že dobře, Každý pixel je tři kousnutí, ale 77 00:04:26,040 --> 00:04:28,940 Velikost každého Scanline moštu být násobkem 4 bajty. 78 00:04:28,940 --> 00:04:33,660 Takže v případě, že počet pixelů není násobkem 4, musíme přidat některé 79 00:04:33,660 --> 00:04:36,630 polstrování, které je jen nuly. 80 00:04:36,630 --> 00:04:42,130 Nyní, na rozdíl Kdo to udělal, a na rozdíl od kopie, pak infile obrazu a 81 00:04:42,130 --> 00:04:44,370 outfile souboru se liší mají různé vycpávky, protože jsou 82 00:04:44,370 --> 00:04:46,360 různé šířky. 83 00:04:46,360 --> 00:04:46,690 >> OK. 84 00:04:46,690 --> 00:04:51,050 Tak snad vzorec by hodit sem. 85 00:04:51,050 --> 00:04:55,120 Nechám to na vás, abyste si to, ale ti, že psát polstrování, 86 00:04:55,120 --> 00:04:59,360 dobře, je to jen jednoduchá funkce fputc, procházející v charakteru 87 00:04:59,360 --> 00:05:02,200 že chcete psát, a pak ukazatel soubor, který jste 88 00:05:02,200 --> 00:05:04,280 chci psát. 89 00:05:04,280 --> 00:05:08,670 Takže teď, že jsme změně velikosti horizontálně, a pak použít padding, 90 00:05:08,670 --> 00:05:12,030 nezapomeňte, že budete muset přesunout soubor ukazatel polohy, protože vám 91 00:05:12,030 --> 00:05:14,480 nemůže fread do polstrování. 92 00:05:14,480 --> 00:05:18,230 Takže chcete, aby se ujistil, že váš soubor ukazatel polohy v INFILE 93 00:05:18,230 --> 00:05:19,980 je ve správném místě. 94 00:05:19,980 --> 00:05:23,970 Protože chceme také, aby Změna velikosti svisle. 95 00:05:23,970 --> 00:05:27,090 Nemůžeme jen tak roztáhnout vodorovně, protože každý řádek potřeby 96 00:05:27,090 --> 00:05:30,370 který má být kopírován n-krát. 97 00:05:30,370 --> 00:05:33,050 >> Nyní, tam je několik různých způsoby, jak to udělat. 98 00:05:33,050 --> 00:05:39,010 Takže jedna, můžeme použít metodu přepsat, v pamatovat, že všechny pixely 99 00:05:39,010 --> 00:05:42,840 na daný řádek v poli, a pak napsat, že pole jako 100 00:05:42,840 --> 00:05:44,730 tolikrát, kolikrát je potřeba. 101 00:05:44,730 --> 00:05:49,530 Nebo je tu způsob překopírovat, kde po přečtení jednoho řádku v INFILE 102 00:05:49,530 --> 00:05:53,530 a pak napsal, že do outFile, přidání polstrování, jsme fseek 103 00:05:53,530 --> 00:05:57,250 zpět na začátek původního řádku, a pak opakujte horizontální 104 00:05:57,250 --> 00:05:58,710 velikosti od tam. 105 00:05:58,710 --> 00:06:02,280 Bez ohledu na metodu, když budete aby každý pixel se bude opakovat 106 00:06:02,280 --> 00:06:06,370 n krát, a každý řádek se opakovat n-krát, stejně. 107 00:06:06,370 --> 00:06:09,160 >> S tím budete mít bitmapu větší než život. 108 00:06:09,160 --> 00:06:11,760 Jmenuji se Zamyla, a to je CS50. 109 00:06:11,760 --> 00:06:19,542