1 00:00:00,000 --> 00:00:02,700 [Powered by Google Translate] [Walkthrough - Problem Set 4] 2 00:00:02,700 --> 00:00:05,000 [Zamyla Chan - Sveučilište Harvard] 3 00:00:05,000 --> 00:00:07,340 [Ovo je CS50. - CS50.TV] 4 00:00:08,210 --> 00:00:11,670 U redu. Pozdrav, svima, i dobrodošli na Walkthrough 4. 5 00:00:11,670 --> 00:00:14,270 >> Danas naš pset je forenzika. 6 00:00:14,270 --> 00:00:18,080 Forenzika je stvarno zabavno pset koji uključuje bave bitmap datoteke 7 00:00:18,080 --> 00:00:21,550 otkriti tko je počinio zločin. 8 00:00:21,550 --> 00:00:24,200 Onda ćemo promijeniti veličinu neke bitmap datoteke, 9 00:00:24,200 --> 00:00:27,780 onda mi također idemo baviti stvarno zabavan dio naziva Obnova, 10 00:00:27,780 --> 00:00:31,160 u kojem smo u osnovi se predao memorijsku karticu 11 00:00:31,160 --> 00:00:34,350 u kojima je netko slučajno izbrisao sve svoje datoteke, 12 00:00:34,350 --> 00:00:38,860 i mi smo pitali da se oporavim one datoteke. 13 00:00:38,860 --> 00:00:42,910 >> Ali prvo, prije nego što smo dobili u pset, ja stvarno samo želim čestitati svima. 14 00:00:42,910 --> 00:00:45,230 Mi smo o tome na sredini ovog tečaja. 15 00:00:45,230 --> 00:00:50,070 Kviz 0 je iza nas, a mi smo na pset4, tako da u suštini, mi smo na pola puta. 16 00:00:50,070 --> 00:00:55,490 Došli smo dug put, ako se osvrnem na svoje psets, pset0 i pset1, 17 00:00:55,490 --> 00:00:57,300 tako da se o tome čestitam, 18 00:00:57,300 --> 00:01:00,760 i da ćemo dobiti u neke stvarno zabavan stvari. 19 00:01:00,760 --> 00:01:07,070 >> Tako je naša kutija za ovaj pset, opet, umjesto trčanje sudo yum-y ažuriranje, 20 00:01:07,070 --> 00:01:13,890 mi smo u stanju izvoditi samo update50 ako ste na verziji 17,3 i iznad od aparata. 21 00:01:13,890 --> 00:01:17,380 Dakle, budite sigurni da pokrenete update50 - to je puno lakše, nekoliko manje znakova - 22 00:01:17,380 --> 00:01:20,640 kako bi bili sigurni da ste na najnoviju verziju uređaja. 23 00:01:20,640 --> 00:01:25,410 Posebno je važno da update50 kada smo počeli koristiti CS50 provjeru. 24 00:01:25,410 --> 00:01:28,700 Tako bi bili sigurni da ćete to učiniti. 25 00:01:28,700 --> 00:01:30,760 >> Za sve dijelove za ovaj pset, 26 00:01:30,760 --> 00:01:34,350 idemo se bave datoteka ulaza i izlaza, podnijeti I / O. 27 00:01:34,350 --> 00:01:38,140 Mi ćemo se ide preko puno programa koji se bave polja 28 00:01:38,140 --> 00:01:40,350 ukazujući na datoteke i stvari kao što je to, 29 00:01:40,350 --> 00:01:43,050 pa želimo biti sigurni da smo stvarno upoznati 30 00:01:43,050 --> 00:01:47,990 bave kako ulaz i izlaz u datotekama. 31 00:01:47,990 --> 00:01:52,080 >> U distribuciji koda za ovaj pset je datoteka zove copy.c, 32 00:01:52,080 --> 00:01:55,280 i to je ono što ćemo naći će se biti jako korisno za nas 33 00:01:55,280 --> 00:02:00,340 jer ćemo završiti zapravo kopiranje copy.c datoteku 34 00:02:00,340 --> 00:02:05,350 i to samo mijenjajući nešto biti u mogućnosti kako bi se postigla prvi dva dijela problema setu. 35 00:02:05,350 --> 00:02:09,030 >> I tako onda kao što sam spomenuo prije, mi smo se bave bitmape kao i JPEG. 36 00:02:09,030 --> 00:02:13,170 Pa stvarno razumijevanje strukture kako ta slika se organiziraju, 37 00:02:13,170 --> 00:02:16,170 kako smo stvarno može prevesti 0s i 1s u tvorevina 38 00:02:16,170 --> 00:02:19,040 i stvari koje mi zapravo može razumjeti i interpretirati i urediti, 39 00:02:19,040 --> 00:02:21,000 da će biti jako važno, 40 00:02:21,000 --> 00:02:25,970 tako ide u JPEG i bitmap datoteke i razumijevanje strukture onih. 41 00:02:25,970 --> 00:02:30,780 >> Pset4, kao i obično, počinje s dijela pitanja. 42 00:02:30,780 --> 00:02:36,600 Oni će se baviti datoteku I / O i dobili ste navikli na to. 43 00:02:36,600 --> 00:02:42,520 Tada dio 1 je detektivski roman, u kojem si dao bitmap datoteku 44 00:02:42,520 --> 00:02:45,630 da izgleda vrsta kao crvene točkice po cijelom tijelu. 45 00:02:45,630 --> 00:02:52,180 I onda u osnovi ono što ćemo učiniti je iskoristiti ovu datoteku i samo ga urediti blago 46 00:02:52,180 --> 00:02:54,010 u verziji da možemo čitati. 47 00:02:54,010 --> 00:02:56,000 U suštini, kad smo završili, imat ćemo istu datoteku, 48 00:02:56,000 --> 00:03:02,630 osim da ćemo biti u mogućnosti vidjeti skrivene poruke skrivene sve one crvene točkice. 49 00:03:02,630 --> 00:03:07,310 Zatim Resize je program koji, s obzirom na datoteku 50 00:03:07,310 --> 00:03:11,490 i onda dati ime datoteke koja izlazi i onda dati broj, kao i, 51 00:03:11,490 --> 00:03:16,850 zapravo će veličinu bitmap da taj integer vrijednost. 52 00:03:16,850 --> 00:03:19,240 Zatim, na kraju, imamo oporaviti pset. 53 00:03:19,240 --> 00:03:24,160 Mi smo dati memorijsku karticu, a zatim su se oporaviti sve fotografije 54 00:03:24,160 --> 00:03:25,920 koji su slučajno izbrisani, 55 00:03:25,920 --> 00:03:31,420 ali, kao što ćemo naučiti, zapravo ne briše i ukloniti iz datoteke; 56 00:03:31,420 --> 00:03:38,470 samo mi nekako izgubili gdje su u spisu, ali idemo da se oporavi da. 57 00:03:38,470 --> 00:03:44,950 >> Izvrsno. Tako će se u datoteci / I konkretno, to su cijeli popis funkcija koje ćete koristiti. 58 00:03:44,950 --> 00:03:49,840 Već ste vidjeli malo osnove fopen, fread i fwrite, 59 00:03:49,840 --> 00:03:54,350 ali ćemo gledati dalje u nekom datoteku I / O funkcije kao što su fputc, 60 00:03:54,350 --> 00:03:56,930 u kojem ste samo napisati jedan lik u isto vrijeme, 61 00:03:56,930 --> 00:04:02,000 da fseek, gdje ste vrsta premjestiti pokazivač datoteke poziciji naprijed i nazad, 62 00:04:02,000 --> 00:04:05,770 i onda neki drugi. Ali mi ćemo proći u malo kasnije tijekom pset. 63 00:04:08,050 --> 00:04:13,100 >> Tako je prvi, samo da se u datoteci / I prije nego što idemo u pset, 64 00:04:13,100 --> 00:04:19,860 otvoriti datoteku, na primjer, ono što morate učiniti je zapravo postaviti pokazivač na tu datoteku. 65 00:04:19,860 --> 00:04:22,710 Dakle, imamo pokazivač FILE *. 66 00:04:22,710 --> 00:04:27,140 U ovom slučaju, zovem ga u pokazivač jer to će biti moj INFILE. 67 00:04:27,140 --> 00:04:33,340 I tako ću koristiti funkcije fopen i zatim naziv datoteke 68 00:04:33,340 --> 00:04:36,360 i onda je način na koji ću se bave datoteku. 69 00:04:36,360 --> 00:04:42,080 Dakle, tu je "r" u ovom slučaju za čitanje, "w" za pisanje, a zatim "" za dodavanjem. 70 00:04:42,080 --> 00:04:44,270 Na primjer, kada ste se bave s INFILE 71 00:04:44,270 --> 00:04:47,310 a sve što želite učiniti je čitati bitova i bajtova pohranjene tamo, 72 00:04:47,310 --> 00:04:50,420 onda ste vjerojatno idući u želite koristiti "R" kao svoj način. 73 00:04:50,420 --> 00:04:54,520 Kada želite da se zapravo pisati, vrsta napraviti novu datoteku, 74 00:04:54,520 --> 00:04:57,220 onda ono što ćemo napraviti je da ćemo otvoriti novu datoteku 75 00:04:57,220 --> 00:05:02,410 i koristiti "W" mod za pisanje. 76 00:05:02,410 --> 00:05:07,540 >> Dakle, kada ste zapravo čitanje u datotekama, struktura je kako slijedi. 77 00:05:07,540 --> 00:05:14,930 Prvo su pokazivač na struct koji će sadržavati bajtova da ste čitanja. 78 00:05:14,930 --> 00:05:19,830 Tako da će to biti kraj lokacija bajtova da ste čitanja. 79 00:05:19,830 --> 00:05:23,360 Tada ćemo ukazati na veličinu, sviđa osnovi koliko bajtova 80 00:05:23,360 --> 00:05:30,100 vaš program mora pročitati u spisu, veličina osnovi jedan element je, 81 00:05:30,100 --> 00:05:32,620 i onda ćeš odrediti koliko elementi želite pročitati. 82 00:05:32,620 --> 00:05:34,980 I onda na kraju, morate znati gdje ste čitajući iz, 83 00:05:34,980 --> 00:05:37,580 tako da će to biti vaš u pokazivač. 84 00:05:37,580 --> 00:05:41,780 Ja bojama ove jer fread je također vrlo sličan fwrite, 85 00:05:41,780 --> 00:05:47,050 osim želite da biste bili sigurni da koristite pravi poredak, 86 00:05:47,050 --> 00:05:51,960 pobrinite se da ste zapravo pisanja ili čitanja iz desnog datoteku. 87 00:05:54,910 --> 00:05:58,610 >> Dakle, kao i prije, ako imamo veličinu elementa, kao i broj elemenata, 88 00:05:58,610 --> 00:06:00,600 onda možemo igrati ovdje malo. 89 00:06:00,600 --> 00:06:06,810 Recimo ja imam psa struct i tako onda želim da pročitate dva psa u isto vrijeme. 90 00:06:06,810 --> 00:06:12,450 Što sam mogao učiniti je reći je veličina jednog elementa će biti veličine jednog psa 91 00:06:12,450 --> 00:06:14,770 a ja ću da se zapravo čitanje dvije od njih. 92 00:06:14,770 --> 00:06:18,290 Alternativno, ono što sam mogao učiniti je reći da sam samo ću pročitati jedan element 93 00:06:18,290 --> 00:06:21,340 i da je jedan element će biti veličine dva psa. 94 00:06:21,340 --> 00:06:24,320 Tako da je analogno tome možete vrsta poigrati s veličinom i brojem 95 00:06:24,320 --> 00:06:28,250 ovisno o tome što je više intuitivan za vas. 96 00:06:28,250 --> 00:06:30,810 >> U redu. Dakle, sada smo dobili na pisanje datoteka. 97 00:06:30,810 --> 00:06:36,880 Kada želite napisati datoteku, prvi argument je zapravo gdje ste čitajući iz. 98 00:06:36,880 --> 00:06:42,050 Tako da je u osnovi podataka koje ćete pisati u datoteku, 99 00:06:42,050 --> 00:06:44,490 koji je izvan pokazivač na kraju. 100 00:06:44,490 --> 00:06:47,670 Dakle, kada ste se bave s pset, pobrinite se da ne zbune. 101 00:06:47,670 --> 00:06:50,480 Možda imaju definicije rame uz rame. 102 00:06:50,480 --> 00:06:58,090 Možete povući definicije u priručniku upisivanjem čovjeka i onda fwrite, na primjer, 103 00:06:58,090 --> 00:06:59,950 u terminalu, ili možete uputiti natrag na ovaj slajd 104 00:06:59,950 --> 00:07:03,570 i pobrinite se da koristite pravi jedan. 105 00:07:03,570 --> 00:07:08,700 Pa opet, za fwrite, kada imate datoteku koju želite pisati u, 106 00:07:08,700 --> 00:07:14,290 to će biti posljednji argument i da će biti pokazivač na tu datoteku. 107 00:07:14,290 --> 00:07:18,670 Dakle to je kako se nositi s pisanjem možda nekoliko bajtova u isto vrijeme, 108 00:07:18,670 --> 00:07:21,820 ali recimo da želite samo napisati u samo jednom karaktera. 109 00:07:21,820 --> 00:07:25,940 Kao što ćemo kasnije vidjeti, u ovom primjeru, u bitmape ćemo morati koristiti. 110 00:07:25,940 --> 00:07:32,180 To je kada možemo koristiti fputc, bitno samo stavljajući jedan lik u isto vrijeme, Chr, 111 00:07:32,180 --> 00:07:37,050 u file pointer, i to je naš iz pokazivač tamo. 112 00:07:38,700 --> 00:07:41,560 Pa onda kad smo tražiti ili pisati u datoteku, 113 00:07:41,560 --> 00:07:44,690 datoteka praćenje gdje smo. 114 00:07:44,690 --> 00:07:47,810 Dakle, to je neka vrsta pokazivača, indikator datoteka položaj. 115 00:07:47,810 --> 00:07:54,330 I tako svaki put kad smo napisati ili pročitati opet u datoteku, 116 00:07:54,330 --> 00:07:56,760 file zapravo sjeća gdje je, 117 00:07:56,760 --> 00:07:59,270 i tako se nastavlja od mjesta gdje je kursor. 118 00:07:59,270 --> 00:08:03,970 To može biti korisno kada želite, recimo, pročitajte u određenom iznosu nešto učiniti 119 00:08:03,970 --> 00:08:06,160 a zatim pročitati u sljedećem iznosu, 120 00:08:06,160 --> 00:08:10,700 ali ponekad mi htjeti vratiti ili zapravo početi od određene referentne vrijednosti. 121 00:08:10,700 --> 00:08:16,870 Pa onda fseek funkcija, što je to ipak nam omogućuje pomicanje kursora u određenoj datoteci 122 00:08:16,870 --> 00:08:19,680 određeni broj bajtova. 123 00:08:19,680 --> 00:08:24,260 A onda ono što mi moramo napraviti je odrediti gdje je referentna vrijednost. 124 00:08:24,260 --> 00:08:31,520 Dakle, ili se kreće naprijed ili nazad odakle kursor trenutno je, 125 00:08:31,520 --> 00:08:35,750 ili možemo navesti da je to samo treba premjestiti u od početka datoteke 126 00:08:35,750 --> 00:08:37,090 ili od kraja datoteke. 127 00:08:37,090 --> 00:08:41,230 I tako možete proći s negativnim ili pozitivnim vrijednostima na iznos, 128 00:08:41,230 --> 00:08:44,960 i da će vrsta pomicanje kursora ili naprijed ili natrag. 129 00:08:46,170 --> 00:08:51,920 >> Prije nego što smo dobili u drugim psets, bilo kakva pitanja o datoteci I / O? 130 00:08:53,860 --> 00:08:59,990 Ok. Kao što smo dobili u više primjera, slobodno me zaustaviti na pitanja. 131 00:08:59,990 --> 00:09:06,930 >> Tako je u detektivski roman, ti si predao bitmap datoteku sličan ovom crvenom jedan na slajdu, 132 00:09:06,930 --> 00:09:14,510 i to izgleda ovako - hrpa crvene točkice - i stvarno ne znam što je napisano. 133 00:09:14,510 --> 00:09:23,310 Ako škiljenje, možda ćete biti u mogućnosti vidjeti blagi plavkasto boje unutar sredini. 134 00:09:23,310 --> 00:09:26,270 U osnovi, to je gdje je tekst pohranjen. 135 00:09:26,270 --> 00:09:30,270 Tu je ubojstvo koje se dogodilo, a mi moramo saznati tko je to učinio. 136 00:09:30,270 --> 00:09:36,760 Da bi to postigli, moramo nekako pretvoriti ovu sliku u čitljivom obliku. 137 00:09:36,760 --> 00:09:42,740 Ako vi ikada susreo ovo, ponekad bi bilo malo setove 138 00:09:42,740 --> 00:09:48,510 gdje bi povećalo sa crvenim filma. Svatko? Da. 139 00:09:48,510 --> 00:09:52,770 Tako da će biti rukom nešto kao što je ovaj, te će imati povećalo 140 00:09:52,770 --> 00:09:58,130 s crvenom filma preko njega, što bi ga stavio preko slike, 141 00:09:58,130 --> 00:10:03,410 i ti bi bio u mogućnosti vidjeti poruke skrivene u njemu. 142 00:10:03,410 --> 00:10:07,080 Mi nemamo povećalo s crvenim filma, pa umjesto da ćemo nekako stvoriti naš vlastiti 143 00:10:07,080 --> 00:10:09,060 u ovom pset. 144 00:10:09,060 --> 00:10:15,760 I tako je korisnik će ulaznog detektivski roman, tada trag,. Bmp, 145 00:10:15,760 --> 00:10:18,800 tako da je INFILE, da je crvena točka poruka, 146 00:10:18,800 --> 00:10:23,550 i onda oni govore verdict.bmp će biti naša outfile. 147 00:10:23,550 --> 00:10:27,900 Dakle, to će stvoriti novu bitmap sliku sličan trag jednom 148 00:10:27,900 --> 00:10:32,600 osim u čitljivom obliku u kojem možemo vidjeti skrivenu poruku. 149 00:10:32,600 --> 00:10:37,550 >> Budući da ćemo se baviti uređivanjem i manipulira bitmape neke vrste, 150 00:10:37,550 --> 00:10:42,400 idemo vrste ronjenja u u strukturi tih bitmap datoteke. 151 00:10:42,400 --> 00:10:48,130 Išli smo preko tih malo u predavanju, ali pogledajmo u njih nešto više. 152 00:10:48,130 --> 00:10:51,740 Bitmape su u suštini samo raspored bajtova 153 00:10:51,740 --> 00:10:55,790 gdje smo naveli koji bajtova znači ono. 154 00:10:55,790 --> 00:11:00,540 Dakle, ovdje je vrsta kao što su karte za bitmap slike 155 00:11:00,540 --> 00:11:08,550 rekavši da se počne s nekim header datoteka, počinje s nekim informacijama u tamo. 156 00:11:08,550 --> 00:11:16,540 Možete vidjeti da je oko byte broj 14 veličina je naznačeno u bitmap slike, 157 00:11:16,540 --> 00:11:18,520 i nastavlja se. 158 00:11:18,520 --> 00:11:23,810 No, onda ono što mi stvarno zanima ovdje počinje oko byte broj 54. 159 00:11:23,810 --> 00:11:26,060 Imamo ove RGB trojke. 160 00:11:26,060 --> 00:11:30,760 Što to će učiniti je sadrže stvarne piksela, boja vrijednosti. 161 00:11:30,760 --> 00:11:35,950 Sve iznad toga u zaglavlju je neke informacije 162 00:11:35,950 --> 00:11:41,240 odgovara veličini slike, širine slike, a visina. 163 00:11:41,240 --> 00:11:44,930 Kad idemo u padding kasnije, vidjet ćemo zašto je veličina slike 164 00:11:44,930 --> 00:11:48,670 može biti drugačiji od širine ili visine. 165 00:11:48,670 --> 00:11:54,240 Pa onda za zastupanje te - ove bitmap slike su nizovi bitova - 166 00:11:54,240 --> 00:11:59,370 ono što smo mogli učiniti je reći ok, ja ću se sjetiti da je na indeksu 14, 167 00:11:59,370 --> 00:12:03,380 to je gdje je veličina, na primjer, ali umjesto što ćemo učiniti kako bi to lakše 168 00:12:03,380 --> 00:12:06,020 je to utjelovljuje u struct. 169 00:12:06,020 --> 00:12:08,880 I tako imamo dva tvorevina napravio za nas, BITMAPFILEHEADER 170 00:12:08,880 --> 00:12:10,440 i BITMAPINFOHEADER, 171 00:12:10,440 --> 00:12:14,840 i tako svaki put kad čitamo u toj datoteci, po defaultu to će biti idući u redu, 172 00:12:14,840 --> 00:12:22,360 pa bi to također će ispuniti u varijablama kao što biWidth i biSize. 173 00:12:25,270 --> 00:12:31,230 I onda na kraju, svaki piksel predstavlja tri bajtova. 174 00:12:31,230 --> 00:12:35,500 Prvi je iznos od plave u pikselima, drugi je iznos od zelene, 175 00:12:35,500 --> 00:12:41,120 i na kraju, u iznosu od crvene, gdje je 0 suštini nema plave ili zelene ili ne ne crvena 176 00:12:41,120 --> 00:12:43,720 a zatim ff je najveća vrijednost. 177 00:12:43,720 --> 00:12:46,800 To su heksadecimalni vrijednosti. 178 00:12:46,800 --> 00:12:53,870 Dakle, ako imamo FF0000, onda to odgovara maksimalnom iznosu od plave 179 00:12:53,870 --> 00:12:58,890 i onda nema zelene i ne crveni, pa onda da će nam dati plavi piksel. 180 00:12:58,890 --> 00:13:04,190 Tada, ako imamo FF-a u cijeloj ploči, onda to znači da ćemo imati bijeli piksel. 181 00:13:04,190 --> 00:13:11,370 To je vrsta nasuprot obično kada kažemo RGB. To se zapravo događa BGR. 182 00:13:12,750 --> 00:13:18,990 >> Dakle, ako smo zapravo gledati u primjeru bitmap slike - neka me jednom podići ovdje. 183 00:13:31,560 --> 00:13:33,830 To je malo mali. 184 00:13:39,890 --> 00:13:47,840 Ja sam zooming in i možemo vidjeti da je pixelated. Izgleda blokovima boje. 185 00:13:47,840 --> 00:13:50,110 Imate bijele blokove i zatim crveni blokova. 186 00:13:50,110 --> 00:13:53,700 Ako igrate u Microsoft Paint, na primjer, možete napraviti nešto takvo 187 00:13:53,700 --> 00:13:58,960 po osnovi samo slikarstvo određene kvadrata u određenom redoslijedu. 188 00:13:58,960 --> 00:14:08,060 Pa što onda to znači da se u bitmap je kako slijedi. 189 00:14:08,060 --> 00:14:15,710 Ovdje imamo prvi bijele piksele, da su svi 6 su f-a, a onda ćemo imati crvene piksela, 190 00:14:15,710 --> 00:14:19,910 naznačeno 0000ff. 191 00:14:19,910 --> 00:14:27,940 I tako je slijed bajtova koje imamo ukazuje kako je skenirana slika će izgledati. 192 00:14:27,940 --> 00:14:32,230 Dakle, ono što sam učinio ovdje samo se piše sve one bajtova, a zatim obojen u crveno 193 00:14:32,230 --> 00:14:37,550 tako da možete vidjeti vrste, ako žmirenje malo, kako to vrsta pokazuje smješko. 194 00:14:40,180 --> 00:14:46,390 >> Način na koji bitmap slike rad Zamislio sam je u osnovi kao mrežu. 195 00:14:46,390 --> 00:14:54,940 I tako po defaultu, svaki red rešetke mora biti višekratnik od 4 bajta. 196 00:15:00,520 --> 00:15:07,060 Ako gledamo na bitmap slike, ti si ispunjavanja svaku vrijednost. 197 00:15:07,060 --> 00:15:17,370 Na primjer, možda ćete morati crvena ovdje, a zeleno ovdje, plavom ovdje, 198 00:15:17,370 --> 00:15:24,950 ali imate kako biste bili sigurni da je slika ispunjen s višestruko četiri bajta. 199 00:15:24,950 --> 00:15:32,200 Dakle, ako želim da moje slike biti tri bloka širine, onda bih morati staviti praznu vrijednost 200 00:15:32,200 --> 00:15:35,640 u posljednjem jednom da bi ga višekratnik četiri. 201 00:15:35,640 --> 00:15:39,530 Pa onda bih dodati u nečemu što smo zovete padding. 202 00:15:39,530 --> 00:15:43,750 Samo ću navesti da s x.. 203 00:15:44,920 --> 00:15:54,160 Sada kažu želimo sliku koja je sedam piksela dugo, za primjer. 204 00:15:54,160 --> 00:15:59,550 Imamo 1, 2, 3, 4, 5, 6, 7, 205 00:16:04,750 --> 00:16:07,000 i svi koji se popunjava s bojom. 206 00:16:07,000 --> 00:16:10,620 Način na koji bitmap slike rade je da trebamo 8.. 207 00:16:10,620 --> 00:16:12,460 Trenutno imamo 1, 2, 3, 4, 5, 6, 7. 208 00:16:12,460 --> 00:16:19,360 Trebamo 8 prostore za bitmap slike za čitanje ispravno. 209 00:16:19,360 --> 00:16:25,600 Pa što onda moramo učiniti je dodati u samo malo padding 210 00:16:25,600 --> 00:16:29,430 kako bi bili sigurni da su svi širinama su uniformu 211 00:16:29,430 --> 00:16:34,260 i da su svi od širine su više od 4. 212 00:16:42,110 --> 00:16:47,310 I tako sam prethodno navedeno, padding kao x ili squiggly linije, 213 00:16:47,310 --> 00:16:53,880 ali u stvarnim bitmap slika padding je naznačeno heksadecimalnom 0. 214 00:16:53,880 --> 00:16:57,340 Dakle, da bi se jedan lik, 0. 215 00:16:58,980 --> 00:17:06,329 Što bi moglo doći u ruci je xxd naredba. 216 00:17:06,329 --> 00:17:11,220 Što je to zapravo pokazuje, kao što slično što sam učinio prije sa smajli 217 00:17:11,220 --> 00:17:15,630 kada sam zapravo ispisuje ono što svaka boja će biti za pikselu 218 00:17:15,630 --> 00:17:21,800 i onda ga bojama, kada pokrenete xxd sa sljedećim naredbama, 219 00:17:21,800 --> 00:17:28,670 onda će zapravo isprintati što su boje za one piksela. 220 00:17:28,670 --> 00:17:33,810 Što morate učiniti je ovamo sam navesti, poput-S 54 221 00:17:33,810 --> 00:17:36,530 kaže da ću početi na 54. bajtu 222 00:17:36,530 --> 00:17:40,820 jer prije toga, sjetite se, ako se osvrnemo na karti od bitmape, 223 00:17:40,820 --> 00:17:42,690 to je sve informacije u zaglavlju i stvari kao što je to. 224 00:17:42,690 --> 00:17:46,280 Ali ono što mi je stvarno stalo je stvarni piksela koji ukazuju na boju. 225 00:17:46,280 --> 00:17:52,700 Dakle, dodavanjem u tom zastavom,-a 54, onda smo u mogućnosti vidjeti vrijednosti boja. 226 00:17:52,700 --> 00:17:56,020 I ne brinite o kompliciranim zastave i tome slično. 227 00:17:56,020 --> 00:18:05,020 U spec. problema skup, morat ćete upute o tome kako koristiti xxd za prikaz piksela. 228 00:18:07,070 --> 00:18:15,590 Dakle, ako ste vidjeli ovdje, to nekako izgleda kao zeleni okvir, ova mala stvar. 229 00:18:15,590 --> 00:18:23,610 Ja sam bojama the 00ff00 kao osnovi govoreći nema plave, puno zelenila, a ne crveni. 230 00:18:23,610 --> 00:18:26,370 Tako da odgovara zeleno. 231 00:18:26,370 --> 00:18:31,920 Kao što ste vidjeli ovdje, vidimo zeleni pravokutnik. 232 00:18:31,920 --> 00:18:36,660 Ovaj zeleni pravokutnik je samo 3 piksela, pa onda ono što mi moramo učiniti 233 00:18:36,660 --> 00:18:44,350 kako bi bili sigurni da je fotografija višekratnik 4 širine je dodati u dodatnom podstavom. 234 00:18:44,350 --> 00:18:49,460 I tako onda je to kako ste vidjeli ove 0S ovdje. 235 00:18:49,460 --> 00:18:54,510 To će zapravo biti posljedica vašeg Resize pset, 236 00:18:54,510 --> 00:19:01,350 bitno uzimanje male bitmapa, a zatim su ga povećali po četiri. 237 00:19:01,350 --> 00:19:09,380 I tako ono što smo vidjeli je da je zapravo ova slika 12 piksela, ali 12 je višekratnik 4, 238 00:19:09,380 --> 00:19:12,940 i tako mi zapravo ne vidim nikakve 0S na kraju jer mi ne treba dodati bilo 239 00:19:12,940 --> 00:19:19,070 jer potpuno podstavljena. To ne imati bilo više prostora. 240 00:19:20,720 --> 00:19:23,470 >> Ok. Sva pitanja o padding? 241 00:19:25,150 --> 00:19:27,460 Ok. Cool. 242 00:19:27,460 --> 00:19:32,520 >> Kao što sam spomenuo prije, bitmape su samo slijed bajtova. 243 00:19:32,520 --> 00:19:39,170 I tako ono što imamo je, umjesto da trebaju pratiti točno koji broj byte 244 00:19:39,170 --> 00:19:47,050 odgovara određenom elementu, mi zapravo su stvorili struct predstavljati to. 245 00:19:47,050 --> 00:19:50,930 Dakle, ono što imamo je RGBTRIPLE struct. 246 00:19:50,930 --> 00:19:54,590 Kad god imate instancu RGB triple, 247 00:19:54,590 --> 00:20:00,970 jer je to vrsta definirati struct, onda možete pristupiti rgbtBlue varijablu, 248 00:20:00,970 --> 00:20:09,520 Slično Zeleni i Crveni varijable, koji će ukazati koliko plava, zelena i crvena, 249 00:20:09,520 --> 00:20:11,580 odnosno, imate. 250 00:20:11,580 --> 00:20:16,800 >> Dakle, ako imamo plavu varijablu skup na 0, zelena postavljeno na ff, 251 00:20:16,800 --> 00:20:22,060 koja je najveća vrijednost koju možete imati, a zatim crveni varijabla postavljena na 0, 252 00:20:22,060 --> 00:20:27,870 onda ono što boje bi ovaj RGB trostruki predstavljaju? >> [Student] Zelena. 253 00:20:27,870 --> 00:20:29,150 Zelena. Točno. 254 00:20:29,150 --> 00:20:34,480 To će biti korisno da znaju da kad god imate instancu RGB triple, 255 00:20:34,480 --> 00:20:41,340 zapravo možete pristupiti količinu boje - plava, zelena i crvena - odvojeno. 256 00:20:43,350 --> 00:20:54,900 >> Sada kada smo razgovarali o strukturi da, ajmo se pogledati BMP datoteke. 257 00:20:54,900 --> 00:20:57,870 To su tvorevina napravio za vas. 258 00:20:57,870 --> 00:21:01,820 Ovdje imamo BITMAPFILEHEADER struct. 259 00:21:01,820 --> 00:21:07,610 Od interesa je veličina. 260 00:21:07,610 --> 00:21:12,660 Kasnije, imamo informacija zaglavlje, koji ima još nekoliko stvari koje su zanimljive za nas, 261 00:21:12,660 --> 00:21:15,480 naime veličina, širina, i visina. 262 00:21:15,480 --> 00:21:19,170 Kao što ćemo ići u kasnije, kada ste pročitali u spisu, 263 00:21:19,170 --> 00:21:25,500 automatski čita u jer smo postavili redoslijed biti isti. 264 00:21:25,500 --> 00:21:31,990 Tako biSize će sadržavati pravo bajtova koje odgovaraju stvarnoj veličini slike. 265 00:21:34,700 --> 00:21:40,500 I onda ovdje, na kraju, kao što smo razgovarali o tome, imamo RGBTRIPLE typedef struct. 266 00:21:40,500 --> 00:21:46,840 Imamo rgbtBlue, zelena i crvena povezane s njom. 267 00:21:48,210 --> 00:21:49,340 >> Izvrsno. Ok. 268 00:21:49,340 --> 00:21:56,360 Sada kada razumijemo bitmape malo, razumijem da imamo datoteka zaglavlja 269 00:21:56,360 --> 00:22:00,790 i info zaglavlje povezana s njom, a onda nakon toga, imamo zanimljive stvari 270 00:22:00,790 --> 00:22:05,110 od boja, i one boje predstavljaju RGBTRIPLE tvorevina, 271 00:22:05,110 --> 00:22:12,710 a oni, pak, imaju tri vrijednosti povezane s plave, zelene i crvene. 272 00:22:12,710 --> 00:22:17,270 >> Tako sada, možemo vrsta razmišljam o Oporavak malo. 273 00:22:17,270 --> 00:22:20,130 Oprostite. Razmislite o detektivski roman. 274 00:22:20,130 --> 00:22:25,750 Kada imamo trag datoteku, onda ono što želimo učiniti je čitati u njega piksel po piksel 275 00:22:25,750 --> 00:22:33,860 i onda nekako promijeniti te piksele, tako da ga možemo čuti u čitljivom obliku. 276 00:22:33,860 --> 00:22:41,020 I tako to izlaz, idemo pisati piksel po piksel u verdict.bmp datoteku. 277 00:22:41,020 --> 00:22:45,120 To je vrsta puno učiniti. Svjesni smo toga. 278 00:22:45,120 --> 00:22:49,860 Dakle, ono što smo učinili je da smo zapravo sam vam pružiti copy.c. 279 00:22:49,860 --> 00:22:57,610 Što copy.c ipak samo čini točnu kopiju određenog bitmap datoteku, a zatim ga šalje. 280 00:22:57,610 --> 00:23:01,900 Dakle, ovo je već otvara datoteku za vas, čita u pikselima po pikselu, 281 00:23:01,900 --> 00:23:04,510 i onda ga piše u u izlaznu datoteku. 282 00:23:04,510 --> 00:23:07,080 >> Idemo pogledati to. 283 00:23:13,390 --> 00:23:18,290 Ovo je osigurati pravilno korištenje, 284 00:23:18,290 --> 00:23:22,640 uzimajući datoteka ovdje. 285 00:23:22,640 --> 00:23:29,940 Što to znači je to postavlja ulaznu datoteku da bude ono što smo prošli u u INFILE ovdje, 286 00:23:29,940 --> 00:23:34,750 koji je naš drugi naredbenog retka argument. 287 00:23:34,750 --> 00:23:37,640 Provjere kako bi bili sigurni da možemo otvoriti datoteku. 288 00:23:38,960 --> 00:23:44,860 Provjere kako bi bili sigurni da možemo napraviti novi outfile ovdje. 289 00:23:45,630 --> 00:23:53,270 Onda što to radi ovdje, to je samo u osnovi počinje čitanje na bitmap datoteku od početka. 290 00:23:53,270 --> 00:23:56,700 Početak, kao što znamo, sadrži BITMAPFILEHEADER, 291 00:23:56,700 --> 00:24:03,200 i tako ti nizovi bitova izravno će ispuniti BITMAPFILEHEADER. 292 00:24:03,200 --> 00:24:07,940 Dakle, ono što imamo ovdje govori da BITMAPFILEHEADER BF - 293 00:24:07,940 --> 00:24:13,150 to je naša nova varijabla tipa BITMAPFILEHEADER - 294 00:24:13,150 --> 00:24:22,560 idemo staviti unutra BF ono što čitamo iz u pokazivač, koji je naš INFILE. 295 00:24:22,560 --> 00:24:23,970 Koliko čitamo? 296 00:24:23,970 --> 00:24:32,160 Čitamo u koliko bajtova trebamo sadrže cijeli BITMAPFILEHEADER. 297 00:24:32,160 --> 00:24:34,660 Isto tako, to je ono što mi radimo za info zaglavlju. 298 00:24:34,660 --> 00:24:39,010 Dakle, mi smo i dalje uz našu datoteku u INFILE, 299 00:24:39,010 --> 00:24:44,360 i mi smo čitanje tih bitova i bajtova, a mi smo ih uključivanjem izravno u 300 00:24:44,360 --> 00:24:47,880 u tim slučajevima varijabli koje smo izradu. 301 00:24:49,370 --> 00:24:53,800 Ovdje smo samo pazeći da bitmapa je bitmapa. 302 00:24:57,670 --> 00:25:01,030 >> Sada imamo outfile, zar ne? 303 00:25:01,030 --> 00:25:04,420 Dakle, kao što stoji kad smo ga stvorili, to je bitno prazna. 304 00:25:04,420 --> 00:25:07,710 Tako smo u osnovi stvoriti novi bitmapa od nule. 305 00:25:07,710 --> 00:25:12,280 Ono što mi radimo je moramo biti sigurni da smo kopirati u datoteku zaglavlja 306 00:25:12,280 --> 00:25:16,850 i info zaglavlje baš kao INFILE ima. 307 00:25:16,850 --> 00:25:22,850 Ono što mi radimo je pišemo - i sjetite se da bf je varijabla 308 00:25:22,850 --> 00:25:29,300 tipa BITMAPFILEHEADER, tako da ono što radimo je da smo samo koristiti taj sadržaj 309 00:25:29,300 --> 00:25:34,980 pisati u outfile. 310 00:25:36,550 --> 00:25:38,510 Evo, sjetite se što smo razgovarali o padding, 311 00:25:38,510 --> 00:25:47,820 koliko je važno kako bi bili sigurni da je iznos piksela koji imamo je višekratnik 4. 312 00:25:47,820 --> 00:25:52,790 To je prilično korisna formula za izračunati koliko padding imate 313 00:25:52,790 --> 00:25:57,670 dao širina datoteci. 314 00:25:57,670 --> 00:26:04,120 Želim ti dečki imati na umu da u copy.c imamo formulu za izračunavanje padding. 315 00:26:04,120 --> 00:26:07,970 Ok? Dakle, svi zapamtiti. Izvrsno. 316 00:26:07,970 --> 00:26:14,050 Pa što onda ne copy.c sljedeći je to ponovi nad svim scanlines. 317 00:26:14,050 --> 00:26:23,730 To ide kroz retke, a zatim pohranjuje svaki trostruko da se čita 318 00:26:23,730 --> 00:26:26,920 , a zatim ga piše u outfile. 319 00:26:26,920 --> 00:26:33,120 Dakle ovdje smo čitati samo jedan RGB triple na vrijeme 320 00:26:33,120 --> 00:26:39,860 a zatim stavljanjem tog istog triple u outfile. 321 00:26:41,120 --> 00:26:48,340 Lukav dio je da padding nije RGB trostruki, 322 00:26:48,340 --> 00:26:55,200 i tako ne možemo pročitati da je padding količinu RGB trojki. 323 00:26:55,200 --> 00:27:01,460 Ono što mi moramo učiniti je zapravo samo premjestiti naš indikator položaja datoteke, premjestiti naše pokazivač, 324 00:27:01,460 --> 00:27:06,840 na vrste preskočiti sve padding, tako da smo na sljedeći redak. 325 00:27:06,840 --> 00:27:12,990 I što onda to radi je kopija vam pokazuje kako možda želite dodati padding. 326 00:27:12,990 --> 00:27:14,990 Tako smo izračunati koliko padding trebamo, 327 00:27:14,990 --> 00:27:18,220 pa to znači da moramo padding broj 0S. 328 00:27:18,220 --> 00:27:24,510 Što to znači je za petlje da stavlja obloge broj 0S u našoj outfile. 329 00:27:24,510 --> 00:27:31,170 I onda napokon, zatvorite obje datoteke. Možete zatvoriti INFILE kao i outfile. 330 00:27:31,170 --> 00:27:34,870 >> Dakle, to je kako copy.c djela, 331 00:27:34,870 --> 00:27:37,430 i da će to biti prilično korisna. 332 00:27:39,720 --> 00:27:43,750 Umjesto da samo zapravo izravno kopirati i zalijepiti 333 00:27:43,750 --> 00:27:46,800 ili samo gleda na to i piše u što god želite, 334 00:27:46,800 --> 00:27:49,440 možda samo žele izvršiti ovu naredbu u terminalu, 335 00:27:49,440 --> 00:27:54,520 k.č. copy.c whodunit.c, koji će stvoriti novu datoteku, whodunit.c, 336 00:27:54,520 --> 00:27:58,330 koja sadrži isti sadržaj kao kopija radi. 337 00:27:58,330 --> 00:28:03,880 Dakle ono što možemo učiniti je koristiti kao okvir na kojem će se graditi i uređivati 338 00:28:03,880 --> 00:28:06,900 za naš detektivski roman datoteku. 339 00:28:08,500 --> 00:28:14,670 >> To su naša za dos učiniti za detektivski roman, ali ono što čini copy.c 340 00:28:14,670 --> 00:28:16,730 zapravo brine većina od njih za nas. 341 00:28:16,730 --> 00:28:21,900 Dakle, sve što trebate učiniti je promijeniti piksela po potrebi 342 00:28:21,900 --> 00:28:25,920 zapravo bi datoteka čitati. 343 00:28:25,920 --> 00:28:32,960 Ne zaboravite da za određenu piksela triple, tako da za određenu varijablu tipa RGBTRIPLE, 344 00:28:32,960 --> 00:28:35,990 možete pristupiti plava, zelena i crvena vrijednosti. 345 00:28:35,990 --> 00:28:38,670 To će doći u ruci, jer ako im možete pristupiti, 346 00:28:38,670 --> 00:28:41,770 to znači da možete ih provjeriti, 347 00:28:41,770 --> 00:28:45,430 a to znači da možete ih promijeniti. 348 00:28:45,430 --> 00:28:49,430 >> Dakle, kada smo otišli natrag do našeg crvenog povećalom, primjerice, 349 00:28:49,430 --> 00:28:53,390 u osnovi, da je djelovao kao svojevrstan filter za nas. 350 00:28:53,390 --> 00:28:58,160 Dakle, ono što želim učiniti je da želimo filtrirati sve trojke koje dolaze u. 351 00:28:58,160 --> 00:29:01,240 Postoji nekoliko različitih načina da to učinite. 352 00:29:01,240 --> 00:29:07,100 Uglavnom, možete imati što god vrsta filtera želite. 353 00:29:07,100 --> 00:29:09,890 Možda želite promijeniti sve crvene piksela 354 00:29:09,890 --> 00:29:13,570 ili možda želite promijeniti različite boje piksel drugoj boji. 355 00:29:13,570 --> 00:29:15,400 To je do vas. 356 00:29:15,400 --> 00:29:19,580 Ne zaboravite da možete provjeriti što boja piksel je 357 00:29:19,580 --> 00:29:23,000 a onda možete ga promijeniti kao idete kroz. 358 00:29:24,410 --> 00:29:26,420 >> Ok. Dakle, to je detektivski roman. 359 00:29:26,420 --> 00:29:32,760 Nakon što pokrenete detektivski roman, znat ćete tko je krivac za zločin bio. 360 00:29:32,760 --> 00:29:35,540 >> Sada ćemo ići na veličinu. 361 00:29:35,540 --> 00:29:37,990 Mi ćemo i dalje se bave bitmape. 362 00:29:37,990 --> 00:29:40,750 Što ćemo učiniti je da ćemo imati ulazne bitmapa 363 00:29:40,750 --> 00:29:45,890 i onda ćemo proći u velikom broju, a zatim dobiti outfile bitmapa 364 00:29:45,890 --> 00:29:51,380 gdje je to u osnovi naša INFILE umanjiti n. 365 00:29:54,670 --> 00:30:01,450 Recimo moj datoteka je samo jedan piksel velika. 366 00:30:01,450 --> 00:30:09,100 Onda ako je moj n je 3, skaliranje po tri, onda bih ponoviti taj piksel n broj puta, 367 00:30:09,100 --> 00:30:14,410 tako tri puta, a zatim ga i umanjiti tri puta kao dobro. 368 00:30:14,410 --> 00:30:17,840 Pa vidiš ja ga skaliranje okomito i vodoravno. 369 00:30:17,840 --> 00:30:19,680 >> I onda evo primjera. 370 00:30:19,680 --> 00:30:27,590 Ako imate n = 2, vidjet ćete da je prvi plavi piksel postoji ponavlja dva puta 371 00:30:27,590 --> 00:30:30,930 horizontalno, kao i dva puta vertikalno. 372 00:30:30,930 --> 00:30:38,040 I onda da se nastavlja dalje, i tako ćete imati izravan skaliranje svoje originalne slike po dvije. 373 00:30:40,920 --> 00:30:47,600 >> Dakle, ako smo bili detaljno pseudocode za to, želimo otvoriti datoteku. 374 00:30:47,600 --> 00:30:49,880 I onda znajući da ako se vratimo ovdje, 375 00:30:49,880 --> 00:30:54,540 vidimo da širina za outfile će biti drugačiji od širine za INFILE. 376 00:30:54,540 --> 00:30:56,130 Što to znači? 377 00:30:56,130 --> 00:31:01,230 To znači da naša informacije u zaglavlju će se promijeniti. 378 00:31:01,230 --> 00:31:03,790 I tako ono što ćete želite učiniti je ažurirati header informacije, 379 00:31:03,790 --> 00:31:11,820 znajući da kad čitamo u spisima ako djeluju na copy.c okvira, 380 00:31:11,820 --> 00:31:17,570 već imamo varijablu koja označava ono što je veličina i slične stvari. 381 00:31:17,570 --> 00:31:24,060 Dakle, nakon što su to, ono što možda želite učiniti je promijeniti te određene varijable. 382 00:31:24,060 --> 00:31:29,380 Zapamtite, ako imate struct, kako ste pristupili varijabli unutar toga. 383 00:31:29,380 --> 00:31:32,080 Možete koristiti dot operator, zar ne? 384 00:31:32,080 --> 00:31:36,420 Pa onda pomoću toga, znate da ćete morati promijeniti header informacije. 385 00:31:36,480 --> 00:31:41,030 Dakle, ovdje je samo popis stvarnih elemenata koje će se promjene u datoteci. 386 00:31:41,030 --> 00:31:45,180 Veličina datoteke će se mijenjati, slike, kao i širinu i visinu. 387 00:31:45,180 --> 00:31:50,080 Pa onda ide natrag na karti od bitmape, 388 00:31:50,080 --> 00:31:57,730 pogledati da li je datoteka zaglavlja ili info zaglavlje koje sadrži tu informaciju 389 00:31:57,730 --> 00:32:00,920 i onda promijeniti prema potrebi. 390 00:32:05,010 --> 00:32:12,470 Opet, kažu k.č. copy.c resize.c. 391 00:32:12,470 --> 00:32:19,270 To znači da resize.c sada sadrži sve što je sadržano u kopiji 392 00:32:19,270 --> 00:32:24,490 jer kopija daje nam način čitanja u svakom scanline piksela po pikselu. 393 00:32:24,490 --> 00:32:29,860 Osim sada, umjesto da samo promjenom vrijednosti kao što smo učinili u detektivski roman, 394 00:32:29,860 --> 00:32:37,980 ono što želim učiniti je da želimo pisati u više piksela 395 00:32:37,980 --> 00:32:43,580 dok naša je n veći od 1. 396 00:32:43,580 --> 00:32:47,110 >> Onda ono što želimo učiniti je želimo ga se protežu vodoravno n, 397 00:32:47,110 --> 00:32:50,490 kao i protežu okomito n. 398 00:32:50,490 --> 00:32:52,710 Kako bismo mogli to učiniti? 399 00:32:52,710 --> 00:32:56,890 Recimo vaš n 2 i imate ovaj dao INFILE. 400 00:32:56,890 --> 00:32:58,730 Vaš kursor će početi u prvoj, 401 00:32:58,730 --> 00:33:03,530 i ono što želite učiniti ako je n 2, želite ispisivati ​​u dvije od njih. 402 00:33:03,530 --> 00:33:05,490 Dakle, ispis u dvije od njih. 403 00:33:05,490 --> 00:33:10,830 Tada vaš kursor će se premjestiti na sljedeću piksela, što je crveni, 404 00:33:10,830 --> 00:33:18,400 i to će ispisati dvije od tih one crvene, to dodavanjem na ono što je učinio prije. 405 00:33:18,400 --> 00:33:26,280 Zatim pokazivač će se pomaknuti na sljedeći piksel i nacrtati u dvije od njih. 406 00:33:26,280 --> 00:33:37,180 Ako pogledate natrag u copy.c okvira, što to radi ovdje 407 00:33:37,180 --> 00:33:42,830 se stvara novu instancu RGB triple, nova promjenjiva zove triple. 408 00:33:42,830 --> 00:33:50,500 I ovdje kad se čita u nju, ona čita iz INFILE 1 RGBTRIPLE 409 00:33:50,500 --> 00:33:53,470 i pohranjuje unutar tog trostrukog varijable. 410 00:33:53,470 --> 00:33:57,590 Pa onda vi zapravo imate varijablu koja predstavlja taj određeni piksel. 411 00:33:57,590 --> 00:34:05,290 Onda kada pišete, što možda želite učiniti je okružuju fwrite izjavi u za petlje 412 00:34:05,290 --> 00:34:11,080 da ga piše u svoj outfile onoliko puta koliko je potrebno. 413 00:34:17,449 --> 00:34:20,100 To je jednostavna. 414 00:34:20,200 --> 00:34:27,590 Samo u osnovi ponoviti proces pisanja n broj puta da ga ljestvici horizontalno. 415 00:34:27,590 --> 00:34:32,969 >> Ali onda se moramo sjetiti da je naš padding će se promijeniti. 416 00:34:47,350 --> 00:34:53,020 Prije toga, reći da smo imali nešto duljine tri. 417 00:34:53,020 --> 00:35:00,130 Tada smo upravo bi dodati u koliko padding? Samo još jedan kako bi ga višekratnik 4. 418 00:35:00,130 --> 00:35:10,480 No, reći da smo skaliranje ovu posebnu sliku n = 2. 419 00:35:10,480 --> 00:35:16,300 Dakle koliko plave piksela bi smo na kraju? Želimo imati šest. 420 00:35:16,300 --> 00:35:21,470 1, 2, 3, 4, 5, 6. U redu. 421 00:35:21,470 --> 00:35:26,580 6 nije više od 4. Što je najbliži višekratnik 4? To će biti osam. 422 00:35:26,580 --> 00:35:33,200 Dakle, mi zapravo će imati dva znakove padding tamo. 423 00:35:33,200 --> 00:35:38,720 >> Se bilo tko sjetiti ako imamo formulu za izračun padding 424 00:35:38,720 --> 00:35:41,350 i gdje bi moglo biti? 425 00:35:41,350 --> 00:35:45,160 [Nečujno učenik odgovor] >> Da, copy.c. Točno. 426 00:35:45,160 --> 00:35:49,800 Tu je formula u copy.c izračunati koliko padding imate 427 00:35:49,800 --> 00:35:53,810 dao određenu širinu bitmap slike. 428 00:35:53,810 --> 00:36:02,950 Dakle to će biti korisno kada trebate dodati u određenom iznosu od padding 429 00:36:02,950 --> 00:36:06,160 zapravo shvatiti koliko padding trebate dodati. 430 00:36:10,820 --> 00:36:15,850 Ali jedna napomena, ipak, je da želite da biste bili sigurni da ste korištenjem pravu veličinu. 431 00:36:15,850 --> 00:36:21,410 Samo budite oprezni jer ste u osnovi ćeš se bave dva bitmap slike. 432 00:36:21,410 --> 00:36:23,410 Vi želite da biste bili sigurni da ste koristeći pravo jedan. 433 00:36:23,410 --> 00:36:26,820 Kada ste izračuna padding za outfile, želite koristiti širinu outfile 434 00:36:26,820 --> 00:36:29,860 a ne širina prethodnog. 435 00:36:29,860 --> 00:36:37,240 >> Izvrsno. Takav brine istezanje cijeli bitmap sliku vodoravno. 436 00:36:37,240 --> 00:36:41,290 No, ono što želimo učiniti je zapravo ga se protežu okomito kao dobro. 437 00:36:41,290 --> 00:36:48,760 To će biti malo složenije jer kada smo završili kopiranje red 438 00:36:48,760 --> 00:36:51,580 i pisanje taj redak, naš pokazivač će biti na kraju. 439 00:36:51,580 --> 00:36:56,210 Dakle, ako smo ponovno čitati, onda je to samo ide na čitanje u sljedeći redak. 440 00:36:56,210 --> 00:37:03,660 Dakle, ono što želimo učiniti je vrsta pronaći neki način kopiranja one retke ponovno 441 00:37:03,660 --> 00:37:12,500 ili samo vrsta uzimanje taj redak, a zatim ga prepisati opet. 442 00:37:14,380 --> 00:37:17,940 Kao što sam nekako aludirala, postoji nekoliko različitih načina da to učinite. 443 00:37:17,940 --> 00:37:23,040 Što možete učiniti je kao da idete kroz čitanje i kroz određeni scanline 444 00:37:23,040 --> 00:37:28,560 i to mijenja koliko je potrebno, a zatim vrsta trgovine sve one piksela u polju. 445 00:37:28,560 --> 00:37:36,350 Onda kasnije znate da ćete trebati isprintati taj niz opet, 446 00:37:36,350 --> 00:37:39,830 i tako možete jednostavno koristiti taj niz to učiniti. 447 00:37:39,830 --> 00:37:44,500 Drugi način da to učinite je da bi mogao kopirati dolje jedan redak, 448 00:37:44,500 --> 00:37:47,950 Razumijem da morate kopirati da opet, tako da zapravo premjestiti vaš kursor, 449 00:37:47,950 --> 00:37:50,950 i da će se koristiti metodu fseek. 450 00:37:50,950 --> 00:37:56,410 Ti bi mogao premjestiti vaš kursor skroz natrag i ponovite kopiranje proces ponovno. 451 00:37:56,410 --> 00:38:03,960 >> Dakle, ako naš skaliranje broj je n, onda koliko puta bi se moramo vratiti 452 00:38:03,960 --> 00:38:10,500 i prepisati liniju? >> [Student] n - 1. >> Da, savršena. n - 1. 453 00:38:10,500 --> 00:38:14,390 Mi smo to učinili već jednom, pa onda ćemo htjeti ponoviti ide natrag proces 454 00:38:14,390 --> 00:38:17,460 n - 1 količinu vremena. 455 00:38:22,730 --> 00:38:25,860 Ok. Dakle, tamo imate svoju funkciju veličinu. 456 00:38:25,860 --> 00:38:34,360 >> Sada možemo doći do stvarno zabavan dio, moja omiljena pset, koji je oporaviti. 457 00:38:34,360 --> 00:38:39,580 Umjesto bitmape, ovaj put smo se bave JPEG. 458 00:38:39,580 --> 00:38:43,370 Mi zapravo ne daje sliku samo za JPEG, 459 00:38:43,370 --> 00:38:46,600 mi dao osnovi sirovi format memorijskih kartica. 460 00:38:46,600 --> 00:38:51,790 I tako to sadrži malo info i smeće vrijednosti u početku, 461 00:38:51,790 --> 00:38:57,240 i onda počinje i ima hrpa JPEG datoteka. 462 00:38:57,240 --> 00:39:03,430 Međutim, mi smo predao karticu gdje smo izbrisani fotografije; 463 00:39:03,430 --> 00:39:08,300 suštini, mi smo zaboravili gdje su fotografije koje se nalazi unutar kartice. 464 00:39:08,300 --> 00:39:12,770 Dakle naš zadatak u Obnova je proći kroz ovaj kartice formatu 465 00:39:12,770 --> 00:39:16,500 i naći one slike opet. 466 00:39:16,500 --> 00:39:23,990 >> Srećom, struktura JPEG datoteka i kartica Datoteka je malo pomogla. 467 00:39:23,990 --> 00:39:28,850 To definitivno mogao biti malo složenije ako to nisu bili u ovom konkretnom obliku. 468 00:39:28,850 --> 00:39:40,160 Svaki JPEG datoteka zapravo počinje s dva moguća slijeda, gore navedenih. 469 00:39:40,160 --> 00:39:42,970 Uglavnom, kad god imate novu JPEG datoteku, 470 00:39:42,970 --> 00:39:52,720 počinje s obje nizu ffd8 ffe0 ili onaj drugi, ffd8 ffe1. 471 00:39:52,720 --> 00:39:59,530 Još jedna korisna stvar je znati da su JPEG pohranjeni contiguously. 472 00:39:59,530 --> 00:40:03,380 Dakle, kad jednom JPEG datoteka završava, a druga počinje jedan. 473 00:40:03,380 --> 00:40:07,070 Dakle, ne postoji bilo kakav-u između vrijednosti tamo. 474 00:40:07,070 --> 00:40:15,510 Nakon što pogodak početak JPEG, ako ste već čitajući JPEG, 475 00:40:15,510 --> 00:40:21,800 znate da ste pogoditi kraj prethodne i početak sljedećeg jedan. 476 00:40:21,800 --> 00:40:25,890 >> Za vrste vizualizirati to, napravio sam shemu. 477 00:40:25,890 --> 00:40:36,910 Još jedna stvar o JPEG je da ih možemo pročitati u sekvenci 512 bajtova na vrijeme, 478 00:40:36,910 --> 00:40:39,380 slično s početkom kartice. 479 00:40:39,380 --> 00:40:43,370 Mi ne treba provjeru svakog pojedinog bajta jer bi to sisati. 480 00:40:43,370 --> 00:40:48,200 Dakle, umjesto toga, ono što možemo učiniti je zapravo samo čitati u 512 bajtova na vrijeme 481 00:40:48,200 --> 00:40:54,700 i onda, umjesto da provjere između onih u tim sitnim malim komadima, 482 00:40:54,700 --> 00:40:58,640 možemo samo provjeriti početka 512 bajtova. 483 00:40:58,640 --> 00:41:02,570 U suštini, u toj slici, ono što vidite je u početku kartice, 484 00:41:02,570 --> 00:41:08,700 imate vrijednosti koje zapravo nisu relevantni za aktualne JPEG samih. 485 00:41:08,700 --> 00:41:15,830 Ali onda ono što imam je zvijezda ukazuju na jednu od dvije početne sekvence za JPEG. 486 00:41:15,830 --> 00:41:19,910 Dakle, kad vidite zvijezdu, znate da imate JPEG datoteku. 487 00:41:19,910 --> 00:41:25,030 I onda svaki JPEG datoteka će biti neki višekratnik od 512 bajtova 488 00:41:25,030 --> 00:41:27,880 ali ne nužno isti višekratnik. 489 00:41:27,880 --> 00:41:32,050 Način da znate da ste pogodio još JPEG je ako udariti drugu zvijezdu, 490 00:41:32,050 --> 00:41:39,090 drugi pokretanje slijed bajtova. 491 00:41:39,090 --> 00:41:43,330 Onda ono što imate ovdje je imate datoteku crveni JPEG trajnu dok ne pogoditi zvijezdu, 492 00:41:43,330 --> 00:41:45,150 koji je označen novom bojom. 493 00:41:45,150 --> 00:41:48,510 Možete nastaviti i onda udariti drugu zvijezdu, hit još JPEG, 494 00:41:48,510 --> 00:41:50,590 i dalje sve do kraja. 495 00:41:50,590 --> 00:41:53,180 Vi ste na posljednjoj slici ovdje, ružičasta jedan. 496 00:41:53,180 --> 00:41:58,220 Možete ići do kraja dok ne pogoditi kraj datoteke karaktera. 497 00:41:58,220 --> 00:42:00,820 To će biti jako korisno. 498 00:42:00,820 --> 00:42:03,170 >> Prije nekoliko glavnih Zaključci ovdje: 499 00:42:03,170 --> 00:42:06,670 File kartica ne početi s JPEG, 500 00:42:06,670 --> 00:42:13,350 ali jednom JPEG počinje, sve JPEG pohranjeni su uz bok jedan drugome. 501 00:42:17,520 --> 00:42:20,420 >> Neki pseudocode za oporavak. 502 00:42:20,420 --> 00:42:22,570 Prvo, mi ćemo otvoriti naše kartice datoteku, 503 00:42:22,570 --> 00:42:27,500 i da će se koristiti našu sliku I / O funkcije. 504 00:42:27,500 --> 00:42:32,430 Mi ćemo ponoviti sljedeće proces dok smo došli do kraja datoteke. 505 00:42:32,430 --> 00:42:36,450 Idemo čitati 512 bajtova na vrijeme. 506 00:42:36,450 --> 00:42:39,180 A ono što sam rekao ovdje je da ćemo ga pohraniti u međuspremnik, 507 00:42:39,180 --> 00:42:46,230 pa u osnovi držati na onim 512 bajtova dok ne znamo točno što učiniti s njima. 508 00:42:46,230 --> 00:42:50,300 Onda ono što želimo učiniti je da želimo provjeriti da li smo pogodak zvijezdu ili ne. 509 00:42:50,300 --> 00:42:57,960 Ako smo pogodak zvijezdu, ako smo pogodak jedan od početnih sekvenci, 510 00:42:57,960 --> 00:42:59,980 onda znamo da smo hit novu JPEG datoteku. 511 00:42:59,980 --> 00:43:08,860 Ono što ćete želite učiniti je da ćemo želite stvoriti novu datoteku u našem pset4 imeniku 512 00:43:08,860 --> 00:43:14,480 nastaviti izradu tu datoteku. 513 00:43:14,480 --> 00:43:18,220 No, isto tako, ako smo već napravili JPEG prije, 514 00:43:18,220 --> 00:43:25,620 onda želimo završiti tu datoteku i gurnuti ga na pset4 mapu, 515 00:43:25,620 --> 00:43:29,780 gdje ćemo imati da datoteke pohranjene jer ako mi ne navedete da ste završili smo tu JPEG datoteku, 516 00:43:29,780 --> 00:43:37,290 onda smo u osnovi će imati neodređen iznos. U JPEG nikada neće završiti. 517 00:43:37,290 --> 00:43:40,840 Dakle, želimo biti sigurni da kada smo čitati u JPEG datoteku i piše kako je, 518 00:43:40,840 --> 00:43:46,590 želimo posebno zatvoriti da bi se otvoriti sljedeći. 519 00:43:46,590 --> 00:43:48,430 Mi ćemo želite provjeriti nekoliko stvari. 520 00:43:48,430 --> 00:43:52,880 Mi želimo provjeriti da li smo na početku novog JPEG s našim tampon 521 00:43:52,880 --> 00:43:56,780 i ako smo već našli JPEG prije 522 00:43:56,780 --> 00:44:03,930 jer to će promijeniti svoj proces blago. 523 00:44:03,930 --> 00:44:07,880 Dakle nakon što ste proći kroz sve način i pogodio kraj datoteke, 524 00:44:07,880 --> 00:44:11,570 što onda ćete želite učiniti je da ćete želite zatvoriti sve datoteke koje su trenutno otvorena. 525 00:44:11,570 --> 00:44:14,100 To će vjerojatno biti zadnja JPEG datoteka koje imate, 526 00:44:14,100 --> 00:44:18,930 kao i kartice datoteke koje ste se bave. 527 00:44:21,940 --> 00:44:28,670 >> Posljednji prepreka da se moramo pozabaviti je kako zapravo napraviti JPEG datoteku 528 00:44:28,670 --> 00:44:31,950 i kako zapravo ga gurnuti na mapi. 529 00:44:33,650 --> 00:44:39,850 The pset zahtijeva da svaki JPEG da vam se u sljedećem formatu, 530 00:44:39,850 --> 00:44:43,990 gdje imate broj. jpg. 531 00:44:43,990 --> 00:44:50,750 Broj, čak i ako je 0, mi to zovemo 000.jpg. 532 00:44:50,750 --> 00:44:55,730 Kad god vam je JPEG u svom programu, 533 00:44:55,730 --> 00:44:58,040 idete da želite da ga imenuju u cilju da se nalazimo. 534 00:44:58,040 --> 00:44:59,700 Što to znači? 535 00:44:59,700 --> 00:45:03,530 Moramo vrste pratiti koliko smo našli 536 00:45:03,530 --> 00:45:08,680 i što broj svakog JPEG bi trebao biti. 537 00:45:08,680 --> 00:45:13,800 Ovdje ćemo iskoristiti u sprintf funkciji. 538 00:45:13,800 --> 00:45:17,480 Slično printf, koji je upravo vrsta otisaka vrijednost van u terminalu, 539 00:45:17,480 --> 00:45:23,910 sprintf ispisuje datoteku van u mapu. 540 00:45:23,910 --> 00:45:30,870 I tako što će to učiniti ako sam imao sprintf, naslov, a zatim niz tamo, 541 00:45:30,870 --> 00:45:36,660 to bi isprintati 2.jpg. 542 00:45:36,660 --> 00:45:41,020 Uz pretpostavku da sam zatvorio svoje datoteke ispravno, 543 00:45:41,020 --> 00:45:47,210 koji će sadržavati datoteku da sam bio pisanje van. 544 00:45:47,210 --> 00:45:50,320 No, jedna stvar je da kod koji imam ovdje 545 00:45:50,320 --> 00:45:53,360 ne sasvim zadovoljava ono pset zahtijeva. 546 00:45:53,360 --> 00:46:02,410 The pset zahtijeva da drugi JPEG datoteka treba biti imenovana 002 umjesto samo dvije. 547 00:46:02,410 --> 00:46:09,160 Dakle, kada ste ispisali ime, onda možda možda želite promijeniti rezervirano blago. 548 00:46:09,160 --> 00:46:18,140 >> Se bilo tko sjetiti kako smo omogućiti dodatne prostore kada smo ispisali nešto? 549 00:46:18,140 --> 00:46:22,530 Da. >> [Student] Ti staviti tri posto između znaka i dva. >> Da, savršena. 550 00:46:22,530 --> 00:46:25,610 Vi ćete staviti tri u ovom slučaju, jer želimo prostor za tri. 551 00:46:25,610 --> 00:46:32,590 % 3d vjerojatno će vam dati 002.jpg umjesto dva. 552 00:46:32,590 --> 00:46:40,120 Prvi argument u funkciji sprintf je zapravo char array, 553 00:46:40,120 --> 00:46:42,520 koje smo ranije poznavali kao žice. 554 00:46:42,520 --> 00:46:50,700 Oni volja, vrsta više kao privremeno skladištenje, samo pohraniti rezultanta niz. 555 00:46:50,700 --> 00:46:54,950 Vi stvarno ne će se baviti s tim, ali morate ga uključiti. 556 00:46:54,950 --> 00:47:00,710 >> Znajući da je svaki naziv datoteke ima broj, koji traje do tri znaka, 557 00:47:00,710 --> 00:47:06,770 i onda. jpg, koliko dugo treba ovo polje biti? 558 00:47:09,070 --> 00:47:14,310 Izbacite broj. Koliko znakova u naslovu, u ime? 559 00:47:18,090 --> 00:47:26,320 Dakle, tu je tri hashtags, razdoblje, jpg. >> [Student] 7. >> 7. Nije baš. 560 00:47:26,320 --> 00:47:32,000 Mi ćemo htjeti 8 jer želimo omogućiti null terminator kao dobro. 561 00:47:45,340 --> 00:47:49,730 >> Konačno, samo izvući proces koji ćete biti događaj za oporavak, 562 00:47:49,730 --> 00:47:55,420 imate neki početak informacije. 563 00:47:55,420 --> 00:48:02,460 Vi se nastaviti sve dok vam početak JPEG datoteku, 564 00:48:02,460 --> 00:48:07,900 i da može biti ili jedan od dva počevši sekvenci. 565 00:48:07,900 --> 00:48:12,510 Možete držati na čitanje. Svaki udarac ovdje predstavlja 512 bajtova. 566 00:48:12,510 --> 00:48:22,630 Možete zadržati na čitanju, držati na čitanje sve dok se susretnete drugu početnu sekvencu. 567 00:48:22,630 --> 00:48:29,790 Nakon što su to, na kraju tekućeg JPEG - u ovom slučaju, to je crveni, 568 00:48:29,790 --> 00:48:31,030 tako da želite završiti to. 569 00:48:31,030 --> 00:48:35,540 Želite sprintf ime koje u svoj pset4 mapu, 570 00:48:35,540 --> 00:48:41,580 onda želite otvoriti novu JPEG i onda držati na čitanje 571 00:48:41,580 --> 00:48:46,370 dok naiđete sljedeći. 572 00:48:46,370 --> 00:48:49,040 Imajte na čitanje, držati na čitanje, 573 00:48:49,040 --> 00:48:56,290 i onda na kraju, na kraju, ti ćeš do kraja datoteke, 574 00:48:56,290 --> 00:49:00,360 i tako ćete želite zatvoriti posljednji JPEG da ste radili s, 575 00:49:00,360 --> 00:49:08,380 sprintf da u svoj pset4 mapu, a zatim pogledate sve slike koje ste stečen. 576 00:49:08,380 --> 00:49:12,050 Te slike su zapravo slike CS50 osoblja, 577 00:49:12,050 --> 00:49:16,430 pa to je gdje je dio bonus zabavno od pset dolazi u 578 00:49:16,430 --> 00:49:26,310 je da se natječu u odjeljcima pronaći TFS u slikama 579 00:49:26,310 --> 00:49:34,610 i fotografirati se s njima dokazati da ste učinili pset 580 00:49:34,610 --> 00:49:37,030 i tako možete vidjeti koji su članovi osoblja su na slikama. 581 00:49:37,030 --> 00:49:41,510 Pa onda se slika s osobljem. Ponekad ćete morati da ih potjerati dolje. 582 00:49:41,510 --> 00:49:44,680 Vjerojatno neki od njih će pokušati pobjeći od vas. 583 00:49:44,680 --> 00:49:47,320 Možete slikati s njima. 584 00:49:47,320 --> 00:49:51,190 To je u tijeku. To nije zbog kada pset je zbog. 585 00:49:51,190 --> 00:49:53,340 Rok će biti objavljen u spec.. 586 00:49:53,340 --> 00:49:58,060 Tada zajedno sa svojim poglavlju, ovisno o tome što dio traje najviše slika 587 00:49:58,060 --> 00:50:04,430 s najviše članova osoblja će pobijediti prilično strašan nagradu. 588 00:50:04,430 --> 00:50:08,890 To je vrsta poticaja da biste dobili vaše pset4 završio što je brže moguće 589 00:50:08,890 --> 00:50:10,820 jer tada možete dobiti na posao 590 00:50:10,820 --> 00:50:14,570 lov dolje sve različite CS50 članova osoblja. 591 00:50:14,570 --> 00:50:17,500 To nije obavezno, ipak, tako da nakon što ste dobili slike, 592 00:50:17,500 --> 00:50:20,310 onda ste gotovi s pset4. 593 00:50:20,310 --> 00:50:23,970 >> I ja sam završio s četiri prohod, pa hvala vam svima što ste došli. 594 00:50:23,970 --> 00:50:29,330 Sretno s forenzika. [Pljesak] 595 00:50:29,330 --> 00:50:31,000 [CS50.TV]