[Muziek] ZAMYLA CHAN: Let's klap dingen met resize. In resize, zal de gebruiker pas in, via de afbeelding een bitmap command line, dat ze willen dat je schalen door een aantal dat ze ook pas in, in de opdrachtregel. Hoe doen we dat? Nou, first things first, laten we breken deze naar beneden in stappen. Je gaat te willen om de infile openen dat ze je geven, evenals maken en open de outfile dat je gaat zet de bijgewerkte opname in Dan, omdat je resizen, en omdat het een bitmap, het een header, dus je gaat ook de header te werken informatie voor de outfile, en schrijf dat binnen Dan zul je lezen in de scanline van de infile, pixel-voor-pixel, resizen horizontaal en het schrijven van de pixels in de outfile, zoals gespecificeerd door de schaal van de gebruiker. Je gaat denken om voeg opvulling nodig. Daarover later meer. En dan, ook verticaal formaat. OK. Dus dit gaat een beetje meer zijn ingewikkelder dan Who Done It, maar wat vergelijkbaar is dat copy.c zal, nogmaals, blijken zeer nuttig. Vergeet niet dat copy.c opent een bestand, actualiseert de header-informatie voor de outfile, dan leest in de scanline, pixel voor pixel, schrijven elke pixel in scanline de output bestand. Dus nogmaals, je eerste stap zou waarschijnlijk zijn om cp, copy.c, resize.c in uw PSET5 directory. Vergeet echter niet, voordat u het kopiƫren, om ervoor te zorgen dat u begrijpt copy.c zeer grondig. OK. Dus laten we een bestand te openen. Je weet hoe dat te doen. Ik ga laat dat aan jou. Vervolgens werken de header-informatie voor de outfile. Want we hebben een nieuwe bitmap, we hebben nieuwe header info. Wat is hier het veranderen? Nou, de bestandsgrootte gaat veranderen want we gaan naar meer hebben pixels dan voorheen. Het beeldformaat is dus ook gaat veranderen, zoals het breedte en hoogte. Dus welke variabelen zijn die precies? Nou, als je kijkt in de header informatie, zie je er biSizeImage, wat het totaal vertegenwoordigt grootte van de afbeelding in bytes, inclusief pixels en opvulling. biWidth is de breedte van het beeld in pixels, minus de padding. biHeight is de hoogte van de afbeelding in pixels. En dus die zijn opgenomen in de structs BITMAPFILEHEADER en BITMAPINFOHEADER. U kunt vertellen welke is welke door gaat bmp.h en kijken naar de BITMAPINFOHEADER struct en zien welke variabelen zijn vermeld. Dus om de outfiles header updaten informatie, je gaat te willen de waarden van de te wijzigen hoogte en de breedte. Maar de kans is, zou je wat nodig hebt van header informatie de infile's later, dus het beste om bij te houden van beide. Maar wees heel duidelijk met uw variabele namen, zodat je niet per ongeluk schrijf de onjuiste waarden in de header voor de outfile. Dus nu laten we aan het lezen in de scanline pixel voor pixel. Nogmaals, we gaan te wenden tot onze trouwe file I / O-bibliotheek, en kijk naar de fread functie. fread neemt in een pointer naar een struct dat zal de bytes bevatten dat je leest in, de grootte van elk element dat u nu leest - opnieuw wordt sizeof zal nuttig zijn functie hier het aantal elementen van grootte, omvang, dat je lezen in, en uiteindelijk, de inpointer, het bestand dat je leest uit. Dus je neemt het aantal elementen van grootte van inpointer, en ze in de gegevens. Nu is het tijd om horizontaal formaat. wanneer n gelijk is aan 2, dan worden voor elke pixel in de infile, we gaan om het te schrijven twee keer in de outfile. Hoe gaan we bestanden weg te schrijven? Nou, we hebben de fwrite functie, zodat we hebben de aanwijzer genomen om de structuur dat de bytes die je bent bevat het schrijven van, en dan gaan we in grootte, aantal en de uitgang, waar je gaat worden schriftelijk. En vervolgens op een werkwijze herhalen, zal staat een eenvoudige iteratieve lus. Maar we moeten niet vergeten padding voegen inch Het concept van de vulling is dat goed, elke pixel drie beten, maar de grootte van elk scanline must zijn een veelvoud van 4 bytes. Dus als het aantal pixels is geen veelvoud van 4, moeten we een aantal voegen padding, dat is gewoon nullen. Nu, in tegenstelling Wie Done It, en in tegenstelling tot kopie, dan infile imago en de outfile bestand hebben verschillende hebben verschillende vulling omdat ze wijdtes. OK. Dus misschien een formule zou komen hier goed van pas. Ik zal het aan u om het te vinden, maar u vertellen dat, om padding schrijven, goed, het is gewoon een simpele fputc functie, passeren in de aard dat u wilt schrijven, en vervolgens de file pointer die je willen schrijven. Dus nu hebben we horizontaal aangepast, en vervolgens gebruikt padding, vergeet niet dat je nodig hebt om uw bestand te verplaatsen positie-indicator, omdat je kan niet fread in padding. Dus wilt u ervoor zorgen dat uw bestand positie-indicator in de infile is op het juiste moment. Omdat we willen ook resize verticaal. We kunnen niet zomaar uitrekken horizontaal, omdat elke rij behoeften n keer te kopiƫren. Nu zijn er verschillende manieren om dit te doen. Zodat men, kunnen we een rewrite gebruiken, in dat we niet vergeten alle pixels van een bepaalde rij in een array, en dan schrijven we dat array als vaak als nodig. Of er is de recopy methode waarbij, na het lezen in een rij in de infile en dan schrijven dat in de outfile, het toevoegen van de vulling, we fseek terug naar het begin van de oorspronkelijke regel, en herhaal de horizontale resizen van daar. Ongeacht de methode, maar, zult u wil dat elke pixel worden herhaald n keer, en elke rij om herhaald n keer ook. Met dat, zul je bitmap hebt groter dan het leven. Mijn naam is Zamyla, en dit is CS50.