[Musikk spilles] ZAMYLA CHAN: La oss blåse ting opp med resize. I resize, vil brukeren gå inn, via kommandolinjen, et punktgrafikkbilde som de vil ha deg til å skalere av en rekke at de også passere i, i kommandolinjen. Hvordan gjør vi dette? Vel, første ting først, la oss bryte dette ned i skritt. Du kommer til å ønske å åpne infile at de gir deg, samt opprette og åpne filen som du kommer til å sette erte bildet i. Så, fordi du endre størrelse, og fordi det er en bitmap, det en header, så du kommer til å også oppdatere header informasjon for den outfile, og skrive det i. Deretter kommer du til å lese inn den scanline av infile, piksel-for-piksel, endre størrelse horisontalt og skrive disse piksler inn i outfile, som spesifisert av brukerens skala. Du kommer til å huske å legge polstring som nødvendig. Mer om det senere. Og så, også endre størrelsen vertikalt. OK. Så dette kommer til å være litt mer komplisert enn Hvem gjort det, men hva som er likt er at copy.c vil, igjen, vise seg svært nyttig. Husk at copy.c åpner en fil, oppdaterer informasjon header for den utfil, leses deretter inn i avsøkingslinje, pixel-for-pixel, skrive hver piksel inn i produksjonen filens scanline. Så igjen, din første trinnet kan trolig være å cp, copy.c, resize.c inn din PSET5 katalogen. Husk skjønt, før du kopierer det, å sørge for at du forstår copy.c svært grundig. OK. Så la oss åpne en fil. Du vet hvordan du gjør det. Jeg kommer til å la det til deg. Deretter oppdatere header informasjon for outfile. Fordi vi har en ny punktgrafikk, vi har ny header info. Hva endres her? Vel, er filstørrelsen kommer til å endre fordi vi kommer til å ha mer piksler enn før. Bildestørrelsen er dermed også kommer til å forandre seg, så er det Bredden og høyden. Så hvilke variabler er de, egentlig? Vel, hvis du ser inn i header informasjon, ser du det er biSizeImage, som representerer den totale størrelsen på bildet i byte, inkludert piksler og polstring. biWidth er bredden av bildet i piksler, minus padding. biHeight er høyden av bildet i piksler. Og så de som finnes i structs BITMAPFILEHEADER og BITMAPINFOHEADER. Du kan fortelle hvilken som er hvilken av kommer til å bmp.h og ser på BITMAPINFOHEADER struct og seeing hvilke variabler som er oppført der. Så for å oppdatere outfiles header informasjon, du kommer til å ønske å endre disse verdier av Høyden og bredden. Men sjansene er, kanskje du trenger noen av infile header informasjon senere, så best å holde styr på begge. Men vær veldig tydelig med variabelen navnene slik at du ikke ved et uhell skrive de uriktige verdier i overskriften for outfile. Så nå la oss komme til å lese inn den scanline piksel-for-piksel. Igjen, vi kommer til å slå til vår trofaste fil I / O-bibliotek, og se på den fread funksjon. fread tar i en peker til en struct som skal inneholde de bytes som du leser i, størrelsen på hver element som du leser - igjen, er sizeof kommer til å være nyttig fungere her, nummeret på elementer av størrelse, størrelse, som du er lest inn, og så til slutt, inpointer, filen som du leser fra. Så du tar tallelementer av størrelse fra inpointer, og sette dem inn data. Nå er det på tide å endre størrelsen horisontalt. hvis n er lik 2, deretter for hver piksel i den infile, kommer vi til å skrive det to ganger i outfile. Hvordan kan vi skrive filer? Vel, vi har fwrite funksjon, så vi har tatt pekeren til struct som inneholder bytes som du er skriver fra, og da vi passerer i størrelse, antall, og output, der du kommer til å være å skrive det. Og deretter å gjenta en prosess, vil det bli stand en enkel iterativ for loop. Men vi må huske å legge polstring i. Konseptet med padding, er at, vel, hver piksel er tre biter, men den Størrelsen på hver scanline must være et multiplum av 4 byte. Så hvis antall piksler er ikke et multiplum av 4, må vi legge til noen padding, som ligger bare nuller. Nå, i motsetning Hvem gjort det, og i motsetning til kopi, så infile bildet og outfile fil har forskjellig ha forskjellig polstring fordi de er forskjellige bredder. OK. Så kanskje en formel ville komme til nytte her. Jeg skal overlate til deg å finne det ut, men fortelle deg det, å skrive padding, vel, det er bare en enkel fputc funksjon, bestått i tegn at du ønsker å skrive, og deretter filen peker som du ønsker å skrive til. Så nå som vi har endres vannrett, og deretter brukt padding, husk at du trenger å flytte filen posisjonsindikator, fordi du kan ikke fread inn padding. Så du vil være sikker på at filen posisjonsindikator i infile er på det riktige punkt. Fordi vi ønsker også å endre størrelse vertikalt. Vi kan ikke bare strekke det horisontalt, fordi hver rad behov som skal kopieres n ganger. Nå er det flere forskjellige måter å gjøre dette. Så ett, kan vi bruke en omskriving metode, i at vi husker alle pikslene av en gitt rad i en matrise, og Da skriver vi denne matrisen som mange ganger som nødvendig. Eller er det den recopy metode der, etter å ha lest i en rad i infile og deretter skrive det inn i outfile, legge til padding, vi fseek tilbake til starten av den opprinnelige rad og deretter gjenta den horisontale resizing derfra. Uavhengig av metode, men vil du vil hver piksel skal gjentas n ganger, og hver rad for å være gjentatt n ganger i tillegg. Med det, vil du ha bitmap større enn livet. Mitt navn er Zamyla, og dette er CS50.