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