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