1 00:00:00,000 --> 00:00:10,210 >> [Speel van musiek] 2 00:00:10,210 --> 00:00:13,320 >> ZAMYLA CHAN: Kom ons hou dinge met resize. 3 00:00:13,320 --> 00:00:17,710 In die grootte, sal die gebruiker slaag, via die opdrag lyn, 'n bitmap beeld wat 4 00:00:17,710 --> 00:00:21,860 hulle wil hê jy te skaal deur 'n aantal dat hulle ook slaag in, 5 00:00:21,860 --> 00:00:23,770 in die command line. 6 00:00:23,770 --> 00:00:24,690 Hoe doen ons dit? 7 00:00:24,690 --> 00:00:28,270 >> Wel, in die eerste dinge eerste, laat ons breek dit af in stappe. 8 00:00:28,270 --> 00:00:31,510 Jy gaan wil die infile oop te maak dat hulle vir jou, asook 9 00:00:31,510 --> 00:00:35,560 skep en maak die outfile wat jy gaan sit die 10 00:00:35,560 --> 00:00:38,020 verklein beeld in 11 00:00:38,020 --> 00:00:42,050 Dan, omdat jy die grootte en want dit is 'n bitmap, dit 'n kop, so 12 00:00:42,050 --> 00:00:46,080 jy gaan ook die kop werk inligting vir die outfile, 13 00:00:46,080 --> 00:00:47,950 en skryf wat in 14 00:00:47,950 --> 00:00:51,850 Dan, jy gaan te lees in die scanline van die infile, 15 00:00:51,850 --> 00:00:56,890 pixel-by-pixel, vergroot horisontaal en skryf die pixels in die 16 00:00:56,890 --> 00:01:00,910 outfile, soos deur die gebruiker se skaal. 17 00:01:00,910 --> 00:01:03,940 >> Jy gaan om te onthou voeg padding as dit nodig is. 18 00:01:03,940 --> 00:01:05,400 Meer oor dit later. 19 00:01:05,400 --> 00:01:07,790 En dan, ook vertikaal grootte. 20 00:01:07,790 --> 00:01:08,890 OK. 21 00:01:08,890 --> 00:01:13,280 So dit gaan 'n bietjie meer wees ingewikkeld as wat dit gedoen het nie, maar 22 00:01:13,280 --> 00:01:18,310 wat is soortgelyk is dat copy.c sal, weer, bewys dat baie nuttig. 23 00:01:18,310 --> 00:01:23,160 Onthou dat copy.c 'n lêer oopmaak, updates die kop inligting vir die 24 00:01:23,160 --> 00:01:28,250 outfile, lees dan in die scanline, pixel-by-pixel, skryf elke pixel 25 00:01:28,250 --> 00:01:30,510 in die uitvoer lêer se scanline. 26 00:01:30,510 --> 00:01:37,040 >> So weer, jou eerste stap mag dalk wees om te vergelyk, copy.c, resize.c 27 00:01:37,040 --> 00:01:40,560 in jou PSET5 gids. 28 00:01:40,560 --> 00:01:43,920 Onthou egter, voordat jy dit kopieer, om seker te maak dat jy verstaan 29 00:01:43,920 --> 00:01:46,600 copy.c baie deeglik. 30 00:01:46,600 --> 00:01:47,620 OK. 31 00:01:47,620 --> 00:01:49,880 >> So laat ons 'n lêer oop te maak. 32 00:01:49,880 --> 00:01:50,870 Jy weet hoe om dit te doen. 33 00:01:50,870 --> 00:01:52,600 Ek gaan om dit te laat vir julle. 34 00:01:52,600 --> 00:01:56,050 Volgende, die kop inligting by te werk vir die outfile. 35 00:01:56,050 --> 00:01:59,240 Want ons het 'n nuwe bitmap, Ons het 'n nuwe header info. 36 00:01:59,240 --> 00:02:00,970 Wat hier om te verander? 37 00:02:00,970 --> 00:02:06,000 Wel, is die grootte van die lêer gaan verander want ons gaan om meer te hê 38 00:02:06,000 --> 00:02:07,900 pixels as tevore. 39 00:02:07,900 --> 00:02:11,060 Die beeld grootte is dus ook gaan verander, soos in die 40 00:02:11,060 --> 00:02:13,050 breedte en die hoogte. 41 00:02:13,050 --> 00:02:17,180 >> So wat veranderlikes is daardie presies? 42 00:02:17,180 --> 00:02:20,960 Wel, as jy kyk na die kop inligting, jy sien daar is 43 00:02:20,960 --> 00:02:25,640 biSizeImage, wat die totaal verteenwoordig grootte van die beeld in grepe, 44 00:02:25,640 --> 00:02:28,340 insluitend pixels en padding. 45 00:02:28,340 --> 00:02:32,520 biWidth is die breedte van die beeld in pixels, minus die padding. 46 00:02:32,520 --> 00:02:35,580 biHeight is die hoogte van die beeld in pixels. 47 00:02:35,580 --> 00:02:39,200 En so diegene is vervat in die structs BITMAPFILEHEADER en 48 00:02:39,200 --> 00:02:40,390 BITMAPINFOHEADER. 49 00:02:40,390 --> 00:02:45,300 Jy kan jou vertel watter een is wat deur gaan bmp.h en kyk na die 50 00:02:45,300 --> 00:02:49,670 BITMAPINFOHEADER struct en sien watter veranderlikes is daar gelys. 51 00:02:49,670 --> 00:02:54,700 >> So het die outfiles kop te werk inligting, gaan jy wil 52 00:02:54,700 --> 00:02:57,025 daardie waardes van die verandering hoogte en die wydte. 53 00:02:57,025 --> 00:03:00,570 Maar die kanse is, kan jy 'n paar van die infile se kop inligting 54 00:03:00,570 --> 00:03:03,670 later, so die beste om tred te hou van beide. 55 00:03:03,670 --> 00:03:07,770 Maar baie duidelik met veranderlike name, sodat jy nie per ongeluk 56 00:03:07,770 --> 00:03:12,490 skryf die verkeerde waardes in die kop vir die outfile. 57 00:03:12,490 --> 00:03:16,160 >> So nou laat ons kry om te lees in die scanline pixel-by-pixel. 58 00:03:16,160 --> 00:03:20,210 Weereens, ons gaan om te draai na ons betroubare lêer I / O-biblioteek en kyk na 59 00:03:20,210 --> 00:03:22,100 die fread funksie. 60 00:03:22,100 --> 00:03:26,150 fread neem in 'n verwysing na 'n struct dat die grepe sal bevat wat 61 00:03:26,150 --> 00:03:30,130 jy in die lees van die grootte van elke element wat jy lees - 62 00:03:30,130 --> 00:03:34,410 weer, is sizeof gaan nuttig te wees funksioneer hier, die nommer van die 63 00:03:34,410 --> 00:03:38,820 elemente van grootte, grootte, dat jy lees in, en dan uiteindelik, die 64 00:03:38,820 --> 00:03:41,310 inpointer, die lêer wat jy lees van. 65 00:03:41,310 --> 00:03:46,770 So jy neem aantal elemente grootte van inpointer, en 66 00:03:46,770 --> 00:03:49,040 om hulle in die data. 67 00:03:49,040 --> 00:03:51,695 >> Nou is dit tyd om horisontaal grootte. 68 00:03:51,695 --> 00:03:56,880 As n gelyk 2, dan vir elke pixel in die infile, ons gaan om dit te skryf 69 00:03:56,880 --> 00:04:00,870 twee keer in die outfile. 70 00:04:00,870 --> 00:04:02,210 Hoe kan ons skryf lêers? 71 00:04:02,210 --> 00:04:06,400 Wel, ons het die fwrite funksie, so ons het die wyser geneem om die struct 72 00:04:06,400 --> 00:04:10,170 wat bevat die grepe wat jy skryf van, en dan slaag ons in 73 00:04:10,170 --> 00:04:14,430 grootte, aantal, en die uitset, waar jy gaan om te word wat skryf. 74 00:04:14,430 --> 00:04:19,200 En dan 'n proses te herhaal, sal 'n eenvoudige herhalende vir lus. 75 00:04:19,200 --> 00:04:21,740 >> Maar ons moet onthou padding te voeg in 76 00:04:21,740 --> 00:04:26,040 Die konsep van padding is dat, wel, elke pixel is drie byt nie, maar die 77 00:04:26,040 --> 00:04:28,940 grootte van elke scanline moet 'n veelvoud van 4 grepe. 78 00:04:28,940 --> 00:04:33,660 So as die aantal pixels is nie 'n veelvoud van 4, moet ons 'n paar by te voeg 79 00:04:33,660 --> 00:04:36,630 padding, wat net nulpunte. 80 00:04:36,630 --> 00:04:42,130 Nou, in teenstelling met wat dit gedoen het, en in teenstelling met kopie, dan infile beeld en die 81 00:04:42,130 --> 00:04:44,370 outfile lêer het verskillende hê verskillende padding, want hulle is 82 00:04:44,370 --> 00:04:46,360 verskillende breedtes. 83 00:04:46,360 --> 00:04:46,690 >> OK. 84 00:04:46,690 --> 00:04:51,050 So miskien 'n formule sou handig te pas kom hier. 85 00:04:51,050 --> 00:04:55,120 Ek laat dit aan jou om dit uit te vind nie, maar vertel dat, padding om te skryf, 86 00:04:55,120 --> 00:04:59,360 Wel, dit is net 'n eenvoudige fputc funksie, verby in die karakter 87 00:04:59,360 --> 00:05:02,200 wat jy wil skryf, en dan die lêer wyser dat jy 88 00:05:02,200 --> 00:05:04,280 wil skryf. 89 00:05:04,280 --> 00:05:08,670 So nou dat ons horisontaal verklein, en dan gebruik padding, 90 00:05:08,670 --> 00:05:12,030 onthou dat jy jou lêer te skuif posisie aanwyser, want jy 91 00:05:12,030 --> 00:05:14,480 kan nie fread in padding. 92 00:05:14,480 --> 00:05:18,230 So jy wil om seker te maak dat jou lêer posisie aanwyser in die infile 93 00:05:18,230 --> 00:05:19,980 is op die regte punt. 94 00:05:19,980 --> 00:05:23,970 Omdat ons wil ook grootte vertikaal. 95 00:05:23,970 --> 00:05:27,090 Ons kan nie net strek horisontaal, want elke ry behoeftes 96 00:05:27,090 --> 00:05:30,370 gekopieer n keer. 97 00:05:30,370 --> 00:05:33,050 >> Nou, daar is 'n paar verskillende maniere om dit te doen nie. 98 00:05:33,050 --> 00:05:39,010 So een is, kan ons 'n herskryf metode te gebruik, in dat ons almal onthou van die pixels 99 00:05:39,010 --> 00:05:42,840 van 'n gegewe ry in 'n skikking, en dan skryf ons dat skikking as 100 00:05:42,840 --> 00:05:44,730 soveel keer as wat nodig is. 101 00:05:44,730 --> 00:05:49,530 Of is daar die recopy metode waar, na die lees in 'n ry in die infile 102 00:05:49,530 --> 00:05:53,530 en dan skryf wat in die outfile, die toevoeging van die padding, ons fseek 103 00:05:53,530 --> 00:05:57,250 terug na die begin van die oorspronklike ry, en dan herhaal die horisontale 104 00:05:57,250 --> 00:05:58,710 die grootte van daar af. 105 00:05:58,710 --> 00:06:02,280 Ongeag die metode, al is, sal jy wil elke pixel te herhaal word 106 00:06:02,280 --> 00:06:06,370 n keer, en elke ry te wees herhaal n keer so goed. 107 00:06:06,370 --> 00:06:09,160 >> Met dit, sal jy bitmap het groter as die lewe. 108 00:06:09,160 --> 00:06:11,760 My naam is Zamyla, en dit is CS50. 109 00:06:11,760 --> 00:06:19,542