1 00:00:00,000 --> 00:00:10,210 >> [Redare a muzicii] 2 00:00:10,210 --> 00:00:13,320 >> ZAMYLA CHAN: lovitură Să lucrurile cu redimensionare. 3 00:00:13,320 --> 00:00:17,710 În redimensionare, utilizatorul va trece în, prin linia de comandă, o imagine bitmap care 4 00:00:17,710 --> 00:00:21,860 ei doresc să scară de un număr că ei, de asemenea, trece in, 5 00:00:21,860 --> 00:00:23,770 în linia de comandă. 6 00:00:23,770 --> 00:00:24,690 Cum facem acest lucru? 7 00:00:24,690 --> 00:00:28,270 >> Ei bine, primele lucruri mai întâi, să rupe acest jos în pași. 8 00:00:28,270 --> 00:00:31,510 Ai de gând să doriți să deschideți infile că ei vă dau, precum și 9 00:00:31,510 --> 00:00:35,560 a crea și deschide outfile care ai de gând să pună 10 00:00:35,560 --> 00:00:38,020 imagine redimensionată inch 11 00:00:38,020 --> 00:00:42,050 Apoi, pentru ca esti de redimensionare, și pentru că este un bitmap, un antet, așa 12 00:00:42,050 --> 00:00:46,080 ai de gând să actualizeze, de asemenea, antetul informații pentru outfile, 13 00:00:46,080 --> 00:00:47,950 și să scrie că inch 14 00:00:47,950 --> 00:00:51,850 Apoi, ai de gând să citesc în scanline de infile, 15 00:00:51,850 --> 00:00:56,890 -pixel-cu-pixel, redimensionarea orizontal și scris aceste pixeli în 16 00:00:56,890 --> 00:01:00,910 outfile, așa cum este specificat de scala utilizatorului. 17 00:01:00,910 --> 00:01:03,940 >> Ai de gând să vă amintiți să adăugați umplutură este necesar. 18 00:01:03,940 --> 00:01:05,400 Mai multe despre asta mai târziu. 19 00:01:05,400 --> 00:01:07,790 Și apoi, de asemenea, redimensiona vertical. 20 00:01:07,790 --> 00:01:08,890 OK. 21 00:01:08,890 --> 00:01:13,280 Deci, acest lucru va fi un pic mai mult complicat decât Cine făcut-o, dar 22 00:01:13,280 --> 00:01:18,310 ceea ce este asemănător este că copy.c va fi, din nou, dovedi foarte util. 23 00:01:18,310 --> 00:01:23,160 Amintiți-vă că copy.c deschide un fișier, actualizează informațiile din antet pentru 24 00:01:23,160 --> 00:01:28,250 outfile, apoi citește în scanline, -pixel-cu-pixel, scriind fiecare pixel 25 00:01:28,250 --> 00:01:30,510 în scanline fișierul de ieșire a lui. 26 00:01:30,510 --> 00:01:37,040 >> Deci, din nou, primul pas ar putea, probabil, fie pentru cp, copy.c, resize.c 27 00:01:37,040 --> 00:01:40,560 în directorul PSET5. 28 00:01:40,560 --> 00:01:43,920 Amintiți-vă, deși, înainte să-l copiați, să vă asigurați că ați înțeles 29 00:01:43,920 --> 00:01:46,600 copy.c foarte bine. 30 00:01:46,600 --> 00:01:47,620 OK. 31 00:01:47,620 --> 00:01:49,880 >> Deci, haideți să deschidem un fișier. 32 00:01:49,880 --> 00:01:50,870 Știi cum să faci asta. 33 00:01:50,870 --> 00:01:52,600 Am de gând să las asta pentru tine. 34 00:01:52,600 --> 00:01:56,050 Apoi, să actualizeze informațiile din antet pentru outfile. 35 00:01:56,050 --> 00:01:59,240 Pentru că avem un nou bitmap, avem noi informatii antet. 36 00:01:59,240 --> 00:02:00,970 Ce se schimbă aici? 37 00:02:00,970 --> 00:02:06,000 Ei bine, dimensiunea fișierului se va schimba pentru că vom avea mai mult 38 00:02:06,000 --> 00:02:07,900 pixeli decât înainte. 39 00:02:07,900 --> 00:02:11,060 Dimensiunea imaginii este, astfel, de asemenea, va schimba, așa cum este 40 00:02:11,060 --> 00:02:13,050 Lățimea și înălțimea. 41 00:02:13,050 --> 00:02:17,180 >> Deci, care variabilele sunt cele, mai exact? 42 00:02:17,180 --> 00:02:20,960 Ei bine, dacă te uiți în antetul informații, te vedea acolo este 43 00:02:20,960 --> 00:02:25,640 biSizeImage, ceea ce reprezintă totalul dimensiune a imaginii în bytes, 44 00:02:25,640 --> 00:02:28,340 inclusiv pixeli și padding. 45 00:02:28,340 --> 00:02:32,520 biWidth este lățimea imaginii în pixeli, minus padding. 46 00:02:32,520 --> 00:02:35,580 biHeight este înălțimea de imaginea în pixeli. 47 00:02:35,580 --> 00:02:39,200 Și astfel cei care sunt cuprinse în structs BITMAPFILEHEADER și 48 00:02:39,200 --> 00:02:40,390 BitmapInfoHeader. 49 00:02:40,390 --> 00:02:45,300 Pot să vă spun care este cel care, prin O să bmp.h și se uită la 50 00:02:45,300 --> 00:02:49,670 Struct BitmapInfoHeader și văzând care variabilele sunt enumerate acolo. 51 00:02:49,670 --> 00:02:54,700 >> Deci, pentru a actualiza antetul outfiles informații, ai de gând să doriți să 52 00:02:54,700 --> 00:02:57,025 schimba aceste valori ale înălțimea și lățimea. 53 00:02:57,025 --> 00:03:00,570 Dar sunt șanse, s-ar putea nevoie de unele de informații antet infile de 54 00:03:00,570 --> 00:03:03,670 mai târziu, așa că cel mai bine pentru a urmări atât. 55 00:03:03,670 --> 00:03:07,770 Dar să fie foarte clar cu variabila nume, astfel încât să nu accidental 56 00:03:07,770 --> 00:03:12,490 Trimite valorile incorecte în antetul pentru outfile. 57 00:03:12,490 --> 00:03:16,160 >> Deci, acum sa trecem la lectura în scanline pixel-cu-pixel. 58 00:03:16,160 --> 00:03:20,210 Din nou, am de gând să se întoarcă la încredere noastre fișier biblioteca I / O, si uita-te la 59 00:03:20,210 --> 00:03:22,100 funcția fread. 60 00:03:22,100 --> 00:03:26,150 fread ia într-un pointer la o struct care va conține bytes care 61 00:03:26,150 --> 00:03:30,130 sunteți de lectură în, dimensiunea fiecărui element care sunteți de lectură - 62 00:03:30,130 --> 00:03:34,410 din nou, sizeof va fi util funcționează aici, numărul de 63 00:03:34,410 --> 00:03:38,820 elemente de dimensiune, dimensiunea, că sunteți lectură în, și apoi în cele din urmă, 64 00:03:38,820 --> 00:03:41,310 inpointer, fișierul care sunteți de lectură de la. 65 00:03:41,310 --> 00:03:46,770 Deci, tu iei elemente numerice de mărime din inpointer, și 66 00:03:46,770 --> 00:03:49,040 punându-le în date. 67 00:03:49,040 --> 00:03:51,695 >> Acum e timpul pentru a redimensiona orizontal. 68 00:03:51,695 --> 00:03:56,880 dacă n este egal cu 2, apoi pentru fiecare pixel infile, am de gând să-l scrie 69 00:03:56,880 --> 00:04:00,870 de două ori în OUTFILE. 70 00:04:00,870 --> 00:04:02,210 Cum putem scrie fișiere? 71 00:04:02,210 --> 00:04:06,400 Ei bine, avem funcția fwrite, așa am luat indicatorul la struct 72 00:04:06,400 --> 00:04:10,170 care conține bytes care sunteți scris de la, iar apoi vom trece la 73 00:04:10,170 --> 00:04:14,430 dimensiunea, numărul, și de ieșire, în cazul în care ai de gând să fi scris asta. 74 00:04:14,430 --> 00:04:19,200 Și apoi să repete un proces, va fi capabil de o iterativ simplu pentru buclă. 75 00:04:19,200 --> 00:04:21,740 >> Dar trebuie să ne amintim pentru a adăuga padding inch 76 00:04:21,740 --> 00:04:26,040 Conceptul de umplutură este că, ei bine, fiecare pixel este de trei mușcături, dar 77 00:04:26,040 --> 00:04:28,940 Dimensiunea de fiecare trebuie să scanline fie un multiplu de 4 octeți. 78 00:04:28,940 --> 00:04:33,660 Deci, dacă numărul de pixeli nu este un multiplu de 4, avem nevoie pentru a adăuga unele 79 00:04:33,660 --> 00:04:36,630 padding, care este la doar zerouri. 80 00:04:36,630 --> 00:04:42,130 Acum, spre deosebire de cine făcut-o, și spre deosebire de copie, apoi imagine infile și 81 00:04:42,130 --> 00:04:44,370 fișier outfile au diferite au padding diferit, deoarece acestea sunt 82 00:04:44,370 --> 00:04:46,360 diferite latimi. 83 00:04:46,360 --> 00:04:46,690 >> OK. 84 00:04:46,690 --> 00:04:51,050 Deci, probabil, o formulă ar fi veni la îndemână aici. 85 00:04:51,050 --> 00:04:55,120 O să-l las să-l afli, dar vă spun că, pentru a scrie padding, 86 00:04:55,120 --> 00:04:59,360 bine, e doar o funcție fputc simplu, trecerea în caracterul 87 00:04:59,360 --> 00:05:02,200 pe care doriți să scrie, și apoi indicatorul fișier pe care îl 88 00:05:02,200 --> 00:05:04,280 vrea să scrie. 89 00:05:04,280 --> 00:05:08,670 Deci, acum că ne-am redimensionat orizontal, și apoi folosit umplutură, 90 00:05:08,670 --> 00:05:12,030 amintiți-vă că aveți nevoie pentru a muta fișierul indicator de poziție, pentru că 91 00:05:12,030 --> 00:05:14,480 nu poate fread în umplutură. 92 00:05:14,480 --> 00:05:18,230 Astfel încât să doriți să vă asigurați că fișierul indicator de poziție în infile 93 00:05:18,230 --> 00:05:19,980 este în punctul corect. 94 00:05:19,980 --> 00:05:23,970 Pentru ca ne dorim, de asemenea, să redimensiona vertical. 95 00:05:23,970 --> 00:05:27,090 Nu putem să-l întinde pe orizontală, pentru că fiecare are nevoie de rând 96 00:05:27,090 --> 00:05:30,370 să fie copiat de n ori. 97 00:05:30,370 --> 00:05:33,050 >> Acum, există mai multe diferite moduri de a face acest lucru. 98 00:05:33,050 --> 00:05:39,010 Deci unul, putem folosi o metodă de rescriere, în că ne amintim toți pixelii 99 00:05:39,010 --> 00:05:42,840 unui anumit rând într-o matrice, și atunci vom scrie că matrice ca 100 00:05:42,840 --> 00:05:44,730 câte ori este necesar. 101 00:05:44,730 --> 00:05:49,530 Sau acolo este metoda reproduce în care, după ce a citit într-un rând, în infile 102 00:05:49,530 --> 00:05:53,530 și apoi scris că în outfile, adăugarea umplutură, am fseek 103 00:05:53,530 --> 00:05:57,250 înapoi la începutul rândului originale, și apoi repetați orizontală 104 00:05:57,250 --> 00:05:58,710 redimensionare de acolo. 105 00:05:58,710 --> 00:06:02,280 Indiferent de metoda, deși, veți ca fiecare pixel să se repete 106 00:06:02,280 --> 00:06:06,370 de n ori, și fiecare rând de a fi repetată de n ori, de asemenea. 107 00:06:06,370 --> 00:06:09,160 >> Cu care, veți avea bitmap mai mare decât viața. 108 00:06:09,160 --> 00:06:11,760 Numele meu este Zamyla, iar acest lucru este CS50. 109 00:06:11,760 --> 00:06:19,542