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šetci, a vitajte na Walkthrough 4. 5 00:00:11,670 --> 00:00:14,270 >> Dnes je naša Pset je forenznú. 6 00:00:14,270 --> 00:00:18,080 Forenznú je naozaj zábavná Pset, ktorý zahŕňa rokovania s bitmapové súbory 7 00:00:18,080 --> 00:00:21,550 zistiť, kto spáchal zločin. 8 00:00:21,550 --> 00:00:24,200 Potom budeme veľkosť nejaké bitmapové súbory, 9 00:00:24,200 --> 00:00:27,780 potom sme tiež bude zaoberať naozaj zábavné časti zvanej Recover, 10 00:00:27,780 --> 00:00:31,160 , V ktorom sú si v podstate podal pamäťové karty 11 00:00:31,160 --> 00:00:34,350 v ktorom niekto omylom zmazali všetky svoje súbory, 12 00:00:34,350 --> 00:00:38,860 a my sme vyzvaní k vymáhaniu týchto súborov. 13 00:00:38,860 --> 00:00:42,910 >> Ale najprv, ako sa dostaneme do PSet, ja naozaj chcem pogratulovať všetkým. 14 00:00:42,910 --> 00:00:45,230 Sme asi v strede tohto kurzu. 15 00:00:45,230 --> 00:00:50,070 Kvíz 0 je za nami, a my sme na pset4, takže v podstate, sme na polceste. 16 00:00:50,070 --> 00:00:55,490 Prešli sme dlhú cestu, keď sa pozriete späť na zoznam psets, pset0 a pset1, 17 00:00:55,490 --> 00:00:57,300 tak zablahoželať sami o tom, 18 00:00:57,300 --> 00:01:00,760 a budeme sa dostať do nejakej naozaj zábavné veci. 19 00:01:00,760 --> 00:01:07,070 >> Takže naše toolbox pre tento PSet, opäť, namiesto toho, sudo yum-y update, 20 00:01:07,070 --> 00:01:13,890 sme schopní len spustiť update50, ak ste na verziu 17.3 a vyšší spotrebiča. 21 00:01:13,890 --> 00:01:17,380 Takže je potrebné spustiť update50 - je to oveľa jednoduchšie, niekoľko menej znakov - 22 00:01:17,380 --> 00:01:20,640 Uistite sa, že ste na najnovšiu verziu spotrebiča. 23 00:01:20,640 --> 00:01:25,410 Predovšetkým je dôležité, aby update50, keď začneme používať CS50 kontrolu. 24 00:01:25,410 --> 00:01:28,700 Takže sa uistite, že ste to urobil. 25 00:01:28,700 --> 00:01:30,760 >> Pre všetky časti pre tento Pset, 26 00:01:30,760 --> 00:01:34,350 budeme sa zaoberať súborov vstupy a výstupy, súbor I / O. 27 00:01:34,350 --> 00:01:38,140 Budeme ísť cez mnoho programov, ktoré sa zaoberajú poli 28 00:01:38,140 --> 00:01:40,350 smerujúce k súborom a podobné veci, ktoré, 29 00:01:40,350 --> 00:01:43,050 tak chceme, aby sa ubezpečil, že sme naozaj známe a pohodlné 30 00:01:43,050 --> 00:01:47,990 rokovania s tým, ako sa vstupom a výstupom do súborov. 31 00:01:47,990 --> 00:01:52,080 >> V distribučnej kódu pre tento PSet je súbor s názvom copy.c, 32 00:01:52,080 --> 00:01:55,280 a to je to, čo budeme nájsť ich bude naozaj užitočné pre nás 33 00:01:55,280 --> 00:02:00,340 pretože budeme skončiť skutočne kopírovanie copy.c súbor 34 00:02:00,340 --> 00:02:05,350 a len meniť mierne, aby mohli dosiahnuť prvých 2 časti problému sady. 35 00:02:05,350 --> 00:02:09,030 >> A potom sa, ako som sa zmienil vyššie, máme čo do činenia s bitmapami, rovnako ako súbory JPEG. 36 00:02:09,030 --> 00:02:13,170 Takže naozaj pochopenie štruktúry, ako sú organizované tieto súbory, 37 00:02:13,170 --> 00:02:16,170 Ako môžeme naozaj preložiť 0s a 1s do structs 38 00:02:16,170 --> 00:02:19,040 a veci, ktoré môžeme skutočne pochopiť a interpretovať a upravovať, 39 00:02:19,040 --> 00:02:21,000 to bude naozaj dôležité, 40 00:02:21,000 --> 00:02:25,970 takže ísť do JPEG a bitmapové súbory a pochopenie štruktúry z nich. 41 00:02:25,970 --> 00:02:30,780 >> Pset4, ako obyčajne, začína časť otázok. 42 00:02:30,780 --> 00:02:36,600 Tí sa budú zaoberať so súborom I / O a vám zvyknutí na to. 43 00:02:36,600 --> 00:02:42,520 Potom časť 1 je detektívka, v ktorej budete rovnako bitmapový súbor 44 00:02:42,520 --> 00:02:45,630 , Ktorá vyzerá trochu ako červené bodky po celom tele. 45 00:02:45,630 --> 00:02:52,180 A potom v podstate to, čo budeme robiť, je vziať tento súbor a stačí upraviť ľahko 46 00:02:52,180 --> 00:02:54,010 na verziu, že môžeme čítať. 47 00:02:54,010 --> 00:02:56,000 V podstate, keď sme dokončiť, budeme mať rovnaký súbor, 48 00:02:56,000 --> 00:03:02,630 okrem budeme môcť vidieť skrytú správu skryté všetkými tými červenými bodkami. 49 00:03:02,630 --> 00:03:07,310 Potom Resize je program, ktorý, vzhľadom súbor 50 00:03:07,310 --> 00:03:11,490 a potom daný názov súboru, ktorý výstupy a potom im pridelené číslo, rovnako, 51 00:03:11,490 --> 00:03:16,850 bude skutočne zmenšiť tento bitmapu týmto celočíselnú hodnotu. 52 00:03:16,850 --> 00:03:19,240 Potom konečne, máme obnoviť PSet. 53 00:03:19,240 --> 00:03:24,160 Dostávame pamäťovú kartu a potom obnoviť všetky fotografie 54 00:03:24,160 --> 00:03:25,920 , Ktoré boli omylom odstránené, 55 00:03:25,920 --> 00:03:31,420 ale, ako sa dozvieme, nebude odstránený a zo súboru odstránené; 56 00:03:31,420 --> 00:03:38,470 sme tak nejako stratila, kde boli v súbore, ale budeme obnoviť to. 57 00:03:38,470 --> 00:03:44,950 >> Great. Takže keď do súboru I / O konkrétne sa jedná o celý zoznam funkcií, ktoré budete používať. 58 00:03:44,950 --> 00:03:49,840 Ste už videli trochu základy fopen, fread, fwrite a, 59 00:03:49,840 --> 00:03:54,350 ale budeme sa pozrieť ďalej do nejakého súboru I / O funkcie, ako je fputc, 60 00:03:54,350 --> 00:03:56,930 , V ktorom stačí napísať jeden znak v čase, 61 00:03:56,930 --> 00:04:02,000 na fseek, kde tak nejako presunúť súbor ukazovateľ polohy vpred a vzad, 62 00:04:02,000 --> 00:04:05,770 a potom niektorí iní. Ale pôjdeme do toho trochu neskôr PSet. 63 00:04:08,050 --> 00:04:13,100 >> Takže prvé, len aby sa dostali do súboru I / O ako pôjdeme do PSet, 64 00:04:13,100 --> 00:04:19,860 na otvorenie súboru, napríklad, čo musíte urobiť, je skutočne nastavený ukazovateľ k tomuto súboru. 65 00:04:19,860 --> 00:04:22,710 Takže máme FILE * ukazovateľ. 66 00:04:22,710 --> 00:04:27,140 V tomto prípade, volám, že ukazovátko, pretože to je bude môj infile. 67 00:04:27,140 --> 00:04:33,340 A tak budem používať funkcie fopen a potom názov súboru 68 00:04:33,340 --> 00:04:36,360 a potom režim, v ktorom budem sa zaoberať so súborom. 69 00:04:36,360 --> 00:04:42,080 Takže tam je "r" v tomto prípade pre čítanie, "w" pre písanie, a potom "" pre pridávanie. 70 00:04:42,080 --> 00:04:44,270 Napríklad, keď máte čo do činenia s vstupni_soubor 71 00:04:44,270 --> 00:04:47,310 a všetko, čo chcete urobiť, je prečítať bitov a bajtov uložené tam, 72 00:04:47,310 --> 00:04:50,420 potom ste pravdepodobne bude chcieť použiť "r" ako režim. 73 00:04:50,420 --> 00:04:54,520 Ak chcete skutočne písať, druh vytvoriť nový súbor, 74 00:04:54,520 --> 00:04:57,220 potom to, čo budeme robiť, je budeme otvorení nového súboru 75 00:04:57,220 --> 00:05:02,410 a použite tlačidlo "w" režime pre písanie. 76 00:05:02,410 --> 00:05:07,540 >> Takže, keď ste vlastne čítanie do súborov, štruktúra je nasledujúca. 77 00:05:07,540 --> 00:05:14,930 Najprv sa patrí ukazovateľ na struct, ktorý bude obsahovať bajtov, ktoré čítate. 78 00:05:14,930 --> 00:05:19,830 Takže to bude koniec umiestnenie bajtov, ktoré čítate. 79 00:05:19,830 --> 00:05:23,360 Tie potom bude zobrazovať iba veľkosť, rád v podstate koľko bajtov 80 00:05:23,360 --> 00:05:30,100 váš program pre čítanie do súboru, veľkosť v podstate je jeden prvok, 81 00:05:30,100 --> 00:05:32,620 a potom budete určiť, koľko prvkov si chcete prečítať. 82 00:05:32,620 --> 00:05:34,980 A potom konečne, musíte vedieť, kde ste čítanie z, 83 00:05:34,980 --> 00:05:37,580 takže to bude tvoj v ukazovateľ. 84 00:05:37,580 --> 00:05:41,780 Aj farebne odlíšené, pretože podľa fread je tiež veľmi podobné fwrite, 85 00:05:41,780 --> 00:05:47,050 okrem chcete, aby sa ubezpečil, že používate správne poradie, 86 00:05:47,050 --> 00:05:51,960 uistite sa, že ste skutočne zápisu a čítania z pravej súboru. 87 00:05:54,910 --> 00:05:58,610 >> Takže, ako pred, či máme na veľkosť prvku, rovnako ako počet prvkov, 88 00:05:58,610 --> 00:06:00,600 potom môžeme hrať tu trochu. 89 00:06:00,600 --> 00:06:06,810 Povedzme, že mám psa, struct, a tak som si prečítať dva psy naraz. 90 00:06:06,810 --> 00:06:12,450 To, čo som mohol urobiť, je povedať, že veľkosť jedného prvku bude veľkosť jedného DOG 91 00:06:12,450 --> 00:06:14,770 a budem skutočne čítať dva z nich. 92 00:06:14,770 --> 00:06:18,290 Prípadne, čo som mohol urobiť, je povedať, že som len tak čítať jeden prvok 93 00:06:18,290 --> 00:06:21,340 a že jedným z prvkov bude veľkosť dvoch psov. 94 00:06:21,340 --> 00:06:24,320 Tak to je podobné, ako môžete trochu pohrať s veľkosťou a počtom 95 00:06:24,320 --> 00:06:28,250 v závislosti na tom, čo je viac intuitívne pre vás. 96 00:06:28,250 --> 00:06:30,810 >> Dobrá. Takže teraz sa dostávame k písaniu súborov. 97 00:06:30,810 --> 00:06:36,880 Ak chcete napísať súbor, prvý argument je vlastne kam čítanie z 98 00:06:36,880 --> 00:06:42,050 Takže to je v podstate dáta, ktoré budete písať do súboru, 99 00:06:42,050 --> 00:06:44,490 ktorý je mimo ukazovateľ na konci. 100 00:06:44,490 --> 00:06:47,670 Takže keď máte čo do činenia s PSet, uistite sa, že sa zmiasť. 101 00:06:47,670 --> 00:06:50,480 Možno majú definícií bok po boku. 102 00:06:50,480 --> 00:06:58,090 Môžete vytiahnuť definície v príručke zadaním muža a potom fwrite, napríklad, 103 00:06:58,090 --> 00:06:59,950 v termináli, alebo sa môžete obrátiť späť k tomuto snímke 104 00:06:59,950 --> 00:07:03,570 a uistite sa, že používate správny. 105 00:07:03,570 --> 00:07:08,700 Takže znova, pre fwrite, keď máte súbor, ktorý chcete zapísať do, 106 00:07:08,700 --> 00:07:14,290 že to bude posledný argument a že to bude ukazovateľ do tohto súboru. 107 00:07:14,290 --> 00:07:18,670 Takže to, ako konáme s písaním snáď niekoľko bajtov v čase, 108 00:07:18,670 --> 00:07:21,820 ale že chcete stačí napísať len v jednom znaku. 109 00:07:21,820 --> 00:07:25,940 Ako uvidíme neskôr v tomto príklade, v bitmapy budeme musieť použiť. 110 00:07:25,940 --> 00:07:32,180 To je, keď môžeme použiť fputc, v podstate len uvedenie jeden znak v čase, chr, 111 00:07:32,180 --> 00:07:37,050 do súboru ukazovateľ, a to je naša sa ukazovateľ tam. 112 00:07:38,700 --> 00:07:41,560 Takže vždy, keď sa snažíme, alebo písať v súbore, 113 00:07:41,560 --> 00:07:44,690 súbor je sledovanie, kde sme. 114 00:07:44,690 --> 00:07:47,810 Takže je to druh kurzora, súbor ukazovateľ polohy. 115 00:07:47,810 --> 00:07:54,330 A tak keď sme písať alebo čítať znova do súboru, 116 00:07:54,330 --> 00:07:56,760 súbor skutočne pamätá, kde je to, 117 00:07:56,760 --> 00:07:59,270 a tak to pokračuje od miesta, kde je kurzor. 118 00:07:59,270 --> 00:08:03,970 To môže byť výhodné, keď chcete, povedzme, prečítajte si v určitom množstve, aby niečo urobiť 119 00:08:03,970 --> 00:08:06,160 a potom si v nasledujúcej výške, 120 00:08:06,160 --> 00:08:10,700 ale niekedy by sme mohli chcieť vrátiť, alebo skutočne začať od určitého referenčnej hodnoty. 121 00:08:10,700 --> 00:08:16,870 Takže funkcia fseek, čo robí, je nám umožňuje pohybovať kurzorom v určitom súbore 122 00:08:16,870 --> 00:08:19,680 určitý počet bajtov. 123 00:08:19,680 --> 00:08:24,260 A potom to, čo musíme urobiť, je určiť, kde referenčná hodnota je. 124 00:08:24,260 --> 00:08:31,520 Takže buď sa pohybuje dopredu alebo dozadu od miesta, kde kurzor je v súčasnej dobe, 125 00:08:31,520 --> 00:08:35,750 alebo sa môže určiť, že by mal len pohybovať od začiatku súboru 126 00:08:35,750 --> 00:08:37,090 alebo od konca súboru. 127 00:08:37,090 --> 00:08:41,230 A tak si môžete prejsť v záporných alebo kladných hodnôt na sumu, 128 00:08:41,230 --> 00:08:44,960 a že sa bude trochu pohybovať kurzorom buď dopredu alebo dozadu. 129 00:08:46,170 --> 00:08:51,920 >> Než sme sa dostali do ďalších psets, akékoľvek otázky týkajúce sa súboru I / O? 130 00:08:53,860 --> 00:08:59,990 Dobre. Ako sme sa dostali do ďalšej príklady, neváhajte ma zastaviť na otázky. 131 00:08:59,990 --> 00:09:06,930 >> Takže v detektívka, ste podal bitmapový súbor podobný tomuto červeným na snímke, 132 00:09:06,930 --> 00:09:14,510 a vyzerá to, že to - banda červených bodiek - a naozaj neviem, čo je napísané. 133 00:09:14,510 --> 00:09:23,310 Ak škúlenie, môžete byť schopní vidieť mierny modrastú farbu vnútri uprostred. 134 00:09:23,310 --> 00:09:26,270 V podstate, že je miesto, kde je uložený text. 135 00:09:26,270 --> 00:09:30,270 Tam bola vražda, čo sa stalo, a my musíme zistiť, kto to urobil. 136 00:09:30,270 --> 00:09:36,760 Aby k tomu, že, musíme trochu previesť tento obraz do čitateľného formátu. 137 00:09:36,760 --> 00:09:42,740 Ak ste sa niekedy stretli tento, niekedy tam bude malé súpravy 138 00:09:42,740 --> 00:09:48,510 kde budete mať lupu s červeným filmom. Každý, kto? Jo. 139 00:09:48,510 --> 00:09:52,770 Takže by ste sa pravou rukou niečo také, mali by ste mať lupu 140 00:09:52,770 --> 00:09:58,130 s červeným filmu nad ním, by ste dať to cez obraz, 141 00:09:58,130 --> 00:10:03,410 a mali by ste byť schopní vidieť správy skryté v ňom. 142 00:10:03,410 --> 00:10:07,080 Nemáme zväčšovacie sklo s červeným filmom, a tak namiesto toho budeme druh vytvoriť vlastné 143 00:10:07,080 --> 00:10:09,060 v tomto PSet. 144 00:10:09,060 --> 00:10:15,760 A tak užívateľ bude vstupné detektívka, potom stopa,. Bmp, 145 00:10:15,760 --> 00:10:18,800 tak to je infile, že je red dot správa, 146 00:10:18,800 --> 00:10:23,550 a potom hovoria verdict.bmp bude náš outfile. 147 00:10:23,550 --> 00:10:27,900 Takže to bude vytvoriť nový bitmapový obraz podobný vodítko jeden 148 00:10:27,900 --> 00:10:32,600 s výnimkou v čitateľnom formáte, kde môžeme vidieť skrytú správu. 149 00:10:32,600 --> 00:10:37,550 >> Vzhľadom k tomu, že budeme rokovať s editáciu a manipuláciu s rastre nejakého druhu, 150 00:10:37,550 --> 00:10:42,400 budeme druhu ponoru v do štruktúry týchto bitmapové súbory. 151 00:10:42,400 --> 00:10:48,130 Išli sme cez tieto trochou v prednáške, ale poďme sa pozrieť do nich niečo viac. 152 00:10:48,130 --> 00:10:51,740 Rastre sú v podstate len usporiadanie bajtov 153 00:10:51,740 --> 00:10:55,790 kde sme určiť, ktorá bytov povedať, čo. 154 00:10:55,790 --> 00:11:00,540 Takže tu je niečo ako mapa bitmapového obrazu 155 00:11:00,540 --> 00:11:08,550 hovorí, že to začína u niektorých hlavičkových súborov, začína nejaké informácie v tam. 156 00:11:08,550 --> 00:11:16,540 Môžete vidieť, že asi na byte čísla 14 je veľkosť uvedená na bitmapového obrazu, 157 00:11:16,540 --> 00:11:18,520 a to pokračuje ďalej. 158 00:11:18,520 --> 00:11:23,810 Ale potom to, čo sme naozaj zaujíma je tu začína okolo bytového číslo 54. 159 00:11:23,810 --> 00:11:26,060 Máme tieto RGB trojčíslie. 160 00:11:26,060 --> 00:11:30,760 Čo to urobí, je obsahujú skutočné pixely, farebné hodnoty. 161 00:11:30,760 --> 00:11:35,950 Všetko vyššie, že v hlavičke je nejaké informácie 162 00:11:35,950 --> 00:11:41,240 zodpovedajúcej veľkosti obrazu, šírkou obrazu, a výšky. 163 00:11:41,240 --> 00:11:44,930 Keď ideme do polstrovaním neskôr, uvidíme, prečo je veľkosť obrazu 164 00:11:44,930 --> 00:11:48,670 sa môže líšiť od šírky alebo výšky. 165 00:11:48,670 --> 00:11:54,240 Takže potom predstavujú tieto - tieto bitmapové obrázky sú sekvencie bajtov - 166 00:11:54,240 --> 00:11:59,370 čo by sme mohli urobiť, je povedať áno, budem si pamätať, že v indexe 14, 167 00:11:59,370 --> 00:12:03,380 že ak je veľkosť, napríklad, ale to, čo budeme robiť, aby to jednoduchšie 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 dve structs vyrobené pre 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, keď sme si do tohto súboru, v predvolenom nastavení to bude ísť v poriadku, 172 00:12:14,840 --> 00:12:22,360 a tak, aby to tiež bude vypĺňať do premenných, ako je biWidth a biSize. 173 00:12:25,270 --> 00:12:31,230 A potom konečne, je každý pixel reprezentovaný tromi bajty. 174 00:12:31,230 --> 00:12:35,500 Prvá z nich je množstvo modrej pixelu, druhý je množstvo zelene, 175 00:12:35,500 --> 00:12:41,120 a konečne, množstvo červenej, kde 0 znamená v podstate žiadne modrá alebo zelená ani žiadny červený 176 00:12:41,120 --> 00:12:43,720 a potom ff je maximálna hodnota. 177 00:12:43,720 --> 00:12:46,800 Jedná sa o hexadecimálne hodnoty. 178 00:12:46,800 --> 00:12:53,870 Takže ak máme FF0000, potom to zodpovedá maximálnej výške modré 179 00:12:53,870 --> 00:12:58,890 a potom už zelené a nie červený, tak potom by to bolo nám Blue Pixel. 180 00:12:58,890 --> 00:13:04,190 Potom ak máme FF je po celej doske, potom to znamená, že máme biely pixel. 181 00:13:04,190 --> 00:13:11,370 To je druh naproti zvyčajne, keď povieme, RGB. Je to vlastne deje BGR. 182 00:13:12,750 --> 00:13:18,990 >> Takže ak sa skutočne pozrieť do príklade bitmapového obrazu - dovoľte mi, aby som vytiahnuť 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 Som priblíženie, a my môžeme vidieť to pixelated. Vyzerá to, že bloky farby. 185 00:13:47,840 --> 00:13:50,110 Máte biele bloky a potom červené bloky. 186 00:13:50,110 --> 00:13:53,700 Ak budete hrať v programe Maľovanie, napríklad, mohol by ste urobiť niečo také 187 00:13:53,700 --> 00:13:58,960 by v podstate len maľovať niektoré štvorca v určitom poradí. 188 00:13:58,960 --> 00:14:08,060 Tak čo to znamená v bitmape je nasledovné. 189 00:14:08,060 --> 00:14:15,710 Tu máme prvý biele pixely, ktoré všetky 6 sú f je, a potom máme červené pixely, 190 00:14:15,710 --> 00:14:19,910 indikovaný 0000FF. 191 00:14:19,910 --> 00:14:27,940 A tak postupnosť bajtov, ktoré máme uvedené, ako bitmapový obraz bude vyzerať. 192 00:14:27,940 --> 00:14:32,230 Takže to, čo som tu urobil je práve napísal všetky tie bajty a potom farbená v červenej 193 00:14:32,230 --> 00:14:37,550 takže môžete trochu vidieť, keď šprtom trochu, ako tento druh označuje smajlíky. 194 00:14:40,180 --> 00:14:46,390 >> Spôsobom, že bitmapový obrázkov práce je, že som si ho asi predstavovali v podstate ako mriežku. 195 00:14:46,390 --> 00:14:54,940 A tak v predvolenom nastavení, každý riadok mriežky musí byť násobkom 4 bytov. 196 00:15:00,520 --> 00:15:07,060 Ak sa pozrieme na bitmapový obraz, budete vyplňovať každej hodnote. 197 00:15:07,060 --> 00:15:17,370 Napríklad, môžete mať červenú tu, zelenú tu, modrá tu, 198 00:15:17,370 --> 00:15:24,950 ale musíte sa uistiť, že obraz je vyplnená násobok štyroch bajtov. 199 00:15:24,950 --> 00:15:32,200 Takže keď chcem svoj obraz na tri bloky široký, potom by som musel dať prázdnu hodnotu 200 00:15:32,200 --> 00:15:35,640 v poslednom, aby bolo násobkom štyroch. 201 00:15:35,640 --> 00:15:39,530 Tak potom by som pridať do niečoho, čo sme volajúceho polstrovanie. 202 00:15:39,530 --> 00:15:43,750 Idem len ukázať, že tam s x. 203 00:15:44,920 --> 00:15:54,160 Teraz hovoria, že chcú obraz, ktorý je 7 pixelov dlho, naprí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šetko sa vyplní farbou. 206 00:16:07,000 --> 00:16:10,620 Spôsobom, že bitmapové obrázky fungovať, je, že musíme 8.. 207 00:16:10,620 --> 00:16:12,460 Práve teraz máme 1, 2, 3, 4, 5, 6, 7. 208 00:16:12,460 --> 00:16:19,360 Potrebujeme 8 priestory pre bitmapového obrazu čítať správne. 209 00:16:19,360 --> 00:16:25,600 Takže to, čo musíme urobiť, je pridať len trochu vypchávky 210 00:16:25,600 --> 00:16:29,430 Uistite sa, že všetky šírky sú jednotné 211 00:16:29,430 --> 00:16:34,260 a že všetky šírky sú násobkom 4.. 212 00:16:42,110 --> 00:16:47,310 A tak som už skôr uviedla, poduška ako X alebo zakrútený linky, 213 00:16:47,310 --> 00:16:53,880 ale v skutočných bitmapových obrázkov je padding indikovaný hexadecimálnom 0. 214 00:16:53,880 --> 00:16:57,340 Tak, že by bol jeden znak, 0. 215 00:16:58,980 --> 00:17:06,329 Čo sa môže hodiť, je xxd príkaz. 216 00:17:06,329 --> 00:17:11,220 Čo to urobí, je v skutočnosti ukazuje, radi podobný tomu, čo som robil predtým, než sa na smajlík 217 00:17:11,220 --> 00:17:15,630 keď som v skutočnosti vytlačí, čo každá farba by pre pixel 218 00:17:15,630 --> 00:17:21,800 a potom farebne, tak pri spustení xxd s nasledujúcimi príkazmi, 219 00:17:21,800 --> 00:17:28,670 potom to bude skutočne vytlačiť, aké farby sú pre tých pixelov. 220 00:17:28,670 --> 00:17:33,810 Čo musíte urobiť, je tu mám označiť, ako-S 54 221 00:17:33,810 --> 00:17:36,530 hovorí, že budem začínať 54. bajtu 222 00:17:36,530 --> 00:17:40,820 pretože pred tým, si spomenúť, či sa pozrieme späť na mapu bitmapy, 223 00:17:40,820 --> 00:17:42,690 to je všetko, informácie v hlavičke a podobné veci. 224 00:17:42,690 --> 00:17:46,280 Ale to, čo sme naozaj záleží, je skutočné obrazové body, ktoré označujú farbu. 225 00:17:46,280 --> 00:17:52,700 Takže tým, že do tej vlajky,-s 54, potom sme schopní vidieť farebné hodnoty. 226 00:17:52,700 --> 00:17:56,020 A nebojte sa o zložité vlajok a podobné veci. 227 00:17:56,020 --> 00:18:05,020 V spec problému nastavené, budete mať pokyny, ako používať xxd na zobrazenie pixelov. 228 00:18:07,070 --> 00:18:15,590 Takže ak uvidíte tu, celkom to vyzerá ako zelené pole, tento malý vec. 229 00:18:15,590 --> 00:18:23,610 Ja som farebne kódované 00ff00 ako v podstate hovorí, žiadnu modrú, veľa zelene, a nie červený. 230 00:18:23,610 --> 00:18:26,370 Tak, že zodpovedá zelené. 231 00:18:26,370 --> 00:18:31,920 Ako vidíte tu, vidíme zelený obdĺžnik. 232 00:18:31,920 --> 00:18:36,660 Tento zelený obdĺžnik je len 3 pixelov široký, takže potom to, čo musíme urobiť, 233 00:18:36,660 --> 00:18:44,350 Uistite sa, že obraz je násobkom 4 široký, je pridať v extra polstrovanie. 234 00:18:44,350 --> 00:18:49,460 A potom sa to, ako vidíte tieto 0s tu. 235 00:18:49,460 --> 00:18:54,510 To bude skutočne výsledok vášho Resize PSet, 236 00:18:54,510 --> 00:19:01,350 v podstate brať malú bitmapu a potom rozšírenie ju 4. 237 00:19:01,350 --> 00:19:09,380 A tak to, čo vidíme, je, že v skutočnosti tento obrázok 12 pixelov široký, ale 12 je násobkom 4, 238 00:19:09,380 --> 00:19:12,940 a tak sme vlastne nevidím žiadny 0s na konci, pretože sme nemusí pridávať žiadne 239 00:19:12,940 --> 00:19:19,070 pretože je to úplne vypolstrovaná. To nemá žiadne väčší priestor. 240 00:19:20,720 --> 00:19:23,470 >> Dobre. Máte otázky k čalúnenie? 241 00:19:25,150 --> 00:19:27,460 Dobre. Cool. 242 00:19:27,460 --> 00:19:32,520 >> Ako som už spomenul skôr, bitmapy sú len sled bajtov. 243 00:19:32,520 --> 00:19:39,170 A tak to, čo máme, je miesto museli sledovať presne, aké množstvo byte 244 00:19:39,170 --> 00:19:47,050 odpovedá na konkrétny prvok, sme vlastne vytvorili struct reprezentovať, že. 245 00:19:47,050 --> 00:19:50,930 Takže to, čo máme, je RGBTRIPLE struct. 246 00:19:50,930 --> 00:19:54,590 Kedykoľvek máte inštanciu RGB trojicu, 247 00:19:54,590 --> 00:20:00,970 pretože to je typ definovať struct, potom môžete pristúpiť k rgbtBlue premenné, 248 00:20:00,970 --> 00:20:09,520 Podobne Zelené a červené premenné, ktoré bude uvádzať, koľko modrá, zelená a červená, 249 00:20:09,520 --> 00:20:11,580 respektíve, máte. 250 00:20:11,580 --> 00:20:16,800 >> Takže ak máme modrú premenná nastavená na hodnotu 0, zelená nastavená na FF, 251 00:20:16,800 --> 00:20:22,060 čo je maximálna hodnota, ktorú môže mať, a potom červená premenná nastavená na hodnotu 0, 252 00:20:22,060 --> 00:20:27,870 potom akú farbu by to najmä RGB triple predstavujú? >> [Študent] Green. 253 00:20:27,870 --> 00:20:29,150 Green. Presne tak. 254 00:20:29,150 --> 00:20:34,480 Je to bude užitočné vedieť, že kedykoľvek budete mať inštanciu RGB trojicu, 255 00:20:34,480 --> 00:20:41,340 môžete skutočne prístup k množstvu farby - modrá, zelená, červená a - zvlášť. 256 00:20:43,350 --> 00:20:54,900 >> Teraz, keď sme hovorili o štruktúre, ktorá, poďme sa pozrieť na BMP súboru. 257 00:20:54,900 --> 00:20:57,870 Jedná sa o structs vyrobené pre vás. 258 00:20:57,870 --> 00:21:01,820 Tu máme BITMAPFILEHEADER struct. 259 00:21:01,820 --> 00:21:07,610 Zaujímavá je veľkosť. 260 00:21:07,610 --> 00:21:12,660 Neskôr, máme informačné hlavičku, ktorá má niekoľko ďalších vecí, ktoré sú pre nás zaujímavý, 261 00:21:12,660 --> 00:21:15,480 totiž veľkosť, šírka a výška. 262 00:21:15,480 --> 00:21:19,170 Ako pôjdeme do neskôr, keď budete čítať do súboru, 263 00:21:19,170 --> 00:21:25,500 automaticky načíta, pretože sme nastavili poradí bude rovnaké. 264 00:21:25,500 --> 00:21:31,990 Takže biSize bude obsahovať správne bajtov, ktoré zodpovedajú skutočnej veľkosti obrázku. 265 00:21:34,700 --> 00:21:40,500 A potom je tu, konečne, ako sme hovorili o tom, máme RGBTRIPLE typedef struct. 266 00:21:40,500 --> 00:21:46,840 Máme rgbtBlue, zelenej a červenej s ním spojené. 267 00:21:48,210 --> 00:21:49,340 >> Great. Dobre. 268 00:21:49,340 --> 00:21:56,360 Teraz, keď sme pochopili rastrové obrázky trochu, pochopiť, že máme hlavičku súboru 269 00:21:56,360 --> 00:22:00,790 a info hlavička s ním spojené, a potom po tom, máme zaujímavé veci, 270 00:22:00,790 --> 00:22:05,110 z farieb, a tieto farby sú zastúpené RGBTRIPLE structs, 271 00:22:05,110 --> 00:22:12,710 a tie zase majú tri hodnoty spojené k modrej, zelenej a červenej. 272 00:22:12,710 --> 00:22:17,270 >> Takže teraz, môžeme trochu premýšľať o tom, Recover trochu. 273 00:22:17,270 --> 00:22:20,130 Prepáčte. Premýšľajte o tom, detektívka. 274 00:22:20,130 --> 00:22:25,750 Keď máme stopa súbor, potom to, čo chceme urobiť, je prečítať v nej pixel po pixeli 275 00:22:25,750 --> 00:22:33,860 a potom nejako zmeniť tie pixely, takže môžeme výstupu do čitateľného formátu. 276 00:22:33,860 --> 00:22:41,020 A tak do výstupu, budeme písať pixel po pixeli do verdict.bmp súboru. 277 00:22:41,020 --> 00:22:45,120 To je trochu moc čo robiť. Uvedomujeme si, že. 278 00:22:45,120 --> 00:22:49,860 Takže to, čo sme urobili je, že sme skutočne poskytované vám copy.c. 279 00:22:49,860 --> 00:22:57,610 Čo copy.c robí, je len urobí presnú kópiu daného rastrového súboru a potom výstup do. 280 00:22:57,610 --> 00:23:01,900 Tak to už otvára súbor pre vás, číta v pixel po pixeli, 281 00:23:01,900 --> 00:23:04,510 a zapíše ho do do výstupného súboru. 282 00:23:04,510 --> 00:23:07,080 >> Poďme sa na to pozrieť. 283 00:23:13,390 --> 00:23:18,290 Toto je zabezpečiť riadne využitie, 284 00:23:18,290 --> 00:23:22,640 ako k súborom tu. 285 00:23:22,640 --> 00:23:29,940 Čo to však je, že nastaví vstupný súbor bude to, čo sme prešiel v v vstupni_soubor tu, 286 00:23:29,940 --> 00:23:34,750 čo je náš druhý argument príkazového riadku. 287 00:23:34,750 --> 00:23:37,640 Kontroly sa uistiť, že môžeme otvoriť súbor. 288 00:23:38,960 --> 00:23:44,860 Skontroluje, či môžeme vytvoriť nový outfile tu. 289 00:23:45,630 --> 00:23:53,270 Tak čo to robí tu, to jednoducho v podstate začne čítať do bitmapy od začiatku. 290 00:23:53,270 --> 00:23:56,700 Začiatok, ako vieme, obsahuje BITMAPFILEHEADER, 291 00:23:56,700 --> 00:24:03,200 a tak tieto sekvencie bitov sa priamo vyplniť BITMAPFILEHEADER. 292 00:24:03,200 --> 00:24:07,940 Takže to, čo tu máme, je hovoriť, že BITMAPFILEHEADER BF - 293 00:24:07,940 --> 00:24:13,150 to je naša nová premenná typu BITMAPFILEHEADER - 294 00:24:13,150 --> 00:24:22,560 budeme dať dovnútra bf, čo čítame z ukazovátko, čo je naša infile. 295 00:24:22,560 --> 00:24:23,970 Ako veľmi sme si? 296 00:24:23,970 --> 00:24:32,160 Čítame v koľko bytov budeme musieť obsahovať celú BITMAPFILEHEADER. 297 00:24:32,160 --> 00:24:34,660 Podobne, to je to, čo robíme pre info hlavičky. 298 00:24:34,660 --> 00:24:39,010 Takže sme ďalej po našom súbore v soubor_se_hrou 299 00:24:39,010 --> 00:24:44,360 a my čítate tieto bity a bajty, a my sme zapojenie je priamo v 300 00:24:44,360 --> 00:24:47,880 do týchto inštancií premenných, ktoré robíme. 301 00:24:49,370 --> 00:24:53,800 Tu sme len uistiť, že je bitmapa rastrový obrázok. 302 00:24:57,670 --> 00:25:01,030 >> Teraz máme outfile, že jo? 303 00:25:01,030 --> 00:25:04,420 Tak, ako to stojí, keď sme ju vytvoriť, je to v podstate prázdne. 304 00:25:04,420 --> 00:25:07,710 Takže máme v podstate vytvoriť nový rastrový obrázok od začiatku. 305 00:25:07,710 --> 00:25:12,280 Čo robíme je, že sme sa uistiť, že sme skopírujte do hlavičky súboru 306 00:25:12,280 --> 00:25:16,850 a info hlavičku rovnako ako vstupni_soubor má. 307 00:25:16,850 --> 00:25:22,850 Čo máme urobiť, je budeme písať - a pamätajte, že bf je premenná 308 00:25:22,850 --> 00:25:29,300 typu BITMAPFILEHEADER, takže to, čo robíme, je, že sme jednoducho použiť tento obsah 309 00:25:29,300 --> 00:25:34,980 zapísať do outfile. 310 00:25:36,550 --> 00:25:38,510 Tu, si, sme hovorili o polstrovaním, 311 00:25:38,510 --> 00:25:47,820 ako je to dôležité, aby sa ubezpečil, že množstvo pixelov, ktoré máme, je násobkom 4. 312 00:25:47,820 --> 00:25:52,790 To je celkom užitočné vzorec pre výpočet, koľko padding máte 313 00:25:52,790 --> 00:25:57,670 vzhľadom šírka súboru. 314 00:25:57,670 --> 00:26:04,120 Chcem ste si uvedomiť, že v copy.c máme vzorec pre výpočet odsadenie. 315 00:26:04,120 --> 00:26:07,970 Dobre? Takže každý si to pamätať. Great. 316 00:26:07,970 --> 00:26:14,050 Tak čo copy.c robí ďalej, je to iteruje cez všetky scanlines. 317 00:26:14,050 --> 00:26:23,730 To prejde riadky a potom uloží každý triple, že to číta 318 00:26:23,730 --> 00:26:26,920 a zapíše ho do outfile. 319 00:26:26,920 --> 00:26:33,120 Takže tu čítate len jeden RGB Triple v čase 320 00:26:33,120 --> 00:26:39,860 a potom uvedenie, že rovnaké Triple do outfile. 321 00:26:41,120 --> 00:26:48,340 V chúlostivé časti je, že výplň nie je RGB triple, 322 00:26:48,340 --> 00:26:55,200 a tak môžeme nielen čítať, že padding množstvo trojíc RGB. 323 00:26:55,200 --> 00:27:01,460 Čo musíme urobiť, je v skutočnosti len presunúť naša súbor ukazovateľ polohy, presunúť naše kurzor, 324 00:27:01,460 --> 00:27:06,840 na druhu preskočiť všetky polstrovanie, takže sme na ďalšom riadku. 325 00:27:06,840 --> 00:27:12,990 A potom, čo to robí, je kópia ukazuje, ako budete chcieť pridať výplň. 326 00:27:12,990 --> 00:27:14,990 Takže sme vypočíta, koľko padding potrebujeme, 327 00:27:14,990 --> 00:27:18,220 tak to znamená, že musíme čalúnenie počet 0s. 328 00:27:18,220 --> 00:27:24,510 Čo to však je pre sláčiky, ktorá kladie čalúnenie počet 0s do nášho outfile. 329 00:27:24,510 --> 00:27:31,170 A potom konečne, zatvorte oba súbory. Zatvorte soubor_se_hrou rovnako ako outfile. 330 00:27:31,170 --> 00:27:34,870 >> Tak to je, ako funguje copy.c, 331 00:27:34,870 --> 00:27:37,430 a že to bude celkom užitočné. 332 00:27:39,720 --> 00:27:43,750 Namiesto toho len skutočne priamo skopírovať a vložiť 333 00:27:43,750 --> 00:27:46,800 alebo len pri pohľade na neho a zadaním, čo chcete, 334 00:27:46,800 --> 00:27:49,440 môžete len chcete vykonať tento príkaz v termináli, 335 00:27:49,440 --> 00:27:54,520 cp copy.c whodunit.c, ktorá vytvorí nový súbor, whodunit.c, 336 00:27:54,520 --> 00:27:58,330 , Ktorý obsahuje presne rovnaký obsah ako kópie robí. 337 00:27:58,330 --> 00:28:03,880 Takže to, čo môžeme urobiť, je použiť ako rámec, na ktorom je možné budovať a upravovať 338 00:28:03,880 --> 00:28:06,900 pre naše detektívka súboru. 339 00:28:08,500 --> 00:28:14,670 >> To sú naše to-dos urobiť pre detektívka, ale to, čo robí copy.c 340 00:28:14,670 --> 00:28:16,730 je vlastne stará o väčšinu z nich pre nás. 341 00:28:16,730 --> 00:28:21,900 Takže všetko, čo treba robiť, je zmeniť pixely podľa potreby 342 00:28:21,900 --> 00:28:25,920 skutočne, aby sa súbor čitateľný. 343 00:28:25,920 --> 00:28:32,960 Si uvedomiť, že pre daný obrazový bod trojitým, tak pre danú premenné typu RGBTRIPLE, 344 00:28:32,960 --> 00:28:35,990 môžete pristupovať k modrej, zelenej a červenej hodnoty. 345 00:28:35,990 --> 00:28:38,670 To bude hodiť, pretože ak k nim máte prístup, 346 00:28:38,670 --> 00:28:41,770 to znamená, že môžete tiež skontrolovať, 347 00:28:41,770 --> 00:28:45,430 a to znamená, že môžete tiež zmeniť. 348 00:28:45,430 --> 00:28:49,430 >> Takže keď sme sa vrátili do nášho červeného napríklad lupy, 349 00:28:49,430 --> 00:28:53,390 v podstate, že sa správal ako akýsi filter pre nás. 350 00:28:53,390 --> 00:28:58,160 Takže to, čo chceme urobiť, je chceme filtrovať všetky trojíc, ktoré sú prichádzať 351 00:28:58,160 --> 00:29:01,240 Existuje niekoľko rôznych spôsobov, ako to urobiť. 352 00:29:01,240 --> 00:29:07,100 V podstate, môžete mať bez ohľadu na typ filtra chcete. 353 00:29:07,100 --> 00:29:09,890 Možno budete chcieť zmeniť všetky červené pixely 354 00:29:09,890 --> 00:29:13,570 alebo možno budete chcieť zmeniť iný farebný pixel na inú farbu. 355 00:29:13,570 --> 00:29:15,400 To záleží na vás. 356 00:29:15,400 --> 00:29:19,580 Nezabudnite, že môžete zistiť, akú farbu pixel je 357 00:29:19,580 --> 00:29:23,000 a potom môžete tiež zmeniť, ako si prechádzaš. 358 00:29:24,410 --> 00:29:26,420 >> Dobre. Tak to je detektívka. 359 00:29:26,420 --> 00:29:32,760 Po spustení detektívka, budete vedieť, kto vinníkom zločinu bol. 360 00:29:32,760 --> 00:29:35,540 >> Teraz sme ísť na Zmeniť veľkosť. 361 00:29:35,540 --> 00:29:37,990 Budeme ešte rokovať s rastrovými obrázkami. 362 00:29:37,990 --> 00:29:40,750 Čo budeme robiť, ich budeme mať vstupné bitmapu 363 00:29:40,750 --> 00:29:45,890 a potom budeme odovzdávať v rade a potom dostanete outfile bitmapu 364 00:29:45,890 --> 00:29:51,380 kde to je v podstate náš infile zmenšený n. 365 00:29:54,670 --> 00:30:01,450 Povedz môj súbor bol len jeden pixel veľký. 366 00:30:01,450 --> 00:30:09,100 Potom, ak má n bol 3, odstupňovaním po 3, potom by som zopakovať, že pixel n koľkokrát, 367 00:30:09,100 --> 00:30:14,410 tak 3 krát, a potom tiež meradlo ho 3 krát rovnako. 368 00:30:14,410 --> 00:30:17,840 Tak vidíte som merítka vertikálne i horizontálne. 369 00:30:17,840 --> 00:30:19,680 >> A potom je tu príklad. 370 00:30:19,680 --> 00:30:27,590 Ak máte n = 2, zistíte, že prvý modrý pixel tam opakovať dvakrát 371 00:30:27,590 --> 00:30:30,930 horizontálne aj vertikálne dvakrát. 372 00:30:30,930 --> 00:30:38,040 A potom, že pokračuje, a tak budete mať priamy meradlo pôvodného obrazu pomocou dvoch. 373 00:30:40,920 --> 00:30:47,600 >> Takže keby sme detail na pseudokód pre to, chceme súbor otvoriť. 374 00:30:47,600 --> 00:30:49,880 A potom s vedomím, že ak sa vrátime sem, 375 00:30:49,880 --> 00:30:54,540 vidíme, že šírka pre outfile bude iný, než je šírka pre vstupni_soubor. 376 00:30:54,540 --> 00:30:56,130 Čo to znamená? 377 00:30:56,130 --> 00:31:01,230 To znamená, že naše informácie v hlavičke sa zmení. 378 00:31:01,230 --> 00:31:03,790 A tak to, čo budeme chcieť urobiť, je aktualizovať záhlavie informácie, 379 00:31:03,790 --> 00:31:11,820 s vedomím, že keď čítame v spisoch, ak pracujete na copy.c rámca, 380 00:31:11,820 --> 00:31:17,570 už máme premennú, ktorá označuje to, čo je veľkosť a podobné veci. 381 00:31:17,570 --> 00:31:24,060 Takže až budete mať to, čo budete chcieť urobiť, je zmeniť tieto konkrétne premenné. 382 00:31:24,060 --> 00:31:29,380 Pamätajte, že ak máte struct, ako pristupovať k premennej v rámci ktorej. 383 00:31:29,380 --> 00:31:32,080 Pomocou operátora bodka, nie? 384 00:31:32,080 --> 00:31:36,420 Takže použitie, viete, že budete musieť zmeniť hlavičku info. 385 00:31:36,480 --> 00:31:41,030 Tak tu je to len zoznam skutočných prvkov, ktoré majú v úmysle sa mení v súbore. 386 00:31:41,030 --> 00:31:45,180 Veľkosť súboru sa bude meniť, obraz, rovnako ako šírku a výšku. 387 00:31:45,180 --> 00:31:50,080 Takže potom ísť späť na mapu bitmapy, 388 00:31:50,080 --> 00:31:57,730 pozrite sa na to, či je to súbor hlavičke alebo info hlavičku, ktorý obsahuje tieto informácie 389 00:31:57,730 --> 00:32:00,920 a potom sa zmeniť podľa potreby. 390 00:32:05,010 --> 00:32:12,470 Opäť platí, že hovoria, cp copy.c resize.c. 391 00:32:12,470 --> 00:32:19,270 To znamená, že resize.c teraz obsahuje všetko, čo je obsiahnuté v kópii 392 00:32:19,270 --> 00:32:24,490 pretože kópie umožňuje nám spôsob čítania v každej scanline pixel po pixeli. 393 00:32:24,490 --> 00:32:29,860 Okrem teraz, namiesto toho, aby len zmenou hodnôt, ako sme to urobili v detektívka, 394 00:32:29,860 --> 00:32:37,980 to, čo chceme urobiť, je chceme písať vo viac pixelov 395 00:32:37,980 --> 00:32:43,580 tak dlho, ako náš n je vyšší ako 1. 396 00:32:43,580 --> 00:32:47,110 >> Potom to, čo chceme urobiť, je chceme natiahnuť ho vodorovne n, 397 00:32:47,110 --> 00:32:50,490 rovnako ako natiahnuť zvisle n. 398 00:32:50,490 --> 00:32:52,710 Ako môžeme urobiť? 399 00:32:52,710 --> 00:32:56,890 Povedzme, že váš n je 2, a máte tento daný soubor_se_hrou. 400 00:32:56,890 --> 00:32:58,730 Váš kurzor sa chystá začať v prvej, 401 00:32:58,730 --> 00:33:03,530 a to, čo chcete robiť, keď n je 2, ak chcete tlačiť v 2 z nich. 402 00:33:03,530 --> 00:33:05,490 Takže tlače v 2 z nich. 403 00:33:05,490 --> 00:33:10,830 Potom kurzor sa bude pohybovať na ďalší pixel, čo je červený, 404 00:33:10,830 --> 00:33:18,400 a bude to vytlačiť 2 týchto červených, pripojí ho na to, čo sa stalo predtým. 405 00:33:18,400 --> 00:33:26,280 Potom kurzor sa presunie na ďalší pixel a kresliť 2 z nich. 406 00:33:26,280 --> 00:33:37,180 Keď sa pozriete späť na copy.c rámca, čo to robí tu 407 00:33:37,180 --> 00:33:42,830 je to vytvorí novú inštanciu RGB trojicu, nové premenné názvom triple. 408 00:33:42,830 --> 00:33:50,500 A tu, keď to číta do nej, číta z infile 1 RGBTRIPLE 409 00:33:50,500 --> 00:33:53,470 a uloží ho v tejto trojité premennej. 410 00:33:53,470 --> 00:33:57,590 Takže potom máte skutočne premennú predstavujúce konkrétne pixel. 411 00:33:57,590 --> 00:34:05,290 Potom, keď píšete, čo budete chcieť urobiť, je uzavrite fwrite vyhlásenie do slučky for 412 00:34:05,290 --> 00:34:11,080 , Ktorý píše do svojho outfile toľkokrát, koľkokrát je potrebné. 413 00:34:17,449 --> 00:34:20,100 To je dosť jednoduché. 414 00:34:20,200 --> 00:34:27,590 Stačí v podstate zopakovať písaní proces n koľkokrát škálovať vodorovne. 415 00:34:27,590 --> 00:34:32,969 >> Ale potom musíme mať na pamäti, že naša padding sa zmení. 416 00:34:47,350 --> 00:34:53,020 Skôr, povedať, že sme mali niečo o dĺžke 3. 417 00:34:53,020 --> 00:35:00,130 Potom by sme len pridať v tom, ako moc padding? Len jeden viac, aby sa to násobkom 4. 418 00:35:00,130 --> 00:35:10,480 Ale povedať, že sme škálovanie tento konkrétny snímok n = 2. 419 00:35:10,480 --> 00:35:16,300 Takže, koľko modrých pixelov budeme mať na konci? Budeme mať 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 nie je násobkom 4. Aký je najbližší násobok 4? To bude mať 8. 422 00:35:26,580 --> 00:35:33,200 Takže sme vlastne bude mať 2 znaky polstrovaním tam. 423 00:35:33,200 --> 00:35:38,720 >> Pamätá si niekto, ak máme vzorec pre výpočet odsadenie 424 00:35:38,720 --> 00:35:41,350 a kde by to mohlo byť? 425 00:35:41,350 --> 00:35:45,160 [Nepočuteľné Študent odpoveď] >> Jo, copy.c. Právo. 426 00:35:45,160 --> 00:35:49,800 Tam je vzorec v copy.c spočítať, koľko padding máte 427 00:35:49,800 --> 00:35:53,810 daný konkrétny šírku bitmapového obrazu. 428 00:35:53,810 --> 00:36:02,950 Takže, čo sa deje, že je užitočné, ak potrebujete pridať v určitom množstve polstrovanie 429 00:36:02,950 --> 00:36:06,160 skutočne zistiť, koľko padding budete musieť pridať. 430 00:36:10,820 --> 00:36:15,850 Ale jedna poznámka, však je, že chcete, aby sa ubezpečil, že používate správnu veľkosť. 431 00:36:15,850 --> 00:36:21,410 Len si dajte pozor, pretože ste v podstate bude zaoberať dvoma bitmapových obrázkov. 432 00:36:21,410 --> 00:36:23,410 Chcete, aby sa ubezpečil, že používate ten správny. 433 00:36:23,410 --> 00:36:26,820 Keď ste výpočtu odsadenie pre outfile, ktorý chcete použiť celú šírku outfile 434 00:36:26,820 --> 00:36:29,860 a nie šírka predchádzajúce. 435 00:36:29,860 --> 00:36:37,240 >> Great. Tento druh sa stará o preťahovanie a celú bitmapový obraz horizontálne. 436 00:36:37,240 --> 00:36:41,290 Ale to, čo chceme urobiť, je skutočne natiahnuť zvisle rovnako. 437 00:36:41,290 --> 00:36:48,760 To bude trochu zložitejšie, pretože keď sme dokončení kopírovania riadok 438 00:36:48,760 --> 00:36:51,580 a písanie, že riadok, naše kurzor bude na konci. 439 00:36:51,580 --> 00:36:56,210 Takže keď sme znovu čítať, potom je to len prečítam do ďalšieho riadku. 440 00:36:56,210 --> 00:37:03,660 Takže to, čo chceme urobiť, je druh nájsť nejaký spôsob, ako kopírovať tie riadky znovu 441 00:37:03,660 --> 00:37:12,500 alebo tak nejako, aby taký riadok a potom prepísať znova. 442 00:37:14,380 --> 00:37:17,940 Ako som tak trochu spomenul, existuje niekoľko rôznych spôsobov, ako to urobiť. 443 00:37:17,940 --> 00:37:23,040 Čo môžete urobiť, je, ako si teraz prechádzaš a čítanie cez konkrétne scanline 444 00:37:23,040 --> 00:37:28,560 a mení ho podľa potreby, potom druh obchodu všetkých týchto bodov v matici. 445 00:37:28,560 --> 00:37:36,350 Neskôr na vás viem, že budete musieť vytlačiť, že pole znovu, 446 00:37:36,350 --> 00:37:39,830 a tak stačí použiť túto maticu urobiť. 447 00:37:39,830 --> 00:37:44,500 Ďalším spôsobom, ako to urobiť, je môžete skopírovať dole o jeden riadok, 448 00:37:44,500 --> 00:37:47,950 pochopiť, že musíte skopírovať to znova, takže vlastne pohybujte kurzorom, 449 00:37:47,950 --> 00:37:50,950 a že sa bude používať metódu fseek. 450 00:37:50,950 --> 00:37:56,410 Dalo by sa pohybovať kurzor celú cestu späť a opakujte proces kopírovania znova. 451 00:37:56,410 --> 00:38:03,960 >> Takže ak naše meradlo číslo n, potom koľkokrát budeme musieť vrátiť 452 00:38:03,960 --> 00:38:10,500 a prepísať riadok? >> [Študent] n - 1. >> Jo, perfektné. n - 1. 453 00:38:10,500 --> 00:38:14,390 Dokázali sme to už raz, takže potom budeme chcieť zopakovať Going Back proces 454 00:38:14,390 --> 00:38:17,460 n - 1 množstvo časov. 455 00:38:22,730 --> 00:38:25,860 Dobre. Tak tu máte resize funkcie. 456 00:38:25,860 --> 00:38:34,360 >> Teraz sa dostaneme k naozaj zábavné časti, môj obľúbený PSet, ktorý je obnoviť. 457 00:38:34,360 --> 00:38:39,580 Miesto bitmapy, tentoraz máme čo do činenia s JPEG. 458 00:38:39,580 --> 00:38:43,370 My vlastne nie, rovnako súbor len pre JPEG, 459 00:38:43,370 --> 00:38:46,600 sme rovnako v podstate surové pamäťové karty formátu. 460 00:38:46,600 --> 00:38:51,790 A tak to obsahuje trochu info a odpadky hodnôt na začiatku, 461 00:38:51,790 --> 00:38:57,240 a potom to začne a má veľa súborov JPEG. 462 00:38:57,240 --> 00:39:03,430 Avšak, to sme odovzdali kartu, kde sme odstránili fotografie; 463 00:39:03,430 --> 00:39:08,300 podstate, sme zabudli, kde sú fotografie umiestnené v karte. 464 00:39:08,300 --> 00:39:12,770 Takže našou úlohou v Recover je prejsť týmto karty formátu 465 00:39:12,770 --> 00:39:16,500 a nájsť tie fotky znovu. 466 00:39:16,500 --> 00:39:23,990 >> Našťastie, štruktúra súborov JPEG a kartotéka je trochu užitočná. 467 00:39:23,990 --> 00:39:28,850 Rozhodne by bolo trochu zložitejšie, keby to nebolo v tomto konkrétnom formáte. 468 00:39:28,850 --> 00:39:40,160 Každý súbor JPEG skutočne začína s dvoma možnými sekvenciami, ktoré sú uvedené vyššie. 469 00:39:40,160 --> 00:39:42,970 V podstate, keď máte nový súbor JPEG, 470 00:39:42,970 --> 00:39:52,720 začína buď sekvencie ffd8 ffe0 alebo druhý, ffd8 ffe1. 471 00:39:52,720 --> 00:39:59,530 Ďalšie užitočné vec je vedieť, je, že JPEG sú uložené súvisle. 472 00:39:59,530 --> 00:40:03,380 Takže vždy, keď jeden súbor JPEG končí, druhý začína. 473 00:40:03,380 --> 00:40:07,070 Takže tam nie je žiadny druh in-medzi hodnotami tam. 474 00:40:07,070 --> 00:40:15,510 Akonáhle narazí na začiatok JPEG, ak ste už čítanie JPEG, 475 00:40:15,510 --> 00:40:21,800 viete, že ste narazila na koniec predchádzajúceho a začiatkom toho budúceho. 476 00:40:21,800 --> 00:40:25,890 >> Ak chcete druhu si to predstaviť, som schému. 477 00:40:25,890 --> 00:40:36,910 Ďalšia vec, o JPEG je, že môžeme čítať v sekvenciách 512 bajtov v čase, 478 00:40:36,910 --> 00:40:39,380 podobne sa začiatkom karty. 479 00:40:39,380 --> 00:40:43,370 Nepotrebujeme byť kontroly jednotlivých bajt, pretože by to za prd. 480 00:40:43,370 --> 00:40:48,200 Takže namiesto toho, čo môžeme urobiť, je v skutočnosti len čítať 512 bajtov v čase, 481 00:40:48,200 --> 00:40:54,700 a potom, namiesto kontroly medzi tie, v týchto malinké plátky, 482 00:40:54,700 --> 00:40:58,640 môžeme len skontrolovať na začiatku 512 bajtov. 483 00:40:58,640 --> 00:41:02,570 V podstate v obrázku, čo vidíte, je na začiatku karty, 484 00:41:02,570 --> 00:41:08,700 budete mať hodnoty, ktoré sú v skutočnosti relevantné pre skutočné JPEG samotných. 485 00:41:08,700 --> 00:41:15,830 Ale potom to, čo mám, je hviezda uviesť jednu z dvoch východiskových sekvencií vo formáte JPEG. 486 00:41:15,830 --> 00:41:19,910 Takže zakaždým, keď uvidíte hviezdu, viete, že máte súbor JPEG. 487 00:41:19,910 --> 00:41:25,030 A potom každý súbor JPEG sa bude nejaký násobok 512 bajtov 488 00:41:25,030 --> 00:41:27,880 ale nie nevyhnutne rovnaký násobok. 489 00:41:27,880 --> 00:41:32,050 Spôsobom, že viete, že ste hit iný formát JPEG je, ak ste hit inú hviezdu, 490 00:41:32,050 --> 00:41:39,090 ďalšie predvolené postupnosť bajtov. 491 00:41:39,090 --> 00:41:43,330 Potom to, čo ste tu, je, že máte červené JPEG pokračujúce kým nenarazíte na hviezdu, 492 00:41:43,330 --> 00:41:45,150 ktorý je označený na novú farbu. 493 00:41:45,150 --> 00:41:48,510 Môžete pokračovať a potom stlačíte inú hviezdu, narazíš ďalšie JPEG, 494 00:41:48,510 --> 00:41:50,590 budete pokračovať celú cestu až do konca. 495 00:41:50,590 --> 00:41:53,180 Ste na poslednom obrázku tu, ružový. 496 00:41:53,180 --> 00:41:58,220 Idete do konca, kým nenarazíte na koniec súborového charakteru. 497 00:41:58,220 --> 00:42:00,820 To bude naozaj užitočné. 498 00:42:00,820 --> 00:42:03,170 >> Niekoľko hlavných takeaways tu: 499 00:42:03,170 --> 00:42:06,670 Karta Súbor nezačína s JPEG, 500 00:42:06,670 --> 00:42:13,350 ale akonáhle JPEG začne, sú všetky JPEGu uložené vedľa seba navzájom. 501 00:42:17,520 --> 00:42:20,420 >> Niektorí pseudokód pre obnovenie. 502 00:42:20,420 --> 00:42:22,570 Po prvé, budeme otvoriť naše karty súbor, 503 00:42:22,570 --> 00:42:27,500 a že to bude pomocou nášho súboru I / O funkcie. 504 00:42:27,500 --> 00:42:32,430 Budeme opakovať nasledujúci postup, kým sme došli na koniec súboru. 505 00:42:32,430 --> 00:42:36,450 Budeme čítať 512 bajtov naraz. 506 00:42:36,450 --> 00:42:39,180 A to, čo som povedal, je tu budeme ukladať do vyrovnávacej pamäte, 507 00:42:39,180 --> 00:42:46,230 tak v podstate drží na tých 512 bajtov, kým nebudeme presne vedieť, čo s nimi majú robiť. 508 00:42:46,230 --> 00:42:50,300 Potom to, čo chceme urobiť, je chceme zistiť, či sme hit hviezdu alebo nie. 509 00:42:50,300 --> 00:42:57,960 Ak sme hit hviezdu, ak sme hit jeden z východiskových sekvencií, 510 00:42:57,960 --> 00:42:59,980 potom vieme, že sme hit nový súbor JPEG. 511 00:42:59,980 --> 00:43:08,860 To, čo budete chcieť urobiť, je budeme chcieť vytvoriť nový súbor v našom pset4 adresári 512 00:43:08,860 --> 00:43:14,480 pokračovať v tvorbe tohto súboru. 513 00:43:14,480 --> 00:43:18,220 Ale tiež, keď sme už urobili JPEG skôr, 514 00:43:18,220 --> 00:43:25,620 potom chceme ukončiť tento súbor a zatlačte ho do pset4 zložky, 515 00:43:25,620 --> 00:43:29,780 kde budeme mať tento súbor uložiť, pretože ak nebudeme špecifikovať, že sme skončil tento súbor JPEG, 516 00:43:29,780 --> 00:43:37,290 potom budeme mať de facto neurčitý čiastku. Tieto JPEG nikdy neskončí. 517 00:43:37,290 --> 00:43:40,840 Takže chceme, aby sa ubezpečil, že keď sme čítanie do súboru JPEG a písomne, 518 00:43:40,840 --> 00:43:46,590 Ak chceme výslovne uzavrieť, že pre otvorenie ďalšej. 519 00:43:46,590 --> 00:43:48,430 Budeme chcieť, aby skontrolovať niekoľko vecí. 520 00:43:48,430 --> 00:43:52,880 Chceme zistiť, či sme na začiatku nového formátu JPEG s našej pamäti 521 00:43:52,880 --> 00:43:56,780 a tiež ak sme už našli JPEG do 522 00:43:56,780 --> 00:44:03,930 preto, že sa bude meniť proces mierne. 523 00:44:03,930 --> 00:44:07,880 Takže potom, čo ste prejsť celú cestu a narazí na koniec súboru, 524 00:44:07,880 --> 00:44:11,570 potom to, čo budete chcieť urobiť, je, že budete chcieť uzavrieť všetky súbory, ktoré sú v súčasnej dobe otvoriť. 525 00:44:11,570 --> 00:44:14,100 To bude pravdepodobne posledný JPEG súbor, ktorý máte, 526 00:44:14,100 --> 00:44:18,930 rovnako ako karty súbor, ktorý ste sa zaoberáme. 527 00:44:21,940 --> 00:44:28,670 >> Posledný prekážkou, ktorá sa musíme vysporiadať, je, ako vlastne urobiť súboru JPEG 528 00:44:28,670 --> 00:44:31,950 a ako sa vlastne tlačiť do priečinka. 529 00:44:33,650 --> 00:44:39,850 Pset vyžaduje, aby každá JPEG že nájsť byť v nasledujúcom formáte, 530 00:44:39,850 --> 00:44:43,990 kde máte číslo. jpg. 531 00:44:43,990 --> 00:44:50,750 Číslo, aj keď je to 0, hovoríme, že 000.jpg. 532 00:44:50,750 --> 00:44:55,730 Kedykoľvek nájdete JPEG v programe, 533 00:44:55,730 --> 00:44:58,040 budete chcieť pomenovať ju v poradí, že je to bolo. 534 00:44:58,040 --> 00:44:59,700 Čo to znamená? 535 00:44:59,700 --> 00:45:03,530 Musíme druhu sledovať, koľko sme našli 536 00:45:03,530 --> 00:45:08,680 a čo číslo každého JPEG by mal byť. 537 00:45:08,680 --> 00:45:13,800 Tu budeme využiť sprintf funkcie. 538 00:45:13,800 --> 00:45:17,480 Podobne ako printf, ktorý len tak výtlačkov hodnota von do terminálu, 539 00:45:17,480 --> 00:45:23,910 sprintf vytlačí súbor von do priečinka. 540 00:45:23,910 --> 00:45:30,870 A tak, čo to bude robiť, či som mal sprintf, titul, a potom retazec, 541 00:45:30,870 --> 00:45:36,660 to by vytlačiť 2.jpg. 542 00:45:36,660 --> 00:45:41,020 Za predpokladu, že som zavrel moje súbory správne, 543 00:45:41,020 --> 00:45:47,210 ktoré bude obsahovať súbor, ktorý som bol pri zápise. 544 00:45:47,210 --> 00:45:50,320 Ale jedna vec je, že kód, ktorý mám tu 545 00:45:50,320 --> 00:45:53,360 nie je úplne uspokojiť čo Pset vyžaduje. 546 00:45:53,360 --> 00:46:02,410 The Pset vyžaduje, aby druhý JPEG súbor by mal byť menovaný 002 namiesto toho len 2. 547 00:46:02,410 --> 00:46:09,160 Takže, keď vytlačiť názov, potom možno budete chcieť zmeniť zástupný symbol mierne. 548 00:46:09,160 --> 00:46:18,140 >> Pamätá si niekto, ako sme umožňujú prebytkov medzier, keď sme vytlačiť niečo? 549 00:46:18,140 --> 00:46:22,530 Jo. >> [Študent] Dal si 3 medzi znakom percenta a 2. >> Jo, perfektné. 550 00:46:22,530 --> 00:46:25,610 Budete dať 3 v tomto prípade, pretože chceme, aby priestor pre 3. 551 00:46:25,610 --> 00:46:32,590 % 3d by pravdepodobne vám 002.jpg miesto 2. 552 00:46:32,590 --> 00:46:40,120 Prvý argument do funkcie sprintf je vlastne char pole, 553 00:46:40,120 --> 00:46:42,520 ktoré sme predtým poznali ako reťazce. 554 00:46:42,520 --> 00:46:50,700 Tí vôle, trochu viac ako dočasné úložisko, stačí uložiť výsledný reťazec. 555 00:46:50,700 --> 00:46:54,950 Budete naozaj bude zaoberať, ale je potrebné ho zahrnúť. 556 00:46:54,950 --> 00:47:00,710 >> S vedomím, že každý názov súboru má číslo, ktoré trvá až tri znaky, 557 00:47:00,710 --> 00:47:06,770 a potom. jpg, by ako dlho to pole bude? 558 00:47:09,070 --> 00:47:14,310 Vyhodiť číslo. Koľko znakov v nadpise, v názve? 559 00:47:18,090 --> 00:47:26,320 Takže tam je 3 hashtags, obdobie, jpg. >> [Študent] 7. 7 >>. Nie tak celkom. 560 00:47:26,320 --> 00:47:32,000 Budeme chcieť 8, pretože chceme, aby bolo možné null zakončenie rovnako. 561 00:47:45,340 --> 00:47:49,730 >> Konečne, len vytiahnuť proces, ktorý budete robiť pre obnovenie, 562 00:47:49,730 --> 00:47:55,420 máte nejaké počiatočné informácie. 563 00:47:55,420 --> 00:48:02,460 Môžete pokračovať, kým nenájdete začiatok súboru JPEG, 564 00:48:02,460 --> 00:48:07,900 a že môže byť buď jeden z dvoch východiskových sekvencií. 565 00:48:07,900 --> 00:48:12,510 Stále na čítanie. Každý lomítko tu predstavuje 512 bajtov. 566 00:48:12,510 --> 00:48:22,630 Nechajte si na čítanie, majte na čítanie, kým sa stretnete s inou štartové poradie. 567 00:48:22,630 --> 00:48:29,790 Akonáhle budete mať to, že ste chcete ukončiť aktuálnu JPEG - v tomto prípade, je to červené, 568 00:48:29,790 --> 00:48:31,030 takže chcete ukončiť to. 569 00:48:31,030 --> 00:48:35,540 Ak chcete sprintf názov, ktorý do vášho pset4 zložky, 570 00:48:35,540 --> 00:48:41,580 potom chcete otvoriť novú JPEG a potom sa držať na čítanie 571 00:48:41,580 --> 00:48:46,370 kým sa stretnete s ďalšou. 572 00:48:46,370 --> 00:48:49,040 Majte na čítanie, majte na čítanie, 573 00:48:49,040 --> 00:48:56,290 a potom konečne, nakoniec, budete k dosiahnutiu konca súboru, 574 00:48:56,290 --> 00:49:00,360 a tak sa budete chcieť uzavrieť posledný JPEG, že ste pracoval s, 575 00:49:00,360 --> 00:49:08,380 sprintf, že do pset4 zložky, a potom sa pozrite na všetky obrázky, ktoré ste dostali. 576 00:49:08,380 --> 00:49:12,050 Tieto fotografie sú vlastne obrazy CS50 zamestnancov, 577 00:49:12,050 --> 00:49:16,430 a tak to je miesto, kde bonus zábavné časť PSet príde 578 00:49:16,430 --> 00:49:26,310 je to, že ste v súťaži vo svojich oddieloch nájsť TFS v obrazoch 579 00:49:26,310 --> 00:49:34,610 a fotiť sa s nimi dokázať, že ste urobili PSet 580 00:49:34,610 --> 00:49:37,030 a tak môžete vidieť, ktoré zamestnanci sú na obrázkoch. 581 00:49:37,030 --> 00:49:41,510 Takže potom si fotiť so zamestnancami. Niekedy budete musieť naháňať je. 582 00:49:41,510 --> 00:49:44,680 Pravdepodobne niektorí z nich sa pokúsi utiecť od teba. 583 00:49:44,680 --> 00:49:47,320 Môžete zhotovovať snímky s nimi. 584 00:49:47,320 --> 00:49:51,190 To prebieha. Nie je to z dôvodu, kedy Pset splatná. 585 00:49:51,190 --> 00:49:53,340 Termín bude oznámený v špec. 586 00:49:53,340 --> 00:49:58,060 Potom spoločne s vašou sekcie, podľa toho, čo oddiel sa najviac fotografie 587 00:49:58,060 --> 00:50:04,430 s najvyšším počtom zamestnancov vyhrá docela úžasné cenu. 588 00:50:04,430 --> 00:50:08,890 To je druh motivácie, aby si vaše pset4 skončil tak rýchlo, ako je to možné 589 00:50:08,890 --> 00:50:10,820 pretože potom sa môžete pustiť do práce 590 00:50:10,820 --> 00:50:14,570 stopovať všetkých rôznych CS50 zamestnancov. 591 00:50:14,570 --> 00:50:17,500 To nie je povinné, aj keď, takže akonáhle sa dostanete na obrázky, 592 00:50:17,500 --> 00:50:20,310 potom ste hotoví s pset4. 593 00:50:20,310 --> 00:50:23,970 >> A ja som skončil s Walkthrough 4, takže ďakujem všetkým za účasť. 594 00:50:23,970 --> 00:50:29,330 Veľa šťastia s Forenzná. [Potlesk] 595 00:50:29,330 --> 00:50:31,000 [CS50.TV]