>> [Speel van musiek]
>> ZAMYLA CHAN: Kom ons hou dinge met resize.
In die grootte, sal die gebruiker slaag, via die opdrag lyn, 'n bitmap beeld wat
hulle wil hê jy te skaal deur 'n aantal dat hulle ook slaag in,
in die command line.
Hoe doen ons dit?
>> Wel, in die eerste dinge eerste, laat ons breek dit af in stappe.
Jy gaan wil die infile oop te maak dat hulle vir jou, asook
skep en maak die outfile wat jy gaan sit die
verklein beeld in
Dan, omdat jy die grootte en want dit is 'n bitmap, dit 'n kop, so
jy gaan ook die kop werk inligting vir die outfile,
en skryf wat in
Dan, jy gaan te lees in die scanline van die infile,
pixel-by-pixel, vergroot horisontaal en skryf die pixels in die
outfile, soos deur die gebruiker se skaal.
>> Jy gaan om te onthou voeg padding as dit nodig is.
Meer oor dit later.
En dan, ook vertikaal grootte.
OK.
So dit gaan 'n bietjie meer wees ingewikkeld as wat dit gedoen het nie, maar
wat is soortgelyk is dat copy.c sal, weer, bewys dat baie nuttig.
Onthou dat copy.c 'n lêer oopmaak, updates die kop inligting vir die
outfile, lees dan in die scanline, pixel-by-pixel, skryf elke pixel
in die uitvoer lêer se scanline.
>> So weer, jou eerste stap mag dalk wees om te vergelyk, copy.c, resize.c
in jou PSET5 gids.
Onthou egter, voordat jy dit kopieer, om seker te maak dat jy verstaan
copy.c baie deeglik.
OK.
>> So laat ons 'n lêer oop te maak.
Jy weet hoe om dit te doen.
Ek gaan om dit te laat vir julle.
Volgende, die kop inligting by te werk vir die outfile.
Want ons het 'n nuwe bitmap, Ons het 'n nuwe header info.
Wat hier om te verander?
Wel, is die grootte van die lêer gaan verander want ons gaan om meer te hê
pixels as tevore.
Die beeld grootte is dus ook gaan verander, soos in die
breedte en die hoogte.
>> So wat veranderlikes is daardie presies?
Wel, as jy kyk na die kop inligting, jy sien daar is
biSizeImage, wat die totaal verteenwoordig grootte van die beeld in grepe,
insluitend pixels en padding.
biWidth is die breedte van die beeld in pixels, minus die padding.
biHeight is die hoogte van die beeld in pixels.
En so diegene is vervat in die structs BITMAPFILEHEADER en
BITMAPINFOHEADER.
Jy kan jou vertel watter een is wat deur gaan bmp.h en kyk na die
BITMAPINFOHEADER struct en sien watter veranderlikes is daar gelys.
>> So het die outfiles kop te werk inligting, gaan jy wil
daardie waardes van die verandering hoogte en die wydte.
Maar die kanse is, kan jy 'n paar van die infile se kop inligting
later, so die beste om tred te hou van beide.
Maar baie duidelik met veranderlike name, sodat jy nie per ongeluk
skryf die verkeerde waardes in die kop vir die outfile.
>> So nou laat ons kry om te lees in die scanline pixel-by-pixel.
Weereens, ons gaan om te draai na ons betroubare lêer I / O-biblioteek en kyk na
die fread funksie.
fread neem in 'n verwysing na 'n struct dat die grepe sal bevat wat
jy in die lees van die grootte van elke element wat jy lees -
weer, is sizeof gaan nuttig te wees funksioneer hier, die nommer van die
elemente van grootte, grootte, dat jy lees in, en dan uiteindelik, die
inpointer, die lêer wat jy lees van.
So jy neem aantal elemente grootte van inpointer, en
om hulle in die data.
>> Nou is dit tyd om horisontaal grootte.
As n gelyk 2, dan vir elke pixel in die infile, ons gaan om dit te skryf
twee keer in die outfile.
Hoe kan ons skryf lêers?
Wel, ons het die fwrite funksie, so ons het die wyser geneem om die struct
wat bevat die grepe wat jy skryf van, en dan slaag ons in
grootte, aantal, en die uitset, waar jy gaan om te word wat skryf.
En dan 'n proses te herhaal, sal 'n eenvoudige herhalende vir lus.
>> Maar ons moet onthou padding te voeg in
Die konsep van padding is dat, wel, elke pixel is drie byt nie, maar die
grootte van elke scanline moet 'n veelvoud van 4 grepe.
So as die aantal pixels is nie 'n veelvoud van 4, moet ons 'n paar by te voeg
padding, wat net nulpunte.
Nou, in teenstelling met wat dit gedoen het, en in teenstelling met kopie, dan infile beeld en die
outfile lêer het verskillende hê verskillende padding, want hulle is
verskillende breedtes.
>> OK.
So miskien 'n formule sou handig te pas kom hier.
Ek laat dit aan jou om dit uit te vind nie, maar vertel dat, padding om te skryf,
Wel, dit is net 'n eenvoudige fputc funksie, verby in die karakter
wat jy wil skryf, en dan die lêer wyser dat jy
wil skryf.
So nou dat ons horisontaal verklein, en dan gebruik padding,
onthou dat jy jou lêer te skuif posisie aanwyser, want jy
kan nie fread in padding.
So jy wil om seker te maak dat jou lêer posisie aanwyser in die infile
is op die regte punt.
Omdat ons wil ook grootte vertikaal.
Ons kan nie net strek horisontaal, want elke ry behoeftes
gekopieer n keer.
>> Nou, daar is 'n paar verskillende maniere om dit te doen nie.
So een is, kan ons 'n herskryf metode te gebruik, in dat ons almal onthou van die pixels
van 'n gegewe ry in 'n skikking, en dan skryf ons dat skikking as
soveel keer as wat nodig is.
Of is daar die recopy metode waar, na die lees in 'n ry in die infile
en dan skryf wat in die outfile, die toevoeging van die padding, ons fseek
terug na die begin van die oorspronklike ry, en dan herhaal die horisontale
die grootte van daar af.
Ongeag die metode, al is, sal jy wil elke pixel te herhaal word
n keer, en elke ry te wees herhaal n keer so goed.
>> Met dit, sal jy bitmap het groter as die lewe.
My naam is Zamyla, en dit is CS50.