1 00:00:00,000 --> 00:00:10,210 >> [Musikk spilles] 2 00:00:10,210 --> 00:00:13,320 >> ZAMYLA CHAN: La oss blåse ting opp med resize. 3 00:00:13,320 --> 00:00:17,710 I resize, vil brukeren gå inn, via kommandolinjen, et punktgrafikkbilde som 4 00:00:17,710 --> 00:00:21,860 de vil ha deg til å skalere av en rekke at de også passere i, 5 00:00:21,860 --> 00:00:23,770 i kommandolinjen. 6 00:00:23,770 --> 00:00:24,690 Hvordan gjør vi dette? 7 00:00:24,690 --> 00:00:28,270 >> Vel, første ting først, la oss bryte dette ned i skritt. 8 00:00:28,270 --> 00:00:31,510 Du kommer til å ønske å åpne infile at de gir deg, samt 9 00:00:31,510 --> 00:00:35,560 opprette og åpne filen som du kommer til å sette 10 00:00:35,560 --> 00:00:38,020 erte bildet i. 11 00:00:38,020 --> 00:00:42,050 Så, fordi du endre størrelse, og fordi det er en bitmap, det en header, så 12 00:00:42,050 --> 00:00:46,080 du kommer til å også oppdatere header informasjon for den outfile, 13 00:00:46,080 --> 00:00:47,950 og skrive det i. 14 00:00:47,950 --> 00:00:51,850 Deretter kommer du til å lese inn den scanline av infile, 15 00:00:51,850 --> 00:00:56,890 piksel-for-piksel, endre størrelse horisontalt og skrive disse piksler inn i 16 00:00:56,890 --> 00:01:00,910 outfile, som spesifisert av brukerens skala. 17 00:01:00,910 --> 00:01:03,940 >> Du kommer til å huske å legge polstring som nødvendig. 18 00:01:03,940 --> 00:01:05,400 Mer om det senere. 19 00:01:05,400 --> 00:01:07,790 Og så, også endre størrelsen vertikalt. 20 00:01:07,790 --> 00:01:08,890 OK. 21 00:01:08,890 --> 00:01:13,280 Så dette kommer til å være litt mer komplisert enn Hvem gjort det, men 22 00:01:13,280 --> 00:01:18,310 hva som er likt er at copy.c vil, igjen, vise seg svært nyttig. 23 00:01:18,310 --> 00:01:23,160 Husk at copy.c åpner en fil, oppdaterer informasjon header for den 24 00:01:23,160 --> 00:01:28,250 utfil, leses deretter inn i avsøkingslinje, pixel-for-pixel, skrive hver piksel 25 00:01:28,250 --> 00:01:30,510 inn i produksjonen filens scanline. 26 00:01:30,510 --> 00:01:37,040 >> Så igjen, din første trinnet kan trolig være å cp, copy.c, resize.c 27 00:01:37,040 --> 00:01:40,560 inn din PSET5 katalogen. 28 00:01:40,560 --> 00:01:43,920 Husk skjønt, før du kopierer det, å sørge for at du forstår 29 00:01:43,920 --> 00:01:46,600 copy.c svært grundig. 30 00:01:46,600 --> 00:01:47,620 OK. 31 00:01:47,620 --> 00:01:49,880 >> Så la oss åpne en fil. 32 00:01:49,880 --> 00:01:50,870 Du vet hvordan du gjør det. 33 00:01:50,870 --> 00:01:52,600 Jeg kommer til å la det til deg. 34 00:01:52,600 --> 00:01:56,050 Deretter oppdatere header informasjon for outfile. 35 00:01:56,050 --> 00:01:59,240 Fordi vi har en ny punktgrafikk, vi har ny header info. 36 00:01:59,240 --> 00:02:00,970 Hva endres her? 37 00:02:00,970 --> 00:02:06,000 Vel, er filstørrelsen kommer til å endre fordi vi kommer til å ha mer 38 00:02:06,000 --> 00:02:07,900 piksler enn før. 39 00:02:07,900 --> 00:02:11,060 Bildestørrelsen er dermed også kommer til å forandre seg, så er det 40 00:02:11,060 --> 00:02:13,050 Bredden og høyden. 41 00:02:13,050 --> 00:02:17,180 >> Så hvilke variabler er de, egentlig? 42 00:02:17,180 --> 00:02:20,960 Vel, hvis du ser inn i header informasjon, ser du det er 43 00:02:20,960 --> 00:02:25,640 biSizeImage, som representerer den totale størrelsen på bildet i byte, 44 00:02:25,640 --> 00:02:28,340 inkludert piksler og polstring. 45 00:02:28,340 --> 00:02:32,520 biWidth er bredden av bildet i piksler, minus padding. 46 00:02:32,520 --> 00:02:35,580 biHeight er høyden av bildet i piksler. 47 00:02:35,580 --> 00:02:39,200 Og så de som finnes i structs BITMAPFILEHEADER og 48 00:02:39,200 --> 00:02:40,390 BITMAPINFOHEADER. 49 00:02:40,390 --> 00:02:45,300 Du kan fortelle hvilken som er hvilken av kommer til å bmp.h og ser på 50 00:02:45,300 --> 00:02:49,670 BITMAPINFOHEADER struct og seeing hvilke variabler som er oppført der. 51 00:02:49,670 --> 00:02:54,700 >> Så for å oppdatere outfiles header informasjon, du kommer til å ønske å 52 00:02:54,700 --> 00:02:57,025 endre disse verdier av Høyden og bredden. 53 00:02:57,025 --> 00:03:00,570 Men sjansene er, kanskje du trenger noen av infile header informasjon 54 00:03:00,570 --> 00:03:03,670 senere, så best å holde styr på begge. 55 00:03:03,670 --> 00:03:07,770 Men vær veldig tydelig med variabelen navnene slik at du ikke ved et uhell 56 00:03:07,770 --> 00:03:12,490 skrive de uriktige verdier i overskriften for outfile. 57 00:03:12,490 --> 00:03:16,160 >> Så nå la oss komme til å lese inn den scanline piksel-for-piksel. 58 00:03:16,160 --> 00:03:20,210 Igjen, vi kommer til å slå til vår trofaste fil I / O-bibliotek, og se på 59 00:03:20,210 --> 00:03:22,100 den fread funksjon. 60 00:03:22,100 --> 00:03:26,150 fread tar i en peker til en struct som skal inneholde de bytes som 61 00:03:26,150 --> 00:03:30,130 du leser i, størrelsen på hver element som du leser - 62 00:03:30,130 --> 00:03:34,410 igjen, er sizeof kommer til å være nyttig fungere her, nummeret på 63 00:03:34,410 --> 00:03:38,820 elementer av størrelse, størrelse, som du er lest inn, og så til slutt, 64 00:03:38,820 --> 00:03:41,310 inpointer, filen som du leser fra. 65 00:03:41,310 --> 00:03:46,770 Så du tar tallelementer av størrelse fra inpointer, og 66 00:03:46,770 --> 00:03:49,040 sette dem inn data. 67 00:03:49,040 --> 00:03:51,695 >> Nå er det på tide å endre størrelsen horisontalt. 68 00:03:51,695 --> 00:03:56,880 hvis n er lik 2, deretter for hver piksel i den infile, kommer vi til å skrive det 69 00:03:56,880 --> 00:04:00,870 to ganger i outfile. 70 00:04:00,870 --> 00:04:02,210 Hvordan kan vi skrive filer? 71 00:04:02,210 --> 00:04:06,400 Vel, vi har fwrite funksjon, så vi har tatt pekeren til struct 72 00:04:06,400 --> 00:04:10,170 som inneholder bytes som du er skriver fra, og da vi passerer i 73 00:04:10,170 --> 00:04:14,430 størrelse, antall, og output, der du kommer til å være å skrive det. 74 00:04:14,430 --> 00:04:19,200 Og deretter å gjenta en prosess, vil det bli stand en enkel iterativ for loop. 75 00:04:19,200 --> 00:04:21,740 >> Men vi må huske å legge polstring i. 76 00:04:21,740 --> 00:04:26,040 Konseptet med padding, er at, vel, hver piksel er tre biter, men den 77 00:04:26,040 --> 00:04:28,940 Størrelsen på hver scanline must være et multiplum av 4 byte. 78 00:04:28,940 --> 00:04:33,660 Så hvis antall piksler er ikke et multiplum av 4, må vi legge til noen 79 00:04:33,660 --> 00:04:36,630 padding, som ligger bare nuller. 80 00:04:36,630 --> 00:04:42,130 Nå, i motsetning Hvem gjort det, og i motsetning til kopi, så infile bildet og 81 00:04:42,130 --> 00:04:44,370 outfile fil har forskjellig ha forskjellig polstring fordi de er 82 00:04:44,370 --> 00:04:46,360 forskjellige bredder. 83 00:04:46,360 --> 00:04:46,690 >> OK. 84 00:04:46,690 --> 00:04:51,050 Så kanskje en formel ville komme til nytte her. 85 00:04:51,050 --> 00:04:55,120 Jeg skal overlate til deg å finne det ut, men fortelle deg det, å skrive padding, 86 00:04:55,120 --> 00:04:59,360 vel, det er bare en enkel fputc funksjon, bestått i tegn 87 00:04:59,360 --> 00:05:02,200 at du ønsker å skrive, og deretter filen peker som du 88 00:05:02,200 --> 00:05:04,280 ønsker å skrive til. 89 00:05:04,280 --> 00:05:08,670 Så nå som vi har endres vannrett, og deretter brukt padding, 90 00:05:08,670 --> 00:05:12,030 husk at du trenger å flytte filen posisjonsindikator, fordi du 91 00:05:12,030 --> 00:05:14,480 kan ikke fread inn padding. 92 00:05:14,480 --> 00:05:18,230 Så du vil være sikker på at filen posisjonsindikator i infile 93 00:05:18,230 --> 00:05:19,980 er på det riktige punkt. 94 00:05:19,980 --> 00:05:23,970 Fordi vi ønsker også å endre størrelse vertikalt. 95 00:05:23,970 --> 00:05:27,090 Vi kan ikke bare strekke det horisontalt, fordi hver rad behov 96 00:05:27,090 --> 00:05:30,370 som skal kopieres n ganger. 97 00:05:30,370 --> 00:05:33,050 >> Nå er det flere forskjellige måter å gjøre dette. 98 00:05:33,050 --> 00:05:39,010 Så ett, kan vi bruke en omskriving metode, i at vi husker alle pikslene 99 00:05:39,010 --> 00:05:42,840 av en gitt rad i en matrise, og Da skriver vi denne matrisen som 100 00:05:42,840 --> 00:05:44,730 mange ganger som nødvendig. 101 00:05:44,730 --> 00:05:49,530 Eller er det den recopy metode der, etter å ha lest i en rad i infile 102 00:05:49,530 --> 00:05:53,530 og deretter skrive det inn i outfile, legge til padding, vi fseek 103 00:05:53,530 --> 00:05:57,250 tilbake til starten av den opprinnelige rad og deretter gjenta den horisontale 104 00:05:57,250 --> 00:05:58,710 resizing derfra. 105 00:05:58,710 --> 00:06:02,280 Uavhengig av metode, men vil du vil hver piksel skal gjentas 106 00:06:02,280 --> 00:06:06,370 n ganger, og hver rad for å være gjentatt n ganger i tillegg. 107 00:06:06,370 --> 00:06:09,160 >> Med det, vil du ha bitmap større enn livet. 108 00:06:09,160 --> 00:06:11,760 Mitt navn er Zamyla, og dette er CS50. 109 00:06:11,760 --> 00:06:19,542