1 00:00:00,000 --> 00:00:10,210 >> [CHWARAE CERDDORIAETH] 2 00:00:10,210 --> 00:00:13,320 >> ZAMYLA Chan: ergyd Dewch i pethau i fyny gyda newid maint. 3 00:00:13,320 --> 00:00:17,710 Yn newid maint, bydd y defnyddiwr yn pasio i mewn, drwy 'r archa bannod, delwedd bitmap sy'n 4 00:00:17,710 --> 00:00:21,860 maent am i chi i raddfa gan nifer eu bod hefyd yn pasio i mewn, 5 00:00:21,860 --> 00:00:23,770 yn y llinell orchymyn. 6 00:00:23,770 --> 00:00:24,690 Sut ydym ni'n gwneud hyn? 7 00:00:24,690 --> 00:00:28,270 >> Wel, pethau cyntaf yn gyntaf, gadewch i ni torri i lawr yn gamau. 8 00:00:28,270 --> 00:00:31,510 Rydych yn mynd i eisiau i agor y infile eu bod yn rhoi i chi, yn ogystal â 9 00:00:31,510 --> 00:00:35,560 creu ac agor y outfile y ydych yn mynd i roi'r 10 00:00:35,560 --> 00:00:38,020 delwedd resized i mewn 11 00:00:38,020 --> 00:00:42,050 Yna, oherwydd eich bod yn newid maint, a oherwydd ei fod yn didfap, ei fod yn pennawd, felly 12 00:00:42,050 --> 00:00:46,080 ydych yn mynd hefyd i ddiweddaru y pennawd gwybodaeth ar gyfer y outfile, 13 00:00:46,080 --> 00:00:47,950 ac ysgrifennu hynny mewn 14 00:00:47,950 --> 00:00:51,850 Yna, rydych chi'n mynd i ddarllen i mewn y scanline y infile, 15 00:00:51,850 --> 00:00:56,890 picsel-wrth-picsel, newid maint yn llorweddol ac ysgrifennu picsel hynny i mewn i'r 16 00:00:56,890 --> 00:01:00,910 outfile, fel y nodir gan raddfa y defnyddiwr. 17 00:01:00,910 --> 00:01:03,940 >> Rydych yn mynd i gofio ychwanegu padin yn ôl yr angen. 18 00:01:03,940 --> 00:01:05,400 Mwy am hynny yn nes ymlaen. 19 00:01:05,400 --> 00:01:07,790 Ac yna, hefyd newid maint fertigol. 20 00:01:07,790 --> 00:01:08,890 OK. 21 00:01:08,890 --> 00:01:13,280 Felly, mae hyn yn mynd i fod ychydig yn fwy cymhleth na Pwy Done It, ond 22 00:01:13,280 --> 00:01:18,310 beth sy'n debyg yw bod copy.c bydd, unwaith eto, yn ddefnyddiol iawn. 23 00:01:18,310 --> 00:01:23,160 Cofiwch fod copy.c yn agor ffeil, yn diweddaru'r wybodaeth pennawd ar gyfer yr 24 00:01:23,160 --> 00:01:28,250 outfile, yna darllen i mewn i'r scanline, picsel-wrth-picsel, ysgrifennu pob picsel 25 00:01:28,250 --> 00:01:30,510 i scanline y ffeil allbwn yn. 26 00:01:30,510 --> 00:01:37,040 >> Felly eto, yn ôl pob tebyg y gallai eich cam cyntaf fydd cp, copy.c, resize.c 27 00:01:37,040 --> 00:01:40,560 i mewn i'ch cyfeiriadur PSET5. 28 00:01:40,560 --> 00:01:43,920 Cofiwch, fodd bynnag, cyn i chi gopïo, i wneud yn siŵr eich bod yn deall 29 00:01:43,920 --> 00:01:46,600 copy.c drylwyr iawn. 30 00:01:46,600 --> 00:01:47,620 OK. 31 00:01:47,620 --> 00:01:49,880 >> Felly, gadewch i ni agor ffeil. 32 00:01:49,880 --> 00:01:50,870 Rydych yn gwybod sut i wneud hynny. 33 00:01:50,870 --> 00:01:52,600 Rydw i'n mynd i adael hynny i chi. 34 00:01:52,600 --> 00:01:56,050 Nesaf, diweddaru'r wybodaeth pennawd gyfer y outfile. 35 00:01:56,050 --> 00:01:59,240 Oherwydd bod gennym didfap newydd, mae gennym wybodaeth pennawd newydd. 36 00:01:59,240 --> 00:02:00,970 Beth sy'n newid yma? 37 00:02:00,970 --> 00:02:06,000 Wel, maint y ffeil yn mynd i newid oherwydd ein bod yn mynd i gael mwy o 38 00:02:06,000 --> 00:02:07,900 picsel nag o'r blaen. 39 00:02:07,900 --> 00:02:11,060 Mae maint ddelwedd yn, a thrwy hynny, hefyd yn mynd i newid, fel y mae'r 40 00:02:11,060 --> 00:02:13,050 lled ac uchder. 41 00:02:13,050 --> 00:02:17,180 >> Felly, pa newidynnau yw'r rhai, yn union? 42 00:02:17,180 --> 00:02:20,960 Wel, os ydych yn edrych i mewn i'r pennawd gwybodaeth, byddwch yn gweld nad oes 43 00:02:20,960 --> 00:02:25,640 biSizeImage, sy'n cynrychioli cyfanswm maint y ddelwedd mewn bytes, 44 00:02:25,640 --> 00:02:28,340 gan gynnwys picsel a padin. 45 00:02:28,340 --> 00:02:32,520 biWidth yw lled y ddelwedd mewn picseli, heb y padin. 46 00:02:32,520 --> 00:02:35,580 biHeight yw uchder y ddelwedd mewn picseli. 47 00:02:35,580 --> 00:02:39,200 Ac felly y rhai yn cael eu cynnwys yn y structs BITMAPFILEHEADER a 48 00:02:39,200 --> 00:02:40,390 BITMAPINFOHEADER. 49 00:02:40,390 --> 00:02:45,300 Gallwch ddweud pa un yw pa trwy mynd i bmp.h ac edrych ar y 50 00:02:45,300 --> 00:02:49,670 Strwythur BITMAPINFOHEADER a gweld pa newidynnau yn cael eu rhestru yno. 51 00:02:49,670 --> 00:02:54,700 >> Felly, i ddiweddaru'r pennawd outfiles gwybodaeth, eich bod yn mynd i fod eisiau 52 00:02:54,700 --> 00:02:57,025 newid gwerthoedd hynny o'r uchder a'r lled. 53 00:02:57,025 --> 00:03:00,570 Ond mae'n bur debyg, efallai y bydd angen rhai i chi gwybodaeth pennawd y infile yn 54 00:03:00,570 --> 00:03:03,670 yn ddiweddarach, felly gorau i gadw trac o'r ddau. 55 00:03:03,670 --> 00:03:07,770 Ond byddwch yn glir iawn gyda'ch amrywiol enwau fel nad ydych yn ddamweiniol 56 00:03:07,770 --> 00:03:12,490 ysgrifennwch y gwerthoedd anghywir yn y pennawd ar gyfer yr outfile. 57 00:03:12,490 --> 00:03:16,160 >> Felly nawr gadewch i ni fynd at ddarllen i mewn i y scanline pixel-by-picsel. 58 00:03:16,160 --> 00:03:20,210 Unwaith eto, rydym yn mynd i droi at ein trusty ffeil I / O llyfrgell, ac edrych ar 59 00:03:20,210 --> 00:03:22,100 y swyddogaeth fread. 60 00:03:22,100 --> 00:03:26,150 fread cymryd mewn pwyntydd i strwythur a fydd yn cynnwys y bytes sy'n 61 00:03:26,150 --> 00:03:30,130 ydych yn darllen yn, maint pob elfen sy'n ydych yn darllen - 62 00:03:30,130 --> 00:03:34,410 eto, sizeof yn mynd i fod yn ddefnyddiol gweithredu yma, mae nifer y 63 00:03:34,410 --> 00:03:38,820 elfennau o faint, maint, eich bod yn darllen i mewn, ac yna yn olaf, y 64 00:03:38,820 --> 00:03:41,310 inpointer, y ffeil sydd eich bod yn darllen o. 65 00:03:41,310 --> 00:03:46,770 Felly, rydych yn cymryd elfennau rhif o faint o inpointer, a 66 00:03:46,770 --> 00:03:49,040 eu rhoi i mewn i data. 67 00:03:49,040 --> 00:03:51,695 >> Nawr mae'n amser i newid maint llorweddol. 68 00:03:51,695 --> 00:03:56,880 os n gyfystyr â 2, yna ar gyfer pob picsel yn y infile, rydym yn mynd i ysgrifennu 69 00:03:56,880 --> 00:04:00,870 ddwywaith yn ystod y outfile. 70 00:04:00,870 --> 00:04:02,210 Sut ydym yn ysgrifennu ffeiliau? 71 00:04:02,210 --> 00:04:06,400 Wel, mae gennym y swyddogaeth fwrite, felly rydym wedi cymryd y pwyntydd i'r strwythur 72 00:04:06,400 --> 00:04:10,170 sy'n cynnwys y bytes eich bod yn ysgrifennu o, ac yna rydym yn pasio mewn 73 00:04:10,170 --> 00:04:14,430 maint, nifer, ac mae'r allbwn, lle ydych yn mynd i gael ei ysgrifennu hynny. 74 00:04:14,430 --> 00:04:19,200 Ac yna ailadrodd proses, yn galluog ailadroddus syml ar gyfer ddolen. 75 00:04:19,200 --> 00:04:21,740 >> Ond mae angen i gofio i ychwanegu padin mewn 76 00:04:21,740 --> 00:04:26,040 Mae'r cysyniad o padin yw bod, yn dda, bob picsel yn dri brathiadau, ond mae'r 77 00:04:26,040 --> 00:04:28,940 maint pob rhaid scanline fod yn lluosrif o 4 bytes. 78 00:04:28,940 --> 00:04:33,660 Felly, os nad yw nifer o bicseli yn lluosog o 4, mae angen i ni ychwanegu rhywfaint o 79 00:04:33,660 --> 00:04:36,630 padin, sydd ychydig sero. 80 00:04:36,630 --> 00:04:42,130 Nawr, yn wahanol Pwy Done It, ac yn wahanol i copi, yna ddelwedd infile a'r 81 00:04:42,130 --> 00:04:44,370 ffeil outfile wedi gwahanol wedi gwahanol padin oherwydd eu bod yn 82 00:04:44,370 --> 00:04:46,360 wahanol led. 83 00:04:46,360 --> 00:04:46,690 >> OK. 84 00:04:46,690 --> 00:04:51,050 Felly efallai y byddai fformiwla yn dod i mewn 'n hylaw yma. 85 00:04:51,050 --> 00:04:55,120 'N annhymerus' yn gadael i chi ddod o hyd allan, ond yn dweud wrthych fod, i ysgrifennu padin, 86 00:04:55,120 --> 00:04:59,360 yn dda, 'i' jyst swyddogaeth fputc syml, pasio yn y cymeriad 87 00:04:59,360 --> 00:05:02,200 eich bod am ysgrifennu, ac yna y pwyntydd ffeil yr ydych 88 00:05:02,200 --> 00:05:04,280 dymuno ysgrifennu. 89 00:05:04,280 --> 00:05:08,670 Felly nawr yr ydym wedi newid maint llorweddol, ac yna defnyddio padin, 90 00:05:08,670 --> 00:05:12,030 cofiwch fod angen i chi symud eich ffeil dangosydd sefyllfa, oherwydd eich bod 91 00:05:12,030 --> 00:05:14,480 Ni all fread i padin. 92 00:05:14,480 --> 00:05:18,230 Felly rydych eisiau gwneud yn siŵr bod eich ffeil dangosydd safle yn y infile 93 00:05:18,230 --> 00:05:19,980 ar y pwynt cywir. 94 00:05:19,980 --> 00:05:23,970 Oherwydd ein bod hefyd yn awyddus i newid maint fertigol. 95 00:05:23,970 --> 00:05:27,090 Ni allwn yn unig yn ymestyn ei llorweddol, oherwydd y mae pob anghenion rhes 96 00:05:27,090 --> 00:05:30,370 gael eu copïo amseroedd n. 97 00:05:30,370 --> 00:05:33,050 >> Erbyn hyn, mae yna nifer o wahanol ffyrdd o wneud hyn. 98 00:05:33,050 --> 00:05:39,010 Felly un, gallwn ddefnyddio dull ailysgrifennu, yn ein bod yn cofio yr holl picsel 99 00:05:39,010 --> 00:05:42,840 o res a roddir mewn amrywiaeth, ac Yna, byddwn yn ysgrifennu bod amrywiaeth fel 100 00:05:42,840 --> 00:05:44,730 sawl gwaith yn ôl yr angen. 101 00:05:44,730 --> 00:05:49,530 Neu mae y dull recopy lle, ar ôl darllen mewn un rhes yn y infile 102 00:05:49,530 --> 00:05:53,530 ac yna ysgrifennu hynny yn y outfile, ychwanegu'r padin, rydym fseek 103 00:05:53,530 --> 00:05:57,250 Nôl i ddechrau'r rhes gwreiddiol, ac yna ailadrodd y llorweddol 104 00:05:57,250 --> 00:05:58,710 newid maint oddi yno. 105 00:05:58,710 --> 00:06:02,280 Waeth beth fo'r dull, fodd bynnag, byddwch yn am i bob picsel cael ei ailadrodd 106 00:06:02,280 --> 00:06:06,370 n amser, a phob rhes i fod yn dro ar ôl tro amseroedd n yn ogystal. 107 00:06:06,370 --> 00:06:09,160 >> Gyda hynny, bydd gennych didfap fwy na bywyd. 108 00:06:09,160 --> 00:06:11,760 Fy enw i yw Zamyla, ac mae hyn yn CS50. 109 00:06:11,760 --> 00:06:19,542