[Redare a muzicii] ZAMYLA CHAN: lovitură Să lucrurile cu redimensionare. În redimensionare, utilizatorul va trece în, prin linia de comandă, o imagine bitmap care ei doresc să scară de un număr că ei, de asemenea, trece in, în linia de comandă. Cum facem acest lucru? Ei bine, primele lucruri mai întâi, să rupe acest jos în pași. Ai de gând să doriți să deschideți infile că ei vă dau, precum și a crea și deschide outfile care ai de gând să pună imagine redimensionată inch Apoi, pentru ca esti de redimensionare, și pentru că este un bitmap, un antet, așa ai de gând să actualizeze, de asemenea, antetul informații pentru outfile, și să scrie că inch Apoi, ai de gând să citesc în scanline de infile, -pixel-cu-pixel, redimensionarea orizontal și scris aceste pixeli în outfile, așa cum este specificat de scala utilizatorului. Ai de gând să vă amintiți să adăugați umplutură este necesar. Mai multe despre asta mai târziu. Și apoi, de asemenea, redimensiona vertical. OK. Deci, acest lucru va fi un pic mai mult complicat decât Cine făcut-o, dar ceea ce este asemănător este că copy.c va fi, din nou, dovedi foarte util. Amintiți-vă că copy.c deschide un fișier, actualizează informațiile din antet pentru outfile, apoi citește în scanline, -pixel-cu-pixel, scriind fiecare pixel în scanline fișierul de ieșire a lui. Deci, din nou, primul pas ar putea, probabil, fie pentru cp, copy.c, resize.c în directorul PSET5. Amintiți-vă, deși, înainte să-l copiați, să vă asigurați că ați înțeles copy.c foarte bine. OK. Deci, haideți să deschidem un fișier. Știi cum să faci asta. Am de gând să las asta pentru tine. Apoi, să actualizeze informațiile din antet pentru outfile. Pentru că avem un nou bitmap, avem noi informatii antet. Ce se schimbă aici? Ei bine, dimensiunea fișierului se va schimba pentru că vom avea mai mult pixeli decât înainte. Dimensiunea imaginii este, astfel, de asemenea, va schimba, așa cum este Lățimea și înălțimea. Deci, care variabilele sunt cele, mai exact? Ei bine, dacă te uiți în antetul informații, te vedea acolo este biSizeImage, ceea ce reprezintă totalul dimensiune a imaginii în bytes, inclusiv pixeli și padding. biWidth este lățimea imaginii în pixeli, minus padding. biHeight este înălțimea de imaginea în pixeli. Și astfel cei care sunt cuprinse în structs BITMAPFILEHEADER și BitmapInfoHeader. Pot să vă spun care este cel care, prin O să bmp.h și se uită la Struct BitmapInfoHeader și văzând care variabilele sunt enumerate acolo. Deci, pentru a actualiza antetul outfiles informații, ai de gând să doriți să schimba aceste valori ale înălțimea și lățimea. Dar sunt șanse, s-ar putea nevoie de unele de informații antet infile de mai târziu, așa că cel mai bine pentru a urmări atât. Dar să fie foarte clar cu variabila nume, astfel încât să nu accidental Trimite valorile incorecte în antetul pentru outfile. Deci, acum sa trecem la lectura în scanline pixel-cu-pixel. Din nou, am de gând să se întoarcă la încredere noastre fișier biblioteca I / O, si uita-te la funcția fread. fread ia într-un pointer la o struct care va conține bytes care sunteți de lectură în, dimensiunea fiecărui element care sunteți de lectură - din nou, sizeof va fi util funcționează aici, numărul de elemente de dimensiune, dimensiunea, că sunteți lectură în, și apoi în cele din urmă, inpointer, fișierul care sunteți de lectură de la. Deci, tu iei elemente numerice de mărime din inpointer, și punându-le în date. Acum e timpul pentru a redimensiona orizontal. dacă n este egal cu 2, apoi pentru fiecare pixel infile, am de gând să-l scrie de două ori în OUTFILE. Cum putem scrie fișiere? Ei bine, avem funcția fwrite, așa am luat indicatorul la struct care conține bytes care sunteți scris de la, iar apoi vom trece la dimensiunea, numărul, și de ieșire, în cazul în care ai de gând să fi scris asta. Și apoi să repete un proces, va fi capabil de o iterativ simplu pentru buclă. Dar trebuie să ne amintim pentru a adăuga padding inch Conceptul de umplutură este că, ei bine, fiecare pixel este de trei mușcături, dar Dimensiunea de fiecare trebuie să scanline fie un multiplu de 4 octeți. Deci, dacă numărul de pixeli nu este un multiplu de 4, avem nevoie pentru a adăuga unele padding, care este la doar zerouri. Acum, spre deosebire de cine făcut-o, și spre deosebire de copie, apoi imagine infile și fișier outfile au diferite au padding diferit, deoarece acestea sunt diferite latimi. OK. Deci, probabil, o formulă ar fi veni la îndemână aici. O să-l las să-l afli, dar vă spun că, pentru a scrie padding, bine, e doar o funcție fputc simplu, trecerea în caracterul pe care doriți să scrie, și apoi indicatorul fișier pe care îl vrea să scrie. Deci, acum că ne-am redimensionat orizontal, și apoi folosit umplutură, amintiți-vă că aveți nevoie pentru a muta fișierul indicator de poziție, pentru că nu poate fread în umplutură. Astfel încât să doriți să vă asigurați că fișierul indicator de poziție în infile este în punctul corect. Pentru ca ne dorim, de asemenea, să redimensiona vertical. Nu putem să-l întinde pe orizontală, pentru că fiecare are nevoie de rând să fie copiat de n ori. Acum, există mai multe diferite moduri de a face acest lucru. Deci unul, putem folosi o metodă de rescriere, în că ne amintim toți pixelii unui anumit rând într-o matrice, și atunci vom scrie că matrice ca câte ori este necesar. Sau acolo este metoda reproduce în care, după ce a citit într-un rând, în infile și apoi scris că în outfile, adăugarea umplutură, am fseek înapoi la începutul rândului originale, și apoi repetați orizontală redimensionare de acolo. Indiferent de metoda, deși, veți ca fiecare pixel să se repete de n ori, și fiecare rând de a fi repetată de n ori, de asemenea. Cu care, veți avea bitmap mai mare decât viața. Numele meu este Zamyla, iar acest lucru este CS50.