>> [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.