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