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