1 00:00:00,000 --> 00:00:02,700 [Powered by Google Translate] [Návod - Problém Set 4] 2 00:00:02,700 --> 00:00:05,000 [Zamyla Chan - Harvard University] 3 00:00:05,000 --> 00:00:07,340 [To je CS50. - CS50.TV] 4 00:00:08,210 --> 00:00:11,670 Dobrá. Ahoj, všichni, a vítejte na Walkthrough 4. 5 00:00:11,670 --> 00:00:14,270 >> Dnes je naše Pset je forenzní. 6 00:00:14,270 --> 00:00:18,080 Forenzní je opravdu zábavná Pset, který zahrnuje jednání s bitmapové soubory 7 00:00:18,080 --> 00:00:21,550 zjistit, kdo spáchal zločin. 8 00:00:21,550 --> 00:00:24,200 Pak budeme velikost nějaké bitmapové soubory, 9 00:00:24,200 --> 00:00:27,780 pak jsme také bude zabývat opravdu zábavné části zvané Recover, 10 00:00:27,780 --> 00:00:31,160 , ve kterém jsou si v podstatě podal paměťové karty 11 00:00:31,160 --> 00:00:34,350 ve kterém někdo omylem smazali všechny své soubory, 12 00:00:34,350 --> 00:00:38,860 a my jsme vyzváni k vymáhání těchto souborů. 13 00:00:38,860 --> 00:00:42,910 >> Ale nejdřív, než se dostaneme do PSet, já opravdu chci pogratulovat všem. 14 00:00:42,910 --> 00:00:45,230 Jsme asi ve středu tohoto kurzu. 15 00:00:45,230 --> 00:00:50,070 Kvíz 0 je za námi, a my jsme na pset4, takže v podstatě, jsme na půli cesty. 16 00:00:50,070 --> 00:00:55,490 Ušli jsme dlouhou cestu, když se podíváte zpět na seznam psets, pset0 a pset1, 17 00:00:55,490 --> 00:00:57,300 tak poblahopřát sami o tom, 18 00:00:57,300 --> 00:01:00,760 a budeme se dostat do nějaké opravdu zábavné věci. 19 00:01:00,760 --> 00:01:07,070 >> Takže naše toolbox pro tento PSet, opět, místo toho, sudo yum-y update, 20 00:01:07,070 --> 00:01:13,890 jsme schopni jen spustit update50, pokud jste na verzi 17.3 a vyšší spotřebiče. 21 00:01:13,890 --> 00:01:17,380 Takže je třeba spustit update50 - je to mnohem jednodušší, několik méně znaků - 22 00:01:17,380 --> 00:01:20,640 Ujistěte se, že jste na nejnovější verzi spotřebiče. 23 00:01:20,640 --> 00:01:25,410 Zejména je důležité, aby update50, když začneme používat CS50 kontrolu. 24 00:01:25,410 --> 00:01:28,700 Takže se ujistěte, že jste to udělal. 25 00:01:28,700 --> 00:01:30,760 >> Pro všechny části pro tento Pset, 26 00:01:30,760 --> 00:01:34,350 budeme se zabývat souborů vstupy a výstupy, soubor I / O. 27 00:01:34,350 --> 00:01:38,140 Budeme jít přes mnoho programů, které se zabývají poli 28 00:01:38,140 --> 00:01:40,350 směřující k souborům a podobné věci, které, 29 00:01:40,350 --> 00:01:43,050 tak chceme, aby se ujistil, že jsme opravdu známé a pohodlné 30 00:01:43,050 --> 00:01:47,990 zabývající se jak vstup a výstup do souborů. 31 00:01:47,990 --> 00:01:52,080 >> V distribuční kódu pro tento PSet je soubor s názvem copy.c, 32 00:01:52,080 --> 00:01:55,280 a to je to, co budeme najít je bude opravdu užitečné pro nás 33 00:01:55,280 --> 00:02:00,340 protože budeme skončit skutečně kopírování copy.c soubor 34 00:02:00,340 --> 00:02:05,350 a jen měnit mírně, aby mohli dosáhnout prvních 2 části problému sady. 35 00:02:05,350 --> 00:02:09,030 >> A pak se, jak jsem se zmínil výše, máme co do činění s bitmapami i jako JPEG. 36 00:02:09,030 --> 00:02:13,170 Takže opravdu pochopení struktury, jak jsou organizovány tyto soubory, 37 00:02:13,170 --> 00:02:16,170 Jak můžeme opravdu překládat 0s a 1s do structs 38 00:02:16,170 --> 00:02:19,040 a věci, které můžeme skutečně pochopit a interpretovat a upravovat, 39 00:02:19,040 --> 00:02:21,000 to bude opravdu důležité, 40 00:02:21,000 --> 00:02:25,970 takže jít do JPEG a bitmapové soubory a pochopení struktury z nich. 41 00:02:25,970 --> 00:02:30,780 >> Pset4, jako obvykle, začíná část otázek. 42 00:02:30,780 --> 00:02:36,600 Ti se budou zabývat souborem I / O a vám zvyklí na to. 43 00:02:36,600 --> 00:02:42,520 Pak část 1 je detektivka, ve které budete stejně bitmapový soubor 44 00:02:42,520 --> 00:02:45,630 , která vypadá trochu jako červené tečky po celém těle. 45 00:02:45,630 --> 00:02:52,180 A pak v podstatě to, co budeme dělat, je vzít tento soubor a stačí upravit lehce 46 00:02:52,180 --> 00:02:54,010 na verzi, že můžeme číst. 47 00:02:54,010 --> 00:02:56,000 V podstatě, když jsme dokončit, budeme mít stejný soubor, 48 00:02:56,000 --> 00:03:02,630 kromě budeme moci vidět skrytou zprávu skryté všemi těmi červenými tečkami. 49 00:03:02,630 --> 00:03:07,310 Pak Resize je program, který, vzhledem soubor 50 00:03:07,310 --> 00:03:11,490 a pak daný název souboru, který výstupy a pak jim přiděleno číslo, stejně, 51 00:03:11,490 --> 00:03:16,850 bude skutečně zmenšit tento bitmapu tímto celočíselnou hodnotu. 52 00:03:16,850 --> 00:03:19,240 Pak konečně, máme obnovit PSet. 53 00:03:19,240 --> 00:03:24,160 Dostáváme paměťovou kartu a pak obnovit všechny fotografie 54 00:03:24,160 --> 00:03:25,920 , které byly omylem odstraněny, 55 00:03:25,920 --> 00:03:31,420 ale, jak se dozvíme, nebude odstraněn a ze souboru odstraněny; 56 00:03:31,420 --> 00:03:38,470 jsme tak nějak ztratila, kde byli v souboru, ale budeme obnovit to. 57 00:03:38,470 --> 00:03:44,950 >> Great. Takže když do souboru I / O konkrétně se jedná o celý seznam funkcí, které budete používat. 58 00:03:44,950 --> 00:03:49,840 Jste již viděli trochu základy fopen, fread, fwrite a, 59 00:03:49,840 --> 00:03:54,350 ale budeme se podívat dále do nějakého souboru I / O funkce, jako je fputc, 60 00:03:54,350 --> 00:03:56,930 , ve kterém stačí napsat jeden znak v době, 61 00:03:56,930 --> 00:04:02,000 na fseek, kde tak nějak přesunout soubor ukazatel polohy vpřed a vzad, 62 00:04:02,000 --> 00:04:05,770 a pak někteří jiní. Ale půjdeme do toho trochu později PSet. 63 00:04:08,050 --> 00:04:13,100 >> Takže první, jen aby se dostali do souboru I / O než půjdeme do PSet, 64 00:04:13,100 --> 00:04:19,860 k otevření souboru, například, co musíte udělat, je skutečně nastaven ukazatel k tomuto souboru. 65 00:04:19,860 --> 00:04:22,710 Takže máme FILE * ukazatel. 66 00:04:22,710 --> 00:04:27,140 V tomto případě, volám, že ukazovátko, protože to je bude můj infile. 67 00:04:27,140 --> 00:04:33,340 A tak budu používat funkce fopen a pak název souboru 68 00:04:33,340 --> 00:04:36,360 a pak režim, ve kterém budu se zabývat se souborem. 69 00:04:36,360 --> 00:04:42,080 Takže tam je "r" v tomto případě pro čtení, "w" pro psaní, a pak "" pro přidávání. 70 00:04:42,080 --> 00:04:44,270 Například, když máte co do činění s vstupni_soubor 71 00:04:44,270 --> 00:04:47,310 a vše, co chcete udělat, je přečíst bitů a bajtů uložené tam, 72 00:04:47,310 --> 00:04:50,420 pak jste pravděpodobně bude chtít použít "r" jako režim. 73 00:04:50,420 --> 00:04:54,520 Pokud chcete skutečně psát, druh vytvořit nový soubor, 74 00:04:54,520 --> 00:04:57,220 pak to, co budeme dělat, je budeme otevření nového souboru 75 00:04:57,220 --> 00:05:02,410 a použijte tlačítko "w" režimu pro psaní. 76 00:05:02,410 --> 00:05:07,540 >> Takže, když jste vlastně čtení do souborů, struktura je následující. 77 00:05:07,540 --> 00:05:14,930 Nejprve se patří ukazatel na struct, který bude obsahovat bajtů, které čtete. 78 00:05:14,930 --> 00:05:19,830 Takže to bude konec umístění bajtů, které čtete. 79 00:05:19,830 --> 00:05:23,360 Ty pak bude zobrazovat pouze velikost, rád v podstatě kolik bajtů 80 00:05:23,360 --> 00:05:30,100 váš program musí přečíst do souboru, velikost v podstatě jeden prvek, 81 00:05:30,100 --> 00:05:32,620 a pak budete určit, kolik prvků si chcete přečíst. 82 00:05:32,620 --> 00:05:34,980 A pak konečně, musíte vědět, kde jste čtení z, 83 00:05:34,980 --> 00:05:37,580 takže to bude tvůj v ukazatel. 84 00:05:37,580 --> 00:05:41,780 I barevně odlišeny, neboť dle fread je také velmi podobné fwrite, 85 00:05:41,780 --> 00:05:47,050 kromě chcete, aby se ujistil, že používáte správné pořadí, 86 00:05:47,050 --> 00:05:51,960 ujistěte se, že jste skutečně zápisu a čtení z pravé souboru. 87 00:05:54,910 --> 00:05:58,610 >> Takže jako předtím, pokud budeme mít velikost prvku, stejně jako počet prvků, 88 00:05:58,610 --> 00:06:00,600 pak můžeme hrát tady trochu. 89 00:06:00,600 --> 00:06:06,810 Řekněme, že mám psa, struct, a tak jsem si přečíst dva psi najednou. 90 00:06:06,810 --> 00:06:12,450 To, co jsem mohl udělat, je říci, že velikost jednoho prvku bude velikost jednoho DOG 91 00:06:12,450 --> 00:06:14,770 a budu skutečně číst dva z nich. 92 00:06:14,770 --> 00:06:18,290 Případně, co jsem mohl udělat, je říct, že jsem jen tak číst jeden prvek 93 00:06:18,290 --> 00:06:21,340 a že jedním z prvků bude velikost dvou psů. 94 00:06:21,340 --> 00:06:24,320 Tak to je obdobné, jak můžete trochu pohrát s velikostí a počtem 95 00:06:24,320 --> 00:06:28,250 v závislosti na tom, co je více intuitivní pro vás. 96 00:06:28,250 --> 00:06:30,810 >> Dobrá. Takže teď se dostáváme k psaní souborů. 97 00:06:30,810 --> 00:06:36,880 Pokud chcete napsat soubor, první argument je vlastně kam čtení z. 98 00:06:36,880 --> 00:06:42,050 Takže to je v podstatě data, která budete psát do souboru, 99 00:06:42,050 --> 00:06:44,490 který je mimo ukazatel na konci. 100 00:06:44,490 --> 00:06:47,670 Takže když máte co do činění s PSet, ujistěte se, že se zmást. 101 00:06:47,670 --> 00:06:50,480 Možná mají definic bok po boku. 102 00:06:50,480 --> 00:06:58,090 Můžete vytáhnout definice v příručce zadáním muže a pak fwrite, například, 103 00:06:58,090 --> 00:06:59,950 v terminálu, nebo se můžete obrátit zpět k tomuto snímku 104 00:06:59,950 --> 00:07:03,570 a ujistěte se, že používáte správný. 105 00:07:03,570 --> 00:07:08,700 Takže znovu, pro fwrite, když máte soubor, který chcete zapsat do, 106 00:07:08,700 --> 00:07:14,290 že to bude poslední argument a že to bude ukazatel do tohoto souboru. 107 00:07:14,290 --> 00:07:18,670 Takže to, jak jednáme s psaním snad několik bajtů v době, 108 00:07:18,670 --> 00:07:21,820 ale že chcete stačí napsat jen v jednom znaku. 109 00:07:21,820 --> 00:07:25,940 Jak uvidíme později v tomto příkladu, v bitmapy budeme muset použít. 110 00:07:25,940 --> 00:07:32,180 To je, když můžeme použít fputc, v podstatě jen uvedení jeden znak v době, chr, 111 00:07:32,180 --> 00:07:37,050 do souboru ukazatel, a to je naše se ukazatel tam. 112 00:07:38,700 --> 00:07:41,560 Takže vždy, když se snažíme, nebo psát v souboru, 113 00:07:41,560 --> 00:07:44,690 soubor je sledování, kde jsme. 114 00:07:44,690 --> 00:07:47,810 Takže je to druh kurzoru, pozice v souboru indikátorů. 115 00:07:47,810 --> 00:07:54,330 A tak když jsme psát nebo číst znovu do souboru, 116 00:07:54,330 --> 00:07:56,760 soubor skutečně pamatuje, kde je to, 117 00:07:56,760 --> 00:07:59,270 a tak to pokračuje od místa, kde je kurzor. 118 00:07:59,270 --> 00:08:03,970 To může být výhodné, když chcete, řekněme, přečtěte si v určitém množství něco udělat 119 00:08:03,970 --> 00:08:06,160 a pak si v následující výši, 120 00:08:06,160 --> 00:08:10,700 ale někdy bychom mohli chtít vrátit, nebo skutečně začít od určitého referenční hodnoty. 121 00:08:10,700 --> 00:08:16,870 Takže funkce fseek, co dělá, je nám umožňuje pohybovat kurzorem v určitém souboru 122 00:08:16,870 --> 00:08:19,680 určitý počet bajtů. 123 00:08:19,680 --> 00:08:24,260 A pak to, co musíme udělat, je určit, kde referenční hodnota. 124 00:08:24,260 --> 00:08:31,520 Takže buď se pohybuje dopředu nebo dozadu od místa, kde se kurzor je v současné době, 125 00:08:31,520 --> 00:08:35,750 nebo se může určit, že by měl jen pohybovat od začátku souboru 126 00:08:35,750 --> 00:08:37,090 nebo od konce souboru. 127 00:08:37,090 --> 00:08:41,230 A tak si můžete projít v záporných nebo kladných hodnot na částku, 128 00:08:41,230 --> 00:08:44,960 a že se bude trochu pohybovat kurzorem buď dopředu nebo dozadu. 129 00:08:46,170 --> 00:08:51,920 >> Než jsme se dostali do dalších psets, jakékoli otázky týkající se souboru I / O? 130 00:08:53,860 --> 00:08:59,990 Dobře. Jak jsme se dostali do další příklady, neváhejte mě zastavit na otázky. 131 00:08:59,990 --> 00:09:06,930 >> Takže v detektivka, jste podal bitmapový soubor podobný tomuto červeným na snímku, 132 00:09:06,930 --> 00:09:14,510 a vypadá to, že to - banda červených teček - a opravdu nevím, co je napsáno. 133 00:09:14,510 --> 00:09:23,310 Pokud šilhání, můžete být schopni vidět mírný modravou barvu uvnitř uprostřed. 134 00:09:23,310 --> 00:09:26,270 V podstatě, že je místo, kde je uložen text. 135 00:09:26,270 --> 00:09:30,270 Tam byla vražda, co se stalo, a my musíme zjistit, kdo to udělal. 136 00:09:30,270 --> 00:09:36,760 Aby k tomu, že, musíme trochu převést tento obraz do čitelného formátu. 137 00:09:36,760 --> 00:09:42,740 Pokud jste se někdy setkali tento, někdy tam bude malé soupravy 138 00:09:42,740 --> 00:09:48,510 kde budete mít lupu s červeným filmem. Každý, kdo? Jo. 139 00:09:48,510 --> 00:09:52,770 Takže byste se pravou rukou něco takového, měli byste mít lupu 140 00:09:52,770 --> 00:09:58,130 s červeným filmu nad ním, byste dát to přes obraz, 141 00:09:58,130 --> 00:10:03,410 a měli byste být schopni vidět zprávy skryté v něm. 142 00:10:03,410 --> 00:10:07,080 Nemáme zvětšovací sklo s červeným filmem, a tak místo toho budeme druh vytvořit vlastní 143 00:10:07,080 --> 00:10:09,060 v tomto PSet. 144 00:10:09,060 --> 00:10:15,760 A tak se uživatel bude vstupní detektivka, pak stopa,. Bmp, 145 00:10:15,760 --> 00:10:18,800 tak to je infile, že je red dot zpráva, 146 00:10:18,800 --> 00:10:23,550 a pak říkají verdict.bmp bude náš outfile. 147 00:10:23,550 --> 00:10:27,900 Takže to bude vytvořit nový bitmapový obraz podobný vodítko jeden 148 00:10:27,900 --> 00:10:32,600 s výjimkou v čitelném formátu, kde můžeme vidět skrytou zprávu. 149 00:10:32,600 --> 00:10:37,550 >> Vzhledem k tomu, že budeme jednat s editaci a manipulaci s rastry nějakého druhu, 150 00:10:37,550 --> 00:10:42,400 budeme druhu ponoru v do struktury těchto bitmapové soubory. 151 00:10:42,400 --> 00:10:48,130 Šli jsme přes tyto trochou v přednášce, ale pojďme se podívat do nich něco víc. 152 00:10:48,130 --> 00:10:51,740 Rastry jsou v podstatě jen uspořádání bajtů 153 00:10:51,740 --> 00:10:55,790 kde jsme určit, která bytů říct, co. 154 00:10:55,790 --> 00:11:00,540 Takže tady je něco jako mapa bitmapového obrazu 155 00:11:00,540 --> 00:11:08,550 říká, že to začíná u některých hlavičkových souborů, začíná nějaké informace v tam. 156 00:11:08,550 --> 00:11:16,540 Můžete vidět, že asi na byte čísla 14 je velikost uvedena na bitmapového obrazu, 157 00:11:16,540 --> 00:11:18,520 a to pokračuje dál. 158 00:11:18,520 --> 00:11:23,810 Ale pak to, co jsme opravdu zajímá je zde začíná kolem bytového číslo 54. 159 00:11:23,810 --> 00:11:26,060 Máme tyto RGB trojčíslí. 160 00:11:26,060 --> 00:11:30,760 Co to udělá, je obsahují skutečné pixely, barevné hodnoty. 161 00:11:30,760 --> 00:11:35,950 Vše výše, že v záhlaví je nějaké informace 162 00:11:35,950 --> 00:11:41,240 odpovídající velikosti obrazu, šířkou obrazu, a výšky. 163 00:11:41,240 --> 00:11:44,930 Když jdeme do polstrováním později, uvidíme, proč je velikost obrazu 164 00:11:44,930 --> 00:11:48,670 se může lišit od šířky nebo výšky. 165 00:11:48,670 --> 00:11:54,240 Takže pak představují tyto - tyto bitmapové obrázky jsou sekvence bajtů - 166 00:11:54,240 --> 00:11:59,370 co bychom mohli udělat, je říct jo, budu si pamatovat, že v indexu 14, 167 00:11:59,370 --> 00:12:03,380 že je-li velikost, například, ale to, co budeme dělat, aby to jednodušší 168 00:12:03,380 --> 00:12:06,020 je zapouzdřit do struct. 169 00:12:06,020 --> 00:12:08,880 A tak máme dvě structs vyrobené pro nás, BITMAPFILEHEADER 170 00:12:08,880 --> 00:12:10,440 a BITMAPINFOHEADER, 171 00:12:10,440 --> 00:12:14,840 a tak vždy, když jsme si do tohoto souboru, ve výchozím nastavení to bude jít v pořádku, 172 00:12:14,840 --> 00:12:22,360 a tak, aby to také bude vyplňovat do proměnných, jako je biWidth a biSize. 173 00:12:25,270 --> 00:12:31,230 A pak konečně, je každý pixel reprezentován třemi bajty. 174 00:12:31,230 --> 00:12:35,500 První z nich je množství modré pixelu, druhý je množství zeleně, 175 00:12:35,500 --> 00:12:41,120 a konečně, množství červené, kde 0 znamená v podstatě žádné modrá nebo zelená ani žádný červený 176 00:12:41,120 --> 00:12:43,720 a pak ff je maximální hodnota. 177 00:12:43,720 --> 00:12:46,800 Jedná se o hexadecimální hodnoty. 178 00:12:46,800 --> 00:12:53,870 Takže pokud máme FF0000, pak to odpovídá maximální výši modré 179 00:12:53,870 --> 00:12:58,890 a pak už zelené a ne červený, tak pak by to bylo nám Blue Pixel. 180 00:12:58,890 --> 00:13:04,190 Pak máme-li FF je po celé desce, pak to znamená, že máme bílý pixel. 181 00:13:04,190 --> 00:13:11,370 To je druh naproti obvykle, když řekneme, RGB. Je to vlastně děje BGR. 182 00:13:12,750 --> 00:13:18,990 >> Takže pokud se skutečně podívat do příkladu bitmapového obrazu - dovolte mi, abych vytáhnout jeden až sem. 183 00:13:31,560 --> 00:13:33,830 Je to trochu malé. 184 00:13:39,890 --> 00:13:47,840 Jsem přiblížení, a my můžeme vidět to pixelated. Vypadá to, že bloky barvy. 185 00:13:47,840 --> 00:13:50,110 Máte bílé bloky a pak červené bloky. 186 00:13:50,110 --> 00:13:53,700 Pokud budete hrát v programu Malování, například, mohl byste udělat něco takového 187 00:13:53,700 --> 00:13:58,960 by v podstatě jen malovat některé čtverce v určitém pořadí. 188 00:13:58,960 --> 00:14:08,060 Tak co to znamená v bitmapě je následující. 189 00:14:08,060 --> 00:14:15,710 Zde máme první bílé pixely, které všechny 6 jsou f je, a pak máme červené pixely, 190 00:14:15,710 --> 00:14:19,910 indikován 0000FF. 191 00:14:19,910 --> 00:14:27,940 A tak posloupnost bajtů, které máme ukazuje, jak bitmapový obraz bude vypadat. 192 00:14:27,940 --> 00:14:32,230 Takže to, co jsem tady udělal je právě napsal všechny ty bajty a poté je barvená v červené 193 00:14:32,230 --> 00:14:37,550 takže můžete trochu vidět, když šprtů trochu, jak tento druh označuje smajlíky. 194 00:14:40,180 --> 00:14:46,390 >> Způsobem, že bitmapový obrázků práce je, že jsem si ho asi představovali v podstatě jako mřížku. 195 00:14:46,390 --> 00:14:54,940 A tak ve výchozím nastavení, každý řádek mřížky musí být násobkem 4 bytů. 196 00:15:00,520 --> 00:15:07,060 Podíváme-li se na bitmapový obraz, budete vyplňovat každé hodnotě. 197 00:15:07,060 --> 00:15:17,370 Například, můžete mít červenou tady, zelenou tady, modrá zde, 198 00:15:17,370 --> 00:15:24,950 ale musíte se ujistit, že obraz je vyplněna násobek čtyř bajtů. 199 00:15:24,950 --> 00:15:32,200 Takže když chci svůj obraz na tři bloky široký, pak bych musel dát prázdnou hodnotu 200 00:15:32,200 --> 00:15:35,640 v posledním, aby bylo násobkem čtyř. 201 00:15:35,640 --> 00:15:39,530 Tak pak bych přidat do něčeho, co jsme volajícího polstrování. 202 00:15:39,530 --> 00:15:43,750 Jdu jen ukázat, že tam s x. 203 00:15:44,920 --> 00:15:54,160 Teď říkají, že chtějí obraz, který je 7 pixelů dlouho, například. 204 00:15:54,160 --> 00:15:59,550 Máme 1, 2, 3, 4, 5, 6, 7, 205 00:16:04,750 --> 00:16:07,000 a to vše se vyplní barvou. 206 00:16:07,000 --> 00:16:10,620 Způsobem, že bitmapové obrázky fungovat, je, že musíme 8.. 207 00:16:10,620 --> 00:16:12,460 Právě teď máme 1, 2, 3, 4, 5, 6, 7. 208 00:16:12,460 --> 00:16:19,360 Potřebujeme 8 prostory pro bitmapového obrazu číst správně. 209 00:16:19,360 --> 00:16:25,600 Takže to, co musíme udělat, je přidat jen trochu vycpávky 210 00:16:25,600 --> 00:16:29,430 Ujistěte se, že všechny šířky jsou jednotné 211 00:16:29,430 --> 00:16:34,260 a že všechny šířky jsou násobkem 4.. 212 00:16:42,110 --> 00:16:47,310 A tak jsem již dříve uvedla, polstr jako X nebo zakroucený linky, 213 00:16:47,310 --> 00:16:53,880 ale ve skutečných bitmapových obrázků je padding indikován hexadecimálním 0. 214 00:16:53,880 --> 00:16:57,340 Tak, že by byl jeden znak, 0. 215 00:16:58,980 --> 00:17:06,329 Co se může hodit, je xxd příkaz. 216 00:17:06,329 --> 00:17:11,220 Co to udělá, je ve skutečnosti ukazuje, rádi podobný tomu, co jsem dělal předtím, než se na smajlík 217 00:17:11,220 --> 00:17:15,630 když jsem ve skutečnosti vytiskne, co každá barva by pro pixel 218 00:17:15,630 --> 00:17:21,800 a pak barevně, tak při spuštění xxd s následujícími příkazy, 219 00:17:21,800 --> 00:17:28,670 pak to bude skutečně vytisknout, jaké barvy jsou pro ty pixelů. 220 00:17:28,670 --> 00:17:33,810 Co musíte udělat, je tady mám označit, jako-S 54 221 00:17:33,810 --> 00:17:36,530 říká, že budu začínat 54. bajtu 222 00:17:36,530 --> 00:17:40,820 protože před tím, si vzpomenout, jestli se podíváme zpět na mapu bitmapy, 223 00:17:40,820 --> 00:17:42,690 to je vše, informace v hlavičce a podobné věci. 224 00:17:42,690 --> 00:17:46,280 Ale to, co jsme opravdu záleží, je skutečné obrazové body, které označují barvu. 225 00:17:46,280 --> 00:17:52,700 Takže tím, že do té vlajky,-s 54, pak jsme schopni vidět barevné hodnoty. 226 00:17:52,700 --> 00:17:56,020 A nebojte se o složité vlajek a podobné věci. 227 00:17:56,020 --> 00:18:05,020 V spec problému nastavené, budete mít pokyny, jak používat xxd k zobrazení pixelů. 228 00:18:07,070 --> 00:18:15,590 Takže pokud uvidíte zde, docela to vypadá jako zelené pole, tento malý věc. 229 00:18:15,590 --> 00:18:23,610 Já jsem barevně kódovány 00ff00 jako v podstatě říká, žádnou modrou, hodně zeleně, a ne červený. 230 00:18:23,610 --> 00:18:26,370 Tak, že odpovídá zelené. 231 00:18:26,370 --> 00:18:31,920 Jak vidíte zde, vidíme zelený obdélník. 232 00:18:31,920 --> 00:18:36,660 Tento zelený obdélník je jen 3 pixelů široký, takže pak to, co musíme udělat, 233 00:18:36,660 --> 00:18:44,350 Ujistěte se, že obraz je násobkem 4 široký, je přidat v extra polstrování. 234 00:18:44,350 --> 00:18:49,460 A pak se to, jak vidíte tyto 0s zde. 235 00:18:49,460 --> 00:18:54,510 To bude skutečně výsledek vašeho Resize PSet, 236 00:18:54,510 --> 00:19:01,350 v podstatě brát malou bitmapu a pak rozšíření ji 4. 237 00:19:01,350 --> 00:19:09,380 A tak to, co vidíme, je, že ve skutečnosti tento obrázek 12 pixelů široký, ale 12 je násobkem 4, 238 00:19:09,380 --> 00:19:12,940 a tak jsme vlastně nevidím žádný 0s na konci, protože nepotřebujeme přidat jakékoli 239 00:19:12,940 --> 00:19:19,070 protože je to zcela vypolstrovaná. To nemá žádné větší prostor. 240 00:19:20,720 --> 00:19:23,470 >> Dobře. Máte otázky k čalounění? 241 00:19:25,150 --> 00:19:27,460 Dobře. Cool. 242 00:19:27,460 --> 00:19:32,520 >> Jak jsem již zmínil dříve, bitmapy jsou jen sled bajtů. 243 00:19:32,520 --> 00:19:39,170 A tak to, co máme, je místo museli sledovat přesně, jaké množství byte 244 00:19:39,170 --> 00:19:47,050 odpovídá na konkrétní prvek, jsme vlastně vytvořili struct reprezentovat, že. 245 00:19:47,050 --> 00:19:50,930 Takže to, co máme, je RGBTRIPLE struct. 246 00:19:50,930 --> 00:19:54,590 Kdykoli máte instanci RGB trojici, 247 00:19:54,590 --> 00:20:00,970 protože to je typ definovat struct, pak můžete přistoupit k rgbtBlue proměnné, 248 00:20:00,970 --> 00:20:09,520 Podobně Zelené a červené proměnné, které bude uvádět, kolik modrá, zelená a červená, 249 00:20:09,520 --> 00:20:11,580 respektive, máte. 250 00:20:11,580 --> 00:20:16,800 >> Takže pokud máme modrou proměnná nastavena na hodnotu 0, zelená nastavena na FF, 251 00:20:16,800 --> 00:20:22,060 což je maximální hodnota, kterou může mít, a potom červený proměnná nastavena na hodnotu 0, 252 00:20:22,060 --> 00:20:27,870 pak jakou barvu by to zejména RGB triple představují? >> [Student] Green. 253 00:20:27,870 --> 00:20:29,150 Green. Přesně tak. 254 00:20:29,150 --> 00:20:34,480 Je to bude užitečné vědět, že kdykoli budete mít instanci RGB trojici, 255 00:20:34,480 --> 00:20:41,340 můžete skutečně přístup k množství barvy - modrá, zelená, červená a - zvlášť. 256 00:20:43,350 --> 00:20:54,900 >> Teď, když jsme hovořili o struktuře, která, pojďme se podívat na BMP souboru. 257 00:20:54,900 --> 00:20:57,870 Jedná se o structs vyrobené pro vás. 258 00:20:57,870 --> 00:21:01,820 Zde máme BITMAPFILEHEADER struct. 259 00:21:01,820 --> 00:21:07,610 Zajímavá je velikost. 260 00:21:07,610 --> 00:21:12,660 Později, máme informační hlavičku, která má několik dalších věcí, které jsou pro nás zajímavý, 261 00:21:12,660 --> 00:21:15,480 totiž velikost, šířka a výška. 262 00:21:15,480 --> 00:21:19,170 Jak půjdeme do později, když budete číst do souboru, 263 00:21:19,170 --> 00:21:25,500 automaticky načte, protože jsme nastavili pořadí být stejný. 264 00:21:25,500 --> 00:21:31,990 Takže biSize bude obsahovat správné bajtů, které odpovídají skutečné velikosti obrázku. 265 00:21:34,700 --> 00:21:40,500 A pak je tu, konečně, jak jsme mluvili o tom, máme RGBTRIPLE typedef struct. 266 00:21:40,500 --> 00:21:46,840 Máme rgbtBlue, zelené a červené s ním spojené. 267 00:21:48,210 --> 00:21:49,340 >> Great. Dobře. 268 00:21:49,340 --> 00:21:56,360 Nyní, když jsme pochopili rastrové obrázky trochu, pochopit, že máme hlavičku souboru 269 00:21:56,360 --> 00:22:00,790 a info hlavička s ním spojené, a pak po tom, máme zajímavé věci, 270 00:22:00,790 --> 00:22:05,110 z barev, a tyto barvy jsou zastoupeny RGBTRIPLE structs, 271 00:22:05,110 --> 00:22:12,710 a ty zase mají tři hodnoty spojené k modré, zelené a červené. 272 00:22:12,710 --> 00:22:17,270 >> Takže teď, můžeme trochu přemýšlet o tom, Recover trochu. 273 00:22:17,270 --> 00:22:20,130 Promiňte. Přemýšlejte o tom, detektivka. 274 00:22:20,130 --> 00:22:25,750 Když máme stopa soubor, pak to, co chceme udělat, je přečíst v ní pixel po pixelu 275 00:22:25,750 --> 00:22:33,860 a pak nějak změnit ty pixely, takže můžeme výstupu do čitelného formátu. 276 00:22:33,860 --> 00:22:41,020 A tak do výstupu, budeme psát pixel po pixelu do verdict.bmp souboru. 277 00:22:41,020 --> 00:22:45,120 To je trochu moc co dělat. Uvědomujeme si, že. 278 00:22:45,120 --> 00:22:49,860 Takže to, co jsme udělali je, že jsme skutečně poskytovány vám copy.c. 279 00:22:49,860 --> 00:22:57,610 Co copy.c dělá, je jen udělá přesnou kopii daného rastrového souboru a pak výstup do. 280 00:22:57,610 --> 00:23:01,900 Tak to už otevírá soubor pro vás, čte v pixel po pixelu, 281 00:23:01,900 --> 00:23:04,510 a zapíše jej do do výstupního souboru. 282 00:23:04,510 --> 00:23:07,080 >> Pojďme se na to podívat. 283 00:23:13,390 --> 00:23:18,290 Toto je zajistit řádné využití, 284 00:23:18,290 --> 00:23:22,640 jak k souborům zde. 285 00:23:22,640 --> 00:23:29,940 Co to však je, že nastaví vstupní soubor bude to, co jsme prošel v v vstupni_soubor zde, 286 00:23:29,940 --> 00:23:34,750 což je náš druhý argument příkazového řádku. 287 00:23:34,750 --> 00:23:37,640 Kontroly se ujistit, že můžeme otevřít soubor. 288 00:23:38,960 --> 00:23:44,860 Zkontroluje, zda můžeme vytvořit nový outfile zde. 289 00:23:45,630 --> 00:23:53,270 Tak co to dělá tady, to prostě v podstatě začne číst do bitmapy od začátku. 290 00:23:53,270 --> 00:23:56,700 Začátek, jak víme, obsahuje BITMAPFILEHEADER, 291 00:23:56,700 --> 00:24:03,200 a tak tyto sekvence bitů se přímo vyplnit BITMAPFILEHEADER. 292 00:24:03,200 --> 00:24:07,940 Takže to, co tu máme, je říkat, že BITMAPFILEHEADER BF - 293 00:24:07,940 --> 00:24:13,150 to je naše nová proměnná typu BITMAPFILEHEADER - 294 00:24:13,150 --> 00:24:22,560 budeme dát dovnitř bf, co čteme z ukazovátko, což je naše infile. 295 00:24:22,560 --> 00:24:23,970 Jak moc jsme si? 296 00:24:23,970 --> 00:24:32,160 Čteme v kolik bytů budeme muset obsahovat celou BITMAPFILEHEADER. 297 00:24:32,160 --> 00:24:34,660 Podobně, to je to, co děláme pro info záhlaví. 298 00:24:34,660 --> 00:24:39,010 Takže jsme dále po našem souboru v soubor_se_hrou 299 00:24:39,010 --> 00:24:44,360 a my čtete tyto bity a bajty, a my jsme zapojení je přímo v 300 00:24:44,360 --> 00:24:47,880 do těchto instancí proměnných, které děláme. 301 00:24:49,370 --> 00:24:53,800 Zde jsme jen ujistit, že je bitmapa rastrový obrázek. 302 00:24:57,670 --> 00:25:01,030 >> Nyní máme outfile, že jo? 303 00:25:01,030 --> 00:25:04,420 Tak, jak to stojí, když jsme ji vytvořit, je to v podstatě prázdné. 304 00:25:04,420 --> 00:25:07,710 Takže máme v podstatě vytvořit nový rastrový obrázek od začátku. 305 00:25:07,710 --> 00:25:12,280 Co děláme je, že jsme se ujistit, že jsme zkopírujte do záhlaví souboru 306 00:25:12,280 --> 00:25:16,850 a info záhlaví stejně jako vstupni_soubor má. 307 00:25:16,850 --> 00:25:22,850 Co máme udělat, je budeme psát - a pamatujte, že bf je proměnná 308 00:25:22,850 --> 00:25:29,300 typu BITMAPFILEHEADER, takže to, co děláme, je, že jsme prostě použít tento obsah 309 00:25:29,300 --> 00:25:34,980 zapsat do outfile. 310 00:25:36,550 --> 00:25:38,510 Zde, si, jsme hovořili o polstrováním, 311 00:25:38,510 --> 00:25:47,820 jak je to důležité, aby se ujistil, že množství pixelů, které máme, je násobkem 4. 312 00:25:47,820 --> 00:25:52,790 To je docela užitečné vzorec pro výpočet, kolik padding máte 313 00:25:52,790 --> 00:25:57,670 vzhledem šířka souboru. 314 00:25:57,670 --> 00:26:04,120 Chci jste si uvědomit, že v copy.c máme vzorec pro výpočet odsazení. 315 00:26:04,120 --> 00:26:07,970 Dobře? Takže každý si to pamatovat. Great. 316 00:26:07,970 --> 00:26:14,050 Tak co copy.c dělá dál, je to iteruje přes všechny scanlines. 317 00:26:14,050 --> 00:26:23,730 To projde řádky a poté uloží každý triple, že to čte 318 00:26:23,730 --> 00:26:26,920 a zapíše jej do outfile. 319 00:26:26,920 --> 00:26:33,120 Takže tady čtete jen jeden RGB Triple v době 320 00:26:33,120 --> 00:26:39,860 a pak uvedení, že stejné Triple do outfile. 321 00:26:41,120 --> 00:26:48,340 Choulostivé části je, že výplň není RGB trojnásobný, 322 00:26:48,340 --> 00:26:55,200 a tak můžeme nejen číst, že padding množství trojic RGB. 323 00:26:55,200 --> 00:27:01,460 Co musíme udělat, je ve skutečnosti jen přesunout naše soubor ukazatel polohy, přesunout naše kurzor, 324 00:27:01,460 --> 00:27:06,840 na druhu přeskočit všechny polstrování, takže jsme na dalším řádku. 325 00:27:06,840 --> 00:27:12,990 A pak, co to dělá, je kopie ukazuje, jak budete chtít přidat výplň. 326 00:27:12,990 --> 00:27:14,990 Takže jsme vypočítá, kolik padding potřebujeme, 327 00:27:14,990 --> 00:27:18,220 tak to znamená, že musíme čalounění počet 0s. 328 00:27:18,220 --> 00:27:24,510 Co to však je pro smyčce, která klade čalounění počet 0s do našeho outfile. 329 00:27:24,510 --> 00:27:31,170 A pak konečně, zavřete oba soubory. Zavřete soubor_se_hrou stejně jako outfile. 330 00:27:31,170 --> 00:27:34,870 >> Tak to je, jak funguje copy.c, 331 00:27:34,870 --> 00:27:37,430 a že to bude docela užitečné. 332 00:27:39,720 --> 00:27:43,750 Místo toho jen skutečně přímo zkopírovat a vložit 333 00:27:43,750 --> 00:27:46,800 nebo jen při pohledu na něj a zadáním, co chcete, 334 00:27:46,800 --> 00:27:49,440 můžete jen chcete provést tento příkaz v terminálu, 335 00:27:49,440 --> 00:27:54,520 cp copy.c whodunit.c, která vytvoří nový soubor, whodunit.c, 336 00:27:54,520 --> 00:27:58,330 , který obsahuje přesně stejný obsah jako kopie dělá. 337 00:27:58,330 --> 00:28:03,880 Takže to, co můžeme udělat, je použít jako rámec, na kterém je možné budovat a upravovat 338 00:28:03,880 --> 00:28:06,900 pro naše detektivka souboru. 339 00:28:08,500 --> 00:28:14,670 >> To jsou naše to-dos udělat pro detektivka, ale to, co dělá copy.c 340 00:28:14,670 --> 00:28:16,730 je vlastně stará o většinu z nich pro nás. 341 00:28:16,730 --> 00:28:21,900 Takže všechno, co je třeba dělat, je změnit pixely podle potřeby 342 00:28:21,900 --> 00:28:25,920 skutečně provést soubor čitelný. 343 00:28:25,920 --> 00:28:32,960 Si uvědomit, že pro daný obrazový bod trojitým, tak pro danou proměnné typu RGBTRIPLE, 344 00:28:32,960 --> 00:28:35,990 můžete přistupovat k modré, zelené a červené hodnoty. 345 00:28:35,990 --> 00:28:38,670 To bude hodit, protože pokud k nim máte přístup, 346 00:28:38,670 --> 00:28:41,770 to znamená, že můžete také zkontrolovat, 347 00:28:41,770 --> 00:28:45,430 a to znamená, že můžete také změnit. 348 00:28:45,430 --> 00:28:49,430 >> Takže když jsme se vrátili do našeho červeného například lupy, 349 00:28:49,430 --> 00:28:53,390 v podstatě, že se choval jako jakýsi filtr pro nás. 350 00:28:53,390 --> 00:28:58,160 Takže to, co chceme udělat, je chceme filtrovat všechny trojic, které jsou přicházet 351 00:28:58,160 --> 00:29:01,240 Existuje několik různých způsobů, jak to udělat. 352 00:29:01,240 --> 00:29:07,100 V podstatě, můžete mít bez ohledu na typ filtru chcete. 353 00:29:07,100 --> 00:29:09,890 Možná budete chtít změnit všechny červené pixely 354 00:29:09,890 --> 00:29:13,570 nebo možná budete chtít změnit jiný barevný pixel na jinou barvu. 355 00:29:13,570 --> 00:29:15,400 To záleží na vás. 356 00:29:15,400 --> 00:29:19,580 Nezapomeňte, že můžete zjistit, jakou barvu pixel je 357 00:29:19,580 --> 00:29:23,000 a pak můžete také změnit, jak si procházíš. 358 00:29:24,410 --> 00:29:26,420 >> Dobře. Tak to je detektivka. 359 00:29:26,420 --> 00:29:32,760 Po spuštění detektivka, budete vědět, kdo viníkem zločinu byl. 360 00:29:32,760 --> 00:29:35,540 >> Teď jsme jít na Změnit velikost. 361 00:29:35,540 --> 00:29:37,990 Budeme ještě jednat s rastrovými obrázky. 362 00:29:37,990 --> 00:29:40,750 Co budeme dělat, je budeme mít vstupní bitmapu 363 00:29:40,750 --> 00:29:45,890 a pak budeme předávat v řadě a pak dostanete outfile bitmapu 364 00:29:45,890 --> 00:29:51,380 kde to je v podstatě náš infile zmenšen n.. 365 00:29:54,670 --> 00:30:01,450 Řekni můj soubor byl jen jeden pixel velký. 366 00:30:01,450 --> 00:30:09,100 Pak, pokud má n byl 3, odstupňováním po 3, pak bych zopakovat, že pixel n kolikrát, 367 00:30:09,100 --> 00:30:14,410 tak 3 krát, a pak také měřítko ho 3 krát stejně. 368 00:30:14,410 --> 00:30:17,840 Tak vidíte jsem měřítka vertikálně i horizontálně. 369 00:30:17,840 --> 00:30:19,680 >> A pak je tu příklad. 370 00:30:19,680 --> 00:30:27,590 Máte-li n = 2, zjistíte, že první modrý pixel tam opakovat dvakrát 371 00:30:27,590 --> 00:30:30,930 horizontálně i vertikálně dvakrát. 372 00:30:30,930 --> 00:30:38,040 A pak, že pokračuje, a tak budete mít přímý měřítko původního obrazu pomocí dvou. 373 00:30:40,920 --> 00:30:47,600 >> Takže pokud bychom měli upřesní Pseudokód pro to, chceme soubor otevřít. 374 00:30:47,600 --> 00:30:49,880 A pak s vědomím, že pokud se vrátíme sem, 375 00:30:49,880 --> 00:30:54,540 vidíme, že šířka pro outfile bude jiný, než je šířka pro infile. 376 00:30:54,540 --> 00:30:56,130 Co to znamená? 377 00:30:56,130 --> 00:31:01,230 To znamená, že naše informace v hlavičce se změní. 378 00:31:01,230 --> 00:31:03,790 A tak to, co budeme chtít udělat, je aktualizovat záhlaví informace, 379 00:31:03,790 --> 00:31:11,820 s vědomím, že když čteme ve spisech, pokud pracujete na copy.c rámce, 380 00:31:11,820 --> 00:31:17,570 již máme proměnnou, která označuje to, co je velikost a podobné věci. 381 00:31:17,570 --> 00:31:24,060 Takže až budete mít to, co budete chtít udělat, je změnit tyto konkrétní proměnné. 382 00:31:24,060 --> 00:31:29,380 Pamatujte, že pokud máte struct, jak přistupovat k proměnné v rámci které. 383 00:31:29,380 --> 00:31:32,080 Pomocí operátoru tečka, ne? 384 00:31:32,080 --> 00:31:36,420 Takže použití, víte, že budete muset změnit záhlaví info. 385 00:31:36,480 --> 00:31:41,030 Tak tady je to jen seznam skutečných prvků, které mají v úmyslu se mění v souboru. 386 00:31:41,030 --> 00:31:45,180 Velikost souboru se bude měnit, obraz, stejně jako šířku a výšku. 387 00:31:45,180 --> 00:31:50,080 Takže pak jít zpět na mapu bitmapy, 388 00:31:50,080 --> 00:31:57,730 podívejte se na to, zda je to soubor záhlaví nebo info záhlaví, který obsahuje tyto informace 389 00:31:57,730 --> 00:32:00,920 a pak se změnit podle potřeby. 390 00:32:05,010 --> 00:32:12,470 Opět platí, že říkají, cp copy.c resize.c. 391 00:32:12,470 --> 00:32:19,270 To znamená, že resize.c nyní obsahuje vše, co je obsažené v kopii 392 00:32:19,270 --> 00:32:24,490 protože kopie umožňuje nám způsob čtení v každé scanline pixel po pixelu. 393 00:32:24,490 --> 00:32:29,860 Kromě nyní, místo toho, aby jen změnou hodnot, jako jsme to udělali v detektivka, 394 00:32:29,860 --> 00:32:37,980 to, co chceme udělat, je chceme psát ve více pixelů 395 00:32:37,980 --> 00:32:43,580 tak dlouho, jak náš n je vyšší než 1. 396 00:32:43,580 --> 00:32:47,110 >> Pak to, co chceme udělat, je chceme natáhnout ho vodorovně n, 397 00:32:47,110 --> 00:32:50,490 stejně jako natáhnout svisle n.. 398 00:32:50,490 --> 00:32:52,710 Jak můžeme udělat? 399 00:32:52,710 --> 00:32:56,890 Řekněme, že váš n je 2, a máte tento daný soubor_se_hrou. 400 00:32:56,890 --> 00:32:58,730 Váš kurzor se chystá začít v první, 401 00:32:58,730 --> 00:33:03,530 a to, co chcete dělat, když n je 2, chcete-li tisknout v 2 z nich. 402 00:33:03,530 --> 00:33:05,490 Takže tisku v 2 z nich. 403 00:33:05,490 --> 00:33:10,830 Pak kurzor se bude pohybovat na další pixel, což je červený, 404 00:33:10,830 --> 00:33:18,400 a bude to vytisknout 2 těchto červených, připojí ho na to, co se stalo předtím. 405 00:33:18,400 --> 00:33:26,280 Pak se kurzor přesune na další pixel a kreslit 2 z nich. 406 00:33:26,280 --> 00:33:37,180 Když se podíváte zpět na copy.c rámce, co to dělá tady 407 00:33:37,180 --> 00:33:42,830 je to vytvoří novou instanci RGB trojici, nové proměnné názvem triple. 408 00:33:42,830 --> 00:33:50,500 A tady, když to čte do ní, čte z infile 1 RGBTRIPLE 409 00:33:50,500 --> 00:33:53,470 a uloží jej v této trojité proměnné. 410 00:33:53,470 --> 00:33:57,590 Takže pak máte skutečně proměnnou představující konkrétní pixel. 411 00:33:57,590 --> 00:34:05,290 Pak, když píšete, co budete chtít udělat, je uzavřete fwrite prohlášení do smyčky for 412 00:34:05,290 --> 00:34:11,080 , který píše do svého outfile tolikrát, kolikrát je potřeba. 413 00:34:17,449 --> 00:34:20,100 To je dost jednoduché. 414 00:34:20,200 --> 00:34:27,590 Stačí v podstatě zopakovat psaní proces n kolikrát škálovat vodorovně. 415 00:34:27,590 --> 00:34:32,969 >> Ale pak musíme mít na paměti, že naše padding se změní. 416 00:34:47,350 --> 00:34:53,020 Dříve, říct, že jsme měli něco o délce 3. 417 00:34:53,020 --> 00:35:00,130 Pak bychom jen přidat v tom, jak moc padding? Jen jeden víc, aby se to násobkem 4. 418 00:35:00,130 --> 00:35:10,480 Ale říct, že jsme škálování tento konkrétní snímek n = 2. 419 00:35:10,480 --> 00:35:16,300 Takže, kolik modrých pixelů budeme mít na konci? Budeme mít 6. 420 00:35:16,300 --> 00:35:21,470 1, 2, 3, 4, 5, 6. Dobrá. 421 00:35:21,470 --> 00:35:26,580 6 není násobkem 4. Jaký je nejbližší násobek 4? To bude mít 8. 422 00:35:26,580 --> 00:35:33,200 Takže jsme vlastně bude mít 2 znaky polstrováním tam. 423 00:35:33,200 --> 00:35:38,720 >> Pamatuje si někdo, pokud máme vzorec pro výpočet odsazení 424 00:35:38,720 --> 00:35:41,350 a kde by to mohlo být? 425 00:35:41,350 --> 00:35:45,160 [Neslyšitelné Student odpověď] >> Jo, copy.c. Právo. 426 00:35:45,160 --> 00:35:49,800 Tam je vzorec v copy.c spočítat, kolik padding máte 427 00:35:49,800 --> 00:35:53,810 daný konkrétní šířku bitmapového obrazu. 428 00:35:53,810 --> 00:36:02,950 Takže, co se děje, že je užitečné, pokud potřebujete přidat v určitém množství polstrování 429 00:36:02,950 --> 00:36:06,160 skutečně zjistit, kolik padding budete muset přidat. 430 00:36:10,820 --> 00:36:15,850 Ale jedna poznámka, však je, že chcete, aby se ujistil, že používáte správnou velikost. 431 00:36:15,850 --> 00:36:21,410 Jen si dejte pozor, protože jste v podstatě bude zabývat dvěma bitmapových obrázků. 432 00:36:21,410 --> 00:36:23,410 Chcete, aby se ujistil, že používáte ten správný. 433 00:36:23,410 --> 00:36:26,820 Když jste výpočtu odsazení pro outfile, který chcete použít na šířku outfile 434 00:36:26,820 --> 00:36:29,860 a ne šířka předchozí. 435 00:36:29,860 --> 00:36:37,240 >> Great. Tento druh se stará o protahování a celou bitmapový obraz horizontálně. 436 00:36:37,240 --> 00:36:41,290 Ale to, co chceme udělat, je skutečně natáhnout svisle stejně. 437 00:36:41,290 --> 00:36:48,760 To bude trochu složitější, protože když jsme dokončení kopírování řádek 438 00:36:48,760 --> 00:36:51,580 a psaní, že řádek, naše kurzor bude na konci. 439 00:36:51,580 --> 00:36:56,210 Takže když jsme znovu číst, pak je to jen přečtu do dalšího řádku. 440 00:36:56,210 --> 00:37:03,660 Takže to, co chceme udělat, je druh najít nějaký způsob, jak kopírovat ty řádky znovu 441 00:37:03,660 --> 00:37:12,500 nebo tak nějak, aby takový řádek a potom přepsat znovu. 442 00:37:14,380 --> 00:37:17,940 Jak jsem tak trochu zmínil, existuje několik různých způsobů, jak to udělat. 443 00:37:17,940 --> 00:37:23,040 Co můžete udělat, je, jak si teď procházíš a čtení přes konkrétní scanline 444 00:37:23,040 --> 00:37:28,560 a mění ho podle potřeby, pak druh obchodu všech těchto bodů v matici. 445 00:37:28,560 --> 00:37:36,350 Později na vás vím, že budete muset vytisknout, že pole znovu, 446 00:37:36,350 --> 00:37:39,830 a tak stačí použít tuto matici udělat. 447 00:37:39,830 --> 00:37:44,500 Dalším způsobem, jak to udělat, je můžete zkopírovat dolů o jeden řádek, 448 00:37:44,500 --> 00:37:47,950 pochopit, že musíte zkopírovat to znovu, takže vlastně pohybujte kurzorem, 449 00:37:47,950 --> 00:37:50,950 a že se bude používat metodu fseek. 450 00:37:50,950 --> 00:37:56,410 Dalo by se pohybovat kurzor celou cestu zpět a opakujte proces kopírování znovu. 451 00:37:56,410 --> 00:38:03,960 >> Takže pokud naše měřítko číslo n, pak kolikrát budeme muset vrátit 452 00:38:03,960 --> 00:38:10,500 a přepsat řádek? >> [Student] n - 1. >> Jo, perfektní. n - 1. 453 00:38:10,500 --> 00:38:14,390 Dokázali jsme to už jednou, takže pak budeme chtít zopakovat Going Back proces 454 00:38:14,390 --> 00:38:17,460 n - 1 množství časů. 455 00:38:22,730 --> 00:38:25,860 Dobře. Tak tady máte resize funkce. 456 00:38:25,860 --> 00:38:34,360 >> Nyní se dostaneme k opravdu zábavné části, můj oblíbený PSet, který je obnovit. 457 00:38:34,360 --> 00:38:39,580 Místo bitmapy, tentokrát máme co do činění s JPEG. 458 00:38:39,580 --> 00:38:43,370 My vlastně ne, stejně soubor jen pro JPEG, 459 00:38:43,370 --> 00:38:46,600 jsme stejně v podstatě syrové paměťové karty formátu. 460 00:38:46,600 --> 00:38:51,790 A tak to obsahuje trochu info a odpadky hodnot na začátku, 461 00:38:51,790 --> 00:38:57,240 a pak to začne a má spoustu souborů JPEG. 462 00:38:57,240 --> 00:39:03,430 Nicméně, to jsme předali kartu, kde jsme odstranili fotografie; 463 00:39:03,430 --> 00:39:08,300 podstatě, jsme zapomněli, kde jsou fotografie umístěny v kartě. 464 00:39:08,300 --> 00:39:12,770 Takže naším úkolem v Recover je projít tímto karty formátu 465 00:39:12,770 --> 00:39:16,500 a najít ty fotky znovu. 466 00:39:16,500 --> 00:39:23,990 >> Naštěstí, struktura souborů JPEG a kartotéka je trochu užitečná. 467 00:39:23,990 --> 00:39:28,850 Rozhodně by bylo trochu složitější, kdyby to nebylo v tomto konkrétním formátu. 468 00:39:28,850 --> 00:39:40,160 Každý soubor JPEG skutečně začíná se dvěma možnými sekvencemi, které jsou uvedeny výše. 469 00:39:40,160 --> 00:39:42,970 V podstatě, když máte nový soubor JPEG, 470 00:39:42,970 --> 00:39:52,720 začíná buď sekvence ffd8 ffe0 nebo druhý, ffd8 ffe1. 471 00:39:52,720 --> 00:39:59,530 Další užitečné věc je vědět, je, že JPEG jsou uloženy souvisle. 472 00:39:59,530 --> 00:40:03,380 Takže vždy, když jeden soubor JPEG končí, druhý začíná. 473 00:40:03,380 --> 00:40:07,070 Takže tam není žádný druh in-mezi hodnotami tam. 474 00:40:07,070 --> 00:40:15,510 Jakmile narazí na začátek JPEG, pokud jste již čtení JPEG, 475 00:40:15,510 --> 00:40:21,800 víte, že jste narazila na konec předchozího a začátkem toho příštího. 476 00:40:21,800 --> 00:40:25,890 >> Chcete-li druhu si to představit, jsem schéma. 477 00:40:25,890 --> 00:40:36,910 Další věc, o JPEG je, že můžeme číst v sekvencích 512 bajtů v době, 478 00:40:36,910 --> 00:40:39,380 podobně se začátkem karty. 479 00:40:39,380 --> 00:40:43,370 Nepotřebujeme být kontroly jednotlivých bajt, protože by to za prd. 480 00:40:43,370 --> 00:40:48,200 Takže místo toho, co můžeme udělat, je ve skutečnosti jen číst 512 bajtů v době, 481 00:40:48,200 --> 00:40:54,700 a pak, místo kontroly mezi ty, v těchto malinké plátky, 482 00:40:54,700 --> 00:40:58,640 můžeme jen zkontrolovat na začátku 512 bajtů. 483 00:40:58,640 --> 00:41:02,570 V podstatě v obrázku, co vidíte, je na začátku karty, 484 00:41:02,570 --> 00:41:08,700 budete mít hodnoty, které jsou ve skutečnosti relevantní pro skutečné JPEG samotných. 485 00:41:08,700 --> 00:41:15,830 Ale pak to, co mám, je hvězda uvést jednu ze dvou výchozích sekvencí ve formátu JPEG. 486 00:41:15,830 --> 00:41:19,910 Takže pokaždé, když uvidíte hvězdu, víte, že máte soubor JPEG. 487 00:41:19,910 --> 00:41:25,030 A pak každý soubor JPEG se bude nějaký násobek 512 bajtů 488 00:41:25,030 --> 00:41:27,880 ale ne nutně stejný násobek. 489 00:41:27,880 --> 00:41:32,050 Způsob, že víte, že jste hit jiný formát JPEG je, pokud jste hit jinou hvězdu, 490 00:41:32,050 --> 00:41:39,090 další výchozí posloupnost bajtů. 491 00:41:39,090 --> 00:41:43,330 Pak to, co jste tady, je, že máte červené JPEG pokračující dokud nenarazíte na hvězdu, 492 00:41:43,330 --> 00:41:45,150 který je označen na novou barvu. 493 00:41:45,150 --> 00:41:48,510 Můžete pokračovat a pak stisknete jinou hvězdu, narazíš další JPEG, 494 00:41:48,510 --> 00:41:50,590 budete pokračovat celou cestu až do konce. 495 00:41:50,590 --> 00:41:53,180 Jste na posledním obrázku zde, růžový. 496 00:41:53,180 --> 00:41:58,220 Můžete přejít na konec, dokud nenarazíte na konec souboru znak. 497 00:41:58,220 --> 00:42:00,820 To bude opravdu užitečné. 498 00:42:00,820 --> 00:42:03,170 >> Několik hlavních takeaways zde: 499 00:42:03,170 --> 00:42:06,670 Karta Soubor nezačíná s JPEG, 500 00:42:06,670 --> 00:42:13,350 ale jakmile JPEG začne, jsou všechny JPEGu uloženy vedle sebe navzájem. 501 00:42:17,520 --> 00:42:20,420 >> Někteří pseudokód pro obnovení. 502 00:42:20,420 --> 00:42:22,570 Za prvé, budeme otevřít naše karty soubor, 503 00:42:22,570 --> 00:42:27,500 a že to bude pomocí našeho souboru I / O funkce. 504 00:42:27,500 --> 00:42:32,430 Budeme opakovat následující postup, dokud jsme došli na konec souboru. 505 00:42:32,430 --> 00:42:36,450 Budeme číst 512 bajtů najednou. 506 00:42:36,450 --> 00:42:39,180 A to, co jsem řekl, je zde budeme ukládat do vyrovnávací paměti, 507 00:42:39,180 --> 00:42:46,230 tak v podstatě drží na těch 512 bajtů, dokud nebudeme přesně vědět, co s nimi mají dělat. 508 00:42:46,230 --> 00:42:50,300 Pak to, co chceme udělat, je chceme zjistit, zda jsme hit hvězdu nebo ne. 509 00:42:50,300 --> 00:42:57,960 Pokud jsme hit hvězdu, pokud jsme hit jeden z výchozích sekvencí, 510 00:42:57,960 --> 00:42:59,980 pak víme, že jsme hit nový soubor JPEG. 511 00:42:59,980 --> 00:43:08,860 To, co budete chtít udělat, je budeme chtít vytvořit nový soubor v našem pset4 adresáři 512 00:43:08,860 --> 00:43:14,480 pokračovat v tvorbě tohoto souboru. 513 00:43:14,480 --> 00:43:18,220 Ale také, pokud jsme již udělali JPEG dříve, 514 00:43:18,220 --> 00:43:25,620 pak chceme ukončit tento soubor a zatlačte jej do pset4 složky, 515 00:43:25,620 --> 00:43:29,780 kde budeme mít tento soubor uložit, protože pokud nebudeme specifikovat, že jsme skončil tento soubor JPEG, 516 00:43:29,780 --> 00:43:37,290 pak budeme mít de facto neurčitý částku. Tyto JPEG nikdy neskončí. 517 00:43:37,290 --> 00:43:40,840 Takže chceme, aby se ujistil, že když jsme čtení do souboru JPEG a písemně, 518 00:43:40,840 --> 00:43:46,590 chceme konkrétně blízko, že s cílem otevřít další. 519 00:43:46,590 --> 00:43:48,430 Budeme chtít, aby zkontrolovat několik věcí. 520 00:43:48,430 --> 00:43:52,880 Chceme zjistit, zda jsme na začátku nového formátu JPEG s naší paměti 521 00:43:52,880 --> 00:43:56,780 a také pokud jsme již našli JPEG do 522 00:43:56,780 --> 00:44:03,930 proto, že se bude měnit proces mírně. 523 00:44:03,930 --> 00:44:07,880 Takže poté, co jste projít celou cestu a narazí na konec souboru, 524 00:44:07,880 --> 00:44:11,570 pak to, co budete chtít udělat, je, že budete chtít uzavřít všechny soubory, které jsou v současné době otevřít. 525 00:44:11,570 --> 00:44:14,100 To bude pravděpodobně poslední JPEG soubor, který máte, 526 00:44:14,100 --> 00:44:18,930 stejně jako karty soubor, který jste se zabýváme. 527 00:44:21,940 --> 00:44:28,670 >> Poslední překážkou, která se musíme vypořádat, je, jak vlastně udělat souboru JPEG 528 00:44:28,670 --> 00:44:31,950 a jak se vlastně tlačit do složky. 529 00:44:33,650 --> 00:44:39,850 The Pset vyžaduje, aby každá JPEG že najít být v následujícím formátu, 530 00:44:39,850 --> 00:44:43,990 kde máte číslo. jpg. 531 00:44:43,990 --> 00:44:50,750 Číslo, i když je to 0, říkáme, že 000.jpg. 532 00:44:50,750 --> 00:44:55,730 Kdykoliv najdete JPEG v programu, 533 00:44:55,730 --> 00:44:58,040 budete chtít pojmenovat ji v pořadí, že je to bylo. 534 00:44:58,040 --> 00:44:59,700 Co to znamená? 535 00:44:59,700 --> 00:45:03,530 Musíme druhu sledovat, kolik jsme našli 536 00:45:03,530 --> 00:45:08,680 a co číslo každého JPEG by měl být. 537 00:45:08,680 --> 00:45:13,800 Zde budeme využít sprintf funkce. 538 00:45:13,800 --> 00:45:17,480 Podobně jako printf, který jen tak výtisků hodnota ven do terminálu, 539 00:45:17,480 --> 00:45:23,910 sprintf vytiskne soubor ven do složky. 540 00:45:23,910 --> 00:45:30,870 A tak, co to bude dělat, jestli jsem měl sprintf, titul, a pak retezec, 541 00:45:30,870 --> 00:45:36,660 to by vytisknout 2.jpg. 542 00:45:36,660 --> 00:45:41,020 Za předpokladu, že jsem zavřel mé soubory správně, 543 00:45:41,020 --> 00:45:47,210 které bude obsahovat soubor, který jsem byl při zápisu. 544 00:45:47,210 --> 00:45:50,320 Ale jedna věc je, že kód, který mám tady 545 00:45:50,320 --> 00:45:53,360 není zcela uspokojit co Pset vyžaduje. 546 00:45:53,360 --> 00:46:02,410 The Pset vyžaduje, aby druhý JPEG soubor by měl být jmenován 002 místo toho jen 2. 547 00:46:02,410 --> 00:46:09,160 Takže, když vytisknout název, pak možná budete chtít změnit zástupný symbol mírně. 548 00:46:09,160 --> 00:46:18,140 >> Pamatuje si někdo, jak jsme umožňují přebývajících mezer, když jsme vytisknout něco? 549 00:46:18,140 --> 00:46:22,530 Jo. >> [Student] Dal jsi 3 mezi znakem procenta a 2. >> Jo, perfektní. 550 00:46:22,530 --> 00:46:25,610 Budete dát 3 v tomto případě, protože chceme, aby prostor pro 3. 551 00:46:25,610 --> 00:46:32,590 % 3d by pravděpodobně vám 002.jpg místo 2. 552 00:46:32,590 --> 00:46:40,120 První argument do funkce sprintf je vlastně char pole, 553 00:46:40,120 --> 00:46:42,520 které jsme dříve znali jako řetězce. 554 00:46:42,520 --> 00:46:50,700 Ti vůle, trochu více jako dočasné úložiště, stačí uložit výsledný řetězec. 555 00:46:50,700 --> 00:46:54,950 Budete opravdu bude zabývat, ale je třeba zahrnout. 556 00:46:54,950 --> 00:47:00,710 >> S vědomím, že každý název souboru má číslo, které trvá až tři znaky, 557 00:47:00,710 --> 00:47:06,770 a pak. jpg, by jak dlouho to pole bude? 558 00:47:09,070 --> 00:47:14,310 Vyhodit číslo. Kolik znaků v nadpisu, v názvu? 559 00:47:18,090 --> 00:47:26,320 Takže tam je 3 hashtags, období, jpg. >> [Student] 7. 7 >>. Ne tak docela. 560 00:47:26,320 --> 00:47:32,000 Budeme chtít 8, protože chceme, aby bylo možné null zakončení stejně. 561 00:47:45,340 --> 00:47:49,730 >> Konečně, jen vytáhnout proces, který budete dělat pro obnovení, 562 00:47:49,730 --> 00:47:55,420 máte nějaké počáteční informace. 563 00:47:55,420 --> 00:48:02,460 Můžete pokračovat, dokud nenajdete začátek souboru JPEG, 564 00:48:02,460 --> 00:48:07,900 a že může být buď jeden ze dvou výchozích sekvencí. 565 00:48:07,900 --> 00:48:12,510 Pořád na čtení. Každý lomítko zde představuje 512 bajtů. 566 00:48:12,510 --> 00:48:22,630 Nechte si na čtení, mějte na čtení, dokud se setkáte s jinou startovní pořadí. 567 00:48:22,630 --> 00:48:29,790 Jakmile budete mít to, že jste-li ukončit aktuální JPEG - v tomto případě, je to červené, 568 00:48:29,790 --> 00:48:31,030 takže chcete ukončit to. 569 00:48:31,030 --> 00:48:35,540 Chcete-li sprintf název, který do vašeho pset4 složky, 570 00:48:35,540 --> 00:48:41,580 pak chcete otevřít novou JPEG a potom se držet na čtení 571 00:48:41,580 --> 00:48:46,370 dokud se setkáte s další. 572 00:48:46,370 --> 00:48:49,040 Mějte na čtení, mějte na čtení, 573 00:48:49,040 --> 00:48:56,290 a pak konečně, nakonec, budete k dosažení konce souboru, 574 00:48:56,290 --> 00:49:00,360 a tak se budete chtít uzavřít poslední JPEG, že jste pracoval s, 575 00:49:00,360 --> 00:49:08,380 sprintf, že do pset4 složky, a pak se podívejte na všechny obrázky, které jste dostali. 576 00:49:08,380 --> 00:49:12,050 Tyto fotografie jsou vlastně obrazy CS50 zaměstnanců, 577 00:49:12,050 --> 00:49:16,430 a tak to je místo, kde bonus zábavné část PSet přijde 578 00:49:16,430 --> 00:49:26,310 je to, že jste v soutěži ve svých oddílech najít TFS v obrazech 579 00:49:26,310 --> 00:49:34,610 a fotit se s nimi dokázat, že jste udělali PSet 580 00:49:34,610 --> 00:49:37,030 a tak můžete vidět, které zaměstnanci jsou na obrázcích. 581 00:49:37,030 --> 00:49:41,510 Takže pak si fotit se zaměstnanci. Někdy budete muset honit je. 582 00:49:41,510 --> 00:49:44,680 Pravděpodobně někteří z nich se pokusí utéct od tebe. 583 00:49:44,680 --> 00:49:47,320 Můžete pořizovat snímky s nimi. 584 00:49:47,320 --> 00:49:51,190 To probíhá. Není to z důvodu, kdy Pset splatná. 585 00:49:51,190 --> 00:49:53,340 Termín bude oznámen v spec. 586 00:49:53,340 --> 00:49:58,060 Pak společně s vaší sekce, podle toho, co oddíl se nejvíce fotografie 587 00:49:58,060 --> 00:50:04,430 s nejvyšším počtem zaměstnanců vyhraje docela úžasné cenu. 588 00:50:04,430 --> 00:50:08,890 To je druh motivace, aby se vaše pset4 skončil tak rychle, jak je to možné 589 00:50:08,890 --> 00:50:10,820 protože pak se můžete pustit do práce 590 00:50:10,820 --> 00:50:14,570 stopovat všech různých CS50 zaměstnanců. 591 00:50:14,570 --> 00:50:17,500 To není povinné, i když, takže jakmile se dostanete na obrázky, 592 00:50:17,500 --> 00:50:20,310 pak jste hotovi s pset4. 593 00:50:20,310 --> 00:50:23,970 >> A já jsem skončil s Walkthrough 4, takže děkuji všem za účast. 594 00:50:23,970 --> 00:50:29,330 Hodně štěstí s Forenzní. [Potlesk] 595 00:50:29,330 --> 00:50:31,000 [CS50.TV]