>> [Musikgengivelse]
>> ZAMYLA CHAN: Lad os slag tingene op med resize.
I resize, vil brugeren passere i gennem kommandolinjen, en bitmap billede,
de vil have dig til at skalere med en række at de også passere,
i kommandolinjen.
Hvordan gør vi det?
>> Nå, første ting først, lad os opdele det i trin.
Du vil ønsker at åbne infile at de giver dig, såvel som
skabe og åbn outfile der du kommer til at sætte
ændrede billede i.
Så fordi du resizing, og fordi det er en bitmap, det en overskrift, så
du vil også opdatere header oplysninger til outfile,
og skrive, at i.
Så du kommer til at læse i Den scanlinie af infile,
pixel-for-pixel, resizing vandret og skrive de pixels i
outfile, som specificeret af brugerens skala.
>> Du kommer til at huske at tilføje polstring nødvendigt.
Mere om det senere.
Og så også ændre størrelsen lodret.
OK.
Så dette vil være en lille smule mere kompliceret end Hvem gjort det, men
hvad der er ens, er, at copy.c vil, igen, vise sig meget nyttig.
Husk, at copy.c åbner en fil, opdaterer oplysninger om headeren
outfile, læser derefter ind i scanlinie, pixel-for-pixel, skrive hver pixel
i uddatafilens scanlinie.
>> Så igen, dit første skridt ville sandsynligvis være at cp, copy.c, resize.c
ind i din PSET5 bibliotek.
Husk dog, før du kopierer det, at sikre, at du forstår
copy.c meget grundigt.
OK.
>> Så lad os åbne en fil.
Du ved, hvordan man gør det.
Jeg har tænkt mig at overlade til dig.
Dernæst opdatere oplysningerne header for outfile.
Fordi vi har en ny bitmap, Vi har nye header info.
Hvad ændrer sig her?
Nå, er filstørrelsen kommer til at ændre fordi vi vil have mere
pixels end før.
Billedet størrelse er således også kommer til at ændre, som det er
bredden og højden.
>> Så hvilke variable er dem, helt præcist?
Tja, hvis du kigger ind i header information, du ser der er
biSizeImage, der repræsenterer det samlede billedets størrelse i byte,
herunder pixels og polstring.
biWidth er bredden af ​​billedet i pixels minus polstring.
biHeight er højden af billedet i pixels.
Og så dem, der er indeholdt i structs BITMAPFILEHEADER og
BITMAPINFOHEADER.
Du kan fortælle hvilken en der er ved kommer til at bmp.h og kigge på
BITMAPINFOHEADER struct og seeing hvilke variable, er optaget dér.
>> Så for at opdatere outfiles header information, du vil ønsker at
ændre disse værdier af højden og bredden.
Men chancerne er, du måske brug for nogle af infile overskrift information
senere, så bedst at holde styr på begge.
Men vær meget klar med din variabel navne, så du ikke ved et uheld
skriver de forkerte værdier i header for outfile.
>> Så lad os nu komme til at læse ind i den scanlinie pixel-for-pixel.
Igen, vi kommer til at henvende sig til vores trofaste fil I / O-bibliotek, og se på
den fread funktion.
fread tager i en pointer til en struct , der skal indeholde de byte, der
du læser i, størrelsen af ​​hver element, du læser -
igen, sizeof vil være nyttig fungere her antallet af
elementer af størrelse, størrelse, at du er læsning i, og endelig
inpointer, den fil, du læser fra.
Så du tager antal elementer størrelse fra inpointer og
sætte dem i data.
>> Nu er det tid til at ændre størrelsen vandret.
hvis n er lig med 2 og derefter for hver pixel i den infile, vi kommer til at skrive det
to gange i outfile.
Hvordan kan vi skrive filer?
Tja, vi har den fwrite funktion, så vi har taget pointer til struct
der indeholder de bytes, at du er skriver fra, og så må vi passere i
størrelse, antal, og output, hvor du kommer til at skrive det.
Og derefter at gentage en proces, vil være kunne et simpelt iterativ for loop.
>> Men vi er nødt til at huske at tilføje polstring i.
Begrebet polstring er at, ja, hver pixel er tre bites, men
størrelsen af ​​hver scanlinie must være et multiplum af 4 byte.
Så hvis antallet af pixels er ikke multiplum af 4, er vi nødt til at tilføje nogle
polstring, der er kun nuller.
Nu, i modsætning Hvem gjort det, og i modsætning til kopi, så infile billede og
outfile fil har forskellige har anderledes polstring, fordi de er
forskellige bredder.
>> OK.
Så måske en formel ville komme i handy her.
Jeg vil overlade det til dig at finde ud af det, men fortælle dig, at for at skrive polstring,
godt, det er bare en simpel fputc funktion, passerer tegnet
at du ønsker at skrive, og derefter filpointeren, du
ønsker at skrive til.
Så nu, at vi har ændret størrelse horisontalt, og derefter anvendes polstring,
husk at du skal flytte din fil position indikator, fordi du
kan ikke fread i polstring.
Så du vil være sikker på, at din fil position indikator i infile
er på det rigtige tidspunkt.
Fordi vi ønsker også at resize lodret.
Vi kan ikke bare strække det vandret, fordi hver række behov
skal kopieres n gange.
>> Nu er der flere forskellige måder at gøre dette.
Så en, kan vi bruge en omskrivning metode, i at vi husker alle de pixels
en given række i et array, og så vi skriver, at array som
mange gange som nødvendigt.
Eller der er den igen kopiere metoden, hvor efter at have læst i en række i infile
og derefter skrive det ind i outfile, tilsætning af polstring, vi fseek
tilbage til starten af ​​den oprindelige række, og derefter gentage den vandrette
størrelsesændring derfra.
Uanset hvilken metode, selv om, vil du ønsker hver pixel skal gentages
n gange, og hver række til at være gentaget n gange så godt.
>> Med det, vil du have bitmap større end livet.
Mit navn er Zamyla, og det er CS50.