>> [MUSIK SPELA]
>> ZAMYLA CHAN: Låt oss blåsa upp saker med resize.
I storleksändring, kommer användaren att passera in via kommandoraden, en bitmappsbild som
de vill att du ska skala av ett antal att de också passera i,
på kommandoraden.
Hur gör vi detta?
>> Tja, det viktigaste först, låt oss dela upp det i steg.
Du kommer att vilja öppna infil att de ger dig, liksom
skapa och öppna utfil som du kommer att sätta den
ändrade bilden i.
Sedan, eftersom du ändra storlek, och eftersom det är en bitmapp, en rubrik, så
ska du också uppdatera sidhuvudet Information för utfil,
och skriva det i.
Då du kommer att läsa in den scanlinje av infil,
pixel-för-pixel, ändra storlek horisontellt och skriva dessa pixlar till den
utfil, såsom anges av användarens skala.
>> Du kommer att komma ihåg att lägga stoppning som behövs.
Mer om det senare.
Och sedan, också ändra storlek vertikalt.
OK.
Så det här kommer att vara lite mer komplicerat än Vem gjort det, men
vad är liknande är att copy.c kommer, återigen, vara mycket användbar.
Kom ihåg att copy.c öppnar en fil, uppdaterar informationen header för
utfil, läser sedan in i scanline, pixel-för-pixel, skriva varje pixel
i utdatafilen s scanline.
>> Så återigen, ditt första steg kan nog vara att cp, copy.c, resize.c
in i din PSET5 katalog.
Kom dock ihåg, innan du kopierar den, att se till att du förstår
copy.c mycket noggrant.
OK.
>> Så låt oss öppna en fil.
Du vet hur man gör det.
Jag kommer att lämna det till dig.
Därefter uppdatera rubrikinformation för utfil.
Eftersom vi har en ny bitmapp, Vi har ny header info.
Vad är det som förändras här?
Tja, är filstorleken kommer att förändras eftersom vi kommer att ha mer
bildpunkter än tidigare.
Bildstorleken är, alltså, även kommer att förändras, så är det
bredd och höjd.
>> Så vilka variabler som är de, egentligen?
Tja, om man tittar in i sidhuvudet information finns du finns
biSizeImage, vilket representerar det totala storleken på bilden i byte,
inklusive pixlar och stoppning.
biWidth är bredden av bilden i pixlar, minus stoppning.
biHeight är höjden av bildpunkter.
Och så de som finns i structs BITMAPFILEHEADER och
BITMAPINFOHEADER.
Du kan tala om vilken som är vilken av kommer att bmp.h och titta på
BITMAPINFOHEADER struct och seende vilka variabler som är listade där.
>> Så för att uppdatera outfiles header informationen, du kommer att vilja
ändra dessa värden på höjd och bredd.
Men risken är, kanske du behöver lite av infil s rubrikinformation
senare, så bäst att hålla reda på båda.
Men var mycket tydlig med din variabel namn så att du inte av misstag
skriver de felaktiga värden i rubriken för utfil.
>> Så nu ska vi komma till att läsa in den scanline pixel-för-pixel.
Återigen, vi kommer att vända sig till vår trogna fil I / O-bibliotek, och titta på
den fread funktion.
fread tar in en pekare till en struct som kommer att innehålla de bytes som
du läser in, storleken på varje element som du läser -
igen, sizeof kommer att vara användbar fungera här, numret på den
element av storlek, storlek, att du är läsa in, och sedan slutligen den
inpointer, den fil som du läser från.
Så du tar antal element av storlek från inpointer och
sätta dem i data.
>> Nu är det dags att ändra storlek horisontellt.
om n är lika med 2, då för varje pixel i den infil, vi kommer att skriva den
två gånger i utfil.
Hur ska vi skriva filer?
Tja, vi har fwrite funktion, så Vi har tagit pekaren till struct
som innehåller de bytes som du är skriver från, och då vi passerar in
storlek, antal, och utsignalen, där du kommer att skriva det.
Och sedan upprepa en process, kommer att vara kan en enkel iterativ för slinga.
>> Men vi måste komma ihåg att lägga stoppning i.
Begreppet stoppning är att, ja, varje pixel är tre tuggor, men det
storleken på varje scanline must vara en multipel av 4 byte.
Så om antalet pixlar är inte multipel av 4, måste vi lägga till några
stoppning, som ligger bara nollor.
Nu, till skillnad vem gjort det, och till skillnad från kopia, då infil bilden och den
utfil fil har olika har annorlunda stoppning för att de är
olika bredder.
>> OK.
Så kanske en formel skulle komma väl till pass här.
Jag lämnar det till dig att hitta det, men säga att, att skriva stoppning,
bra, det är bara en enkel fputc funktion, passerar i karaktären
som du vill skriva, och sedan filpekaren att du
vill skriva till.
Så nu när vi har storleksändras vågrätt, och sedan används stoppning,
kom ihåg att du måste flytta din fil lägesindikator, eftersom du
kan inte fread in stoppning.
Så du vill vara säker på att filen lägesindikering i infil
är vid den korrekta punkten.
Eftersom vi även vill ändra storlek vertikalt.
Vi kan inte bara sträcka ut den horisontellt, eftersom varje rad behov
som ska kopieras N gånger.
>> Nu finns det flera olika sätt att göra detta.
Så en, kan vi använda en omskrivningsmetod, i att vi minns alla de pixlar
av en given rad i en matris, och då skriver vi att array som
många gånger som behövs.
Eller finns det kopieras igen metod där, efter att ha läst i en rad i infil
och sedan skriva in det i utfil, tillsats av den stoppning, vi fseek
tillbaka till början av den ursprungliga raden, och sedan upprepa den horisontella
storleksändring därifrån.
Oavsett vilken metod, men, du ska vill att varje bildpunkt ska upprepas
n gånger, och varje rad för att vara upprepas n gånger också.
>> Med det får du bitmapp större än livet.
Mitt namn är Zamyla, och detta är CS50.