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