1 00:00:00,000 --> 00:00:10,210 >> [Glazba svira] 2 00:00:10,210 --> 00:00:13,320 >> ZAMYLA Chan: Idemo udarac stvari s stanovati. 3 00:00:13,320 --> 00:00:17,710 U stanovati, korisnik će proći u, putem naredbenog retka, uzorkovana slika koje 4 00:00:17,710 --> 00:00:21,860 hoće li na ljestvici po broju da i oni prođu, 5 00:00:21,860 --> 00:00:23,770 u zapovjednoj liniji. 6 00:00:23,770 --> 00:00:24,690 Kako ćemo to učiniti? 7 00:00:24,690 --> 00:00:28,270 >> Pa, krenimo redom, hajdemo razbiti ovaj dolje u koracima. 8 00:00:28,270 --> 00:00:31,510 Vi idete da želite otvoriti INFILE koji su ti dali, kao i 9 00:00:31,510 --> 00:00:35,560 stvoriti i otvoriti outfile da idete staviti 10 00:00:35,560 --> 00:00:38,020 mijenjati image u. 11 00:00:38,020 --> 00:00:42,050 Zatim, jer ste mijenjanje veličine, a zato što je bitmapa, to header, pa 12 00:00:42,050 --> 00:00:46,080 ti ćeš također ažurirati zaglavlje Informacije za outfile, 13 00:00:46,080 --> 00:00:47,950 i napisati da u. 14 00:00:47,950 --> 00:00:51,850 Zatim, ti ćeš čitati u scanline od infile, 15 00:00:51,850 --> 00:00:56,890 pixel-by-pixel, mijenjanje veličine vodoravno i pisanje tih piksela u 16 00:00:56,890 --> 00:01:00,910 outfile, kao što je navedeno korisnikovim skali. 17 00:01:00,910 --> 00:01:03,940 >> Ti ćeš se sjetiti dodavanje padding potrebi. 18 00:01:03,940 --> 00:01:05,400 Više o tome kasnije. 19 00:01:05,400 --> 00:01:07,790 A onda, također veličinu vertikalno. 20 00:01:07,790 --> 00:01:08,890 OK. 21 00:01:08,890 --> 00:01:13,280 Dakle, to će biti malo više kompliciranije nego Tko je to učinio, ali 22 00:01:13,280 --> 00:01:18,310 što je slično je da copy.c će, opet, bilo vrlo korisno. 23 00:01:18,310 --> 00:01:23,160 Zapamtite da copy.c otvara datoteku, ažurira podatke zaglavlju 24 00:01:23,160 --> 00:01:28,250 outfile, onda čita u scanline, pixel-by-pixel, pisanje svaki piksel 25 00:01:28,250 --> 00:01:30,510 u izlazne datoteke je scanline. 26 00:01:30,510 --> 00:01:37,040 >> Pa opet, vaš prvi korak bi se vjerojatno biti na SP, copy.c, resize.c 27 00:01:37,040 --> 00:01:40,560 u svoj PSET5 imenik. 28 00:01:40,560 --> 00:01:43,920 Sjeti se ipak, prije nego što ga kopirati, kako bi bili sigurni da ste razumjeli 29 00:01:43,920 --> 00:01:46,600 copy.c vrlo temeljito. 30 00:01:46,600 --> 00:01:47,620 OK. 31 00:01:47,620 --> 00:01:49,880 >> Tako ćemo otvoriti datoteku. 32 00:01:49,880 --> 00:01:50,870 Znate kako se to radi. 33 00:01:50,870 --> 00:01:52,600 Ja ću prepustiti vama. 34 00:01:52,600 --> 00:01:56,050 Dalje, ažurirati podatke u zaglavlju za outfile. 35 00:01:56,050 --> 00:01:59,240 Budući da imamo novi bitova, imamo novi header informacije. 36 00:01:59,240 --> 00:02:00,970 Ono što se mijenja ovdje? 37 00:02:00,970 --> 00:02:06,000 Pa, veličina datoteke će se promijeniti zato jer ćemo imati više 38 00:02:06,000 --> 00:02:07,900 piksela nego prije. 39 00:02:07,900 --> 00:02:11,060 Veličina slike je, dakle, također Promijenit će se, kao što je 40 00:02:11,060 --> 00:02:13,050 širina i visina. 41 00:02:13,050 --> 00:02:17,180 >> Dakle koje varijable su oni, točno? 42 00:02:17,180 --> 00:02:20,960 Pa, ako pogledate u zaglavlju Informacije, vidim da postoji 43 00:02:20,960 --> 00:02:25,640 biSizeImage, što predstavlja ukupno veličina slike u bajtovima, 44 00:02:25,640 --> 00:02:28,340 uključujući piksela i padding. 45 00:02:28,340 --> 00:02:32,520 biWidth je širina slike u pikselima, minus padding. 46 00:02:32,520 --> 00:02:35,580 biHeight je visina slike u pikselima. 47 00:02:35,580 --> 00:02:39,200 I tako one su sadržane u tvorevina BITMAPFILEHEADER i 48 00:02:39,200 --> 00:02:40,390 BITMAPINFOHEADER. 49 00:02:40,390 --> 00:02:45,300 Možete reći koje je što po će bmp.h i gledajući 50 00:02:45,300 --> 00:02:49,670 BITMAPINFOHEADER rekonstruirati i vidim koje su varijable na popisu ima. 51 00:02:49,670 --> 00:02:54,700 >> Dakle ažurirati outfiles zaglavlje Informacije, idete da želite 52 00:02:54,700 --> 00:02:57,025 promijeniti te vrijednosti Visina i širina. 53 00:02:57,025 --> 00:03:00,570 No, šanse su, možda trebate neke informacija zaglavlju infile-a 54 00:03:00,570 --> 00:03:03,670 kasnije, tako najbolje pratiti oboje. 55 00:03:03,670 --> 00:03:07,770 No, vrlo jasno s varijablom imena, tako da ne slučajno 56 00:03:07,770 --> 00:03:12,490 pisati netočne vrijednosti u header za outfile. 57 00:03:12,490 --> 00:03:16,160 >> Pa sad idemo na čitanje u scanline pixel-by-pixel. 58 00:03:16,160 --> 00:03:20,210 Opet, mi ćemo se okrenuti našim vjernim file I / O biblioteka, i pogledati 59 00:03:20,210 --> 00:03:22,100 fread funkcija. 60 00:03:22,100 --> 00:03:26,150 fread traje u pointer na struct koji će sadržavati bajtova koje 61 00:03:26,150 --> 00:03:30,130 što čitate u, veličina svakog element koji čitate - 62 00:03:30,130 --> 00:03:34,410 opet, sizeof će biti korisna funkcionirati ovdje, broj 63 00:03:34,410 --> 00:03:38,820 elementi veličine, veličine, da si čitanje u, a zatim konačno, 64 00:03:38,820 --> 00:03:41,310 inpointer, datoteka koja što čitate iz. 65 00:03:41,310 --> 00:03:46,770 Dakle, ti si uzimate broj elemenata veličine od inpointer, i 66 00:03:46,770 --> 00:03:49,040 stavljajući ih u podacima. 67 00:03:49,040 --> 00:03:51,695 >> Sada je vrijeme za promjenu veličine vodoravno. 68 00:03:51,695 --> 00:03:56,880 ako je n jednak 2, a zatim na svaki piksel infile, idemo to napisati 69 00:03:56,880 --> 00:04:00,870 dva puta u outfile. 70 00:04:00,870 --> 00:04:02,210 Kako ćemo pisati datoteke? 71 00:04:02,210 --> 00:04:06,400 Pa, imamo fwrite funkciju, pa uzeli smo pokazivač na struct 72 00:04:06,400 --> 00:04:10,170 koji sadrži bajtova koje ste pismenog, a onda ćemo proći u 73 00:04:10,170 --> 00:04:14,430 veličina, broj i izlaz, gdje je ti si idući u pisati da. 74 00:04:14,430 --> 00:04:19,200 A onda za ponavljanje postupka, bit će mogli jednostavno iterativni za petlju. 75 00:04:19,200 --> 00:04:21,740 >> No, moramo se sjetiti dodati padding u. 76 00:04:21,740 --> 00:04:26,040 Koncept padding je da, dobro, svaki piksel je tri uboda, već 77 00:04:26,040 --> 00:04:28,940 Veličina svakog scanline mošta biti višestruka od 4 bajta. 78 00:04:28,940 --> 00:04:33,660 Dakle, ako je broj piksela nije višekratnik broja 4, moramo dodati neke 79 00:04:33,660 --> 00:04:36,630 padding, što je samo nula. 80 00:04:36,630 --> 00:04:42,130 Sada, za razliku Tko je to učinio, a za razliku od kopija, onda infile slika i 81 00:04:42,130 --> 00:04:44,370 outfile datoteke su različite imaju drugačija padding, jer oni su 82 00:04:44,370 --> 00:04:46,360 različite širine. 83 00:04:46,360 --> 00:04:46,690 >> OK. 84 00:04:46,690 --> 00:04:51,050 Dakle, možda bi formula dobro doći ovdje. 85 00:04:51,050 --> 00:04:55,120 Ja ću ga ostaviti na vama je da to saznate, ali vam reći da, napisati padding, 86 00:04:55,120 --> 00:04:59,360 dobro, to je samo jednostavna funkcija fputc, prolazi u liku 87 00:04:59,360 --> 00:05:02,200 koji želite pisati, a zatim file pointer da 88 00:05:02,200 --> 00:05:04,280 želim pisati. 89 00:05:04,280 --> 00:05:08,670 Dakle, sada kada smo mijenjati vodoravno, a zatim koristiti padding, 90 00:05:08,670 --> 00:05:12,030 zapamtite da morate premjestiti svoje datoteke Pokazivač položaja, jer vam 91 00:05:12,030 --> 00:05:14,480 Ne možete fread u padding. 92 00:05:14,480 --> 00:05:18,230 Dakle, želite da biste bili sigurni da je vaš predmet Indikator položaja na infile 93 00:05:18,230 --> 00:05:19,980 je na ispravnom mjestu. 94 00:05:19,980 --> 00:05:23,970 Jer, mi također želimo veličinu vertikalno. 95 00:05:23,970 --> 00:05:27,090 Ne možemo ga se protežu vodoravno, jer svaki redak potrebe 96 00:05:27,090 --> 00:05:30,370 treba kopirati n puta. 97 00:05:30,370 --> 00:05:33,050 >> Sada, postoji nekoliko različitih načina za to. 98 00:05:33,050 --> 00:05:39,010 Tako je jedan, možemo koristiti metodu prepisivanja, u da se sjetimo svih piksela 99 00:05:39,010 --> 00:05:42,840 od obzirom red u niz, te onda ćemo napisati da je niz kao 100 00:05:42,840 --> 00:05:44,730 onoliko puta koliko je potrebno. 101 00:05:44,730 --> 00:05:49,530 Ili postoji metoda recopy gdje, nakon što je pročitao u jednom redu u infile 102 00:05:49,530 --> 00:05:53,530 a zatim pisao da je u outfile, Dodavanjem padding, mi fseek 103 00:05:53,530 --> 00:05:57,250 Natrag na početku izvorne redom, a zatim ponovite horizontalna 104 00:05:57,250 --> 00:05:58,710 mijenjanje veličine od tamo. 105 00:05:58,710 --> 00:06:02,280 Bez obzira na metodu, međutim, da ćete želite svaki piksel da se ponavlja 106 00:06:02,280 --> 00:06:06,370 n puta, i svaki redak se ponavlja n puta, kao dobro. 107 00:06:06,370 --> 00:06:09,160 >> Uz to, imat ćete bitmapa veći od života. 108 00:06:09,160 --> 00:06:11,760 Moje ime je Zamyla, a to je CS50. 109 00:06:11,760 --> 00:06:19,542