1 00:00:00,000 --> 00:00:10,210 >> [Muziek] 2 00:00:10,210 --> 00:00:13,320 >> ZAMYLA CHAN: Let's klap dingen met resize. 3 00:00:13,320 --> 00:00:17,710 In resize, zal de gebruiker pas in, via de afbeelding een bitmap command line, dat 4 00:00:17,710 --> 00:00:21,860 ze willen dat je schalen door een aantal dat ze ook pas in, 5 00:00:21,860 --> 00:00:23,770 in de opdrachtregel. 6 00:00:23,770 --> 00:00:24,690 Hoe doen we dat? 7 00:00:24,690 --> 00:00:28,270 >> Nou, first things first, laten we breken deze naar beneden in stappen. 8 00:00:28,270 --> 00:00:31,510 Je gaat te willen om de infile openen dat ze je geven, evenals 9 00:00:31,510 --> 00:00:35,560 maken en open de outfile dat je gaat zet de 10 00:00:35,560 --> 00:00:38,020 bijgewerkte opname in 11 00:00:38,020 --> 00:00:42,050 Dan, omdat je resizen, en omdat het een bitmap, het een header, dus 12 00:00:42,050 --> 00:00:46,080 je gaat ook de header te werken informatie voor de outfile, 13 00:00:46,080 --> 00:00:47,950 en schrijf dat binnen 14 00:00:47,950 --> 00:00:51,850 Dan zul je lezen in de scanline van de infile, 15 00:00:51,850 --> 00:00:56,890 pixel-voor-pixel, resizen horizontaal en het schrijven van de pixels in de 16 00:00:56,890 --> 00:01:00,910 outfile, zoals gespecificeerd door de schaal van de gebruiker. 17 00:01:00,910 --> 00:01:03,940 >> Je gaat denken om voeg opvulling nodig. 18 00:01:03,940 --> 00:01:05,400 Daarover later meer. 19 00:01:05,400 --> 00:01:07,790 En dan, ook verticaal formaat. 20 00:01:07,790 --> 00:01:08,890 OK. 21 00:01:08,890 --> 00:01:13,280 Dus dit gaat een beetje meer zijn ingewikkelder dan Who Done It, maar 22 00:01:13,280 --> 00:01:18,310 wat vergelijkbaar is dat copy.c zal, nogmaals, blijken zeer nuttig. 23 00:01:18,310 --> 00:01:23,160 Vergeet niet dat copy.c opent een bestand, actualiseert de header-informatie voor de 24 00:01:23,160 --> 00:01:28,250 outfile, dan leest in de scanline, pixel voor pixel, schrijven elke pixel 25 00:01:28,250 --> 00:01:30,510 in scanline de output bestand. 26 00:01:30,510 --> 00:01:37,040 >> Dus nogmaals, je eerste stap zou waarschijnlijk zijn om cp, copy.c, resize.c 27 00:01:37,040 --> 00:01:40,560 in uw PSET5 directory. 28 00:01:40,560 --> 00:01:43,920 Vergeet echter niet, voordat u het kopiƫren, om ervoor te zorgen dat u begrijpt 29 00:01:43,920 --> 00:01:46,600 copy.c zeer grondig. 30 00:01:46,600 --> 00:01:47,620 OK. 31 00:01:47,620 --> 00:01:49,880 >> Dus laten we een bestand te openen. 32 00:01:49,880 --> 00:01:50,870 Je weet hoe dat te doen. 33 00:01:50,870 --> 00:01:52,600 Ik ga laat dat aan jou. 34 00:01:52,600 --> 00:01:56,050 Vervolgens werken de header-informatie voor de outfile. 35 00:01:56,050 --> 00:01:59,240 Want we hebben een nieuwe bitmap, we hebben nieuwe header info. 36 00:01:59,240 --> 00:02:00,970 Wat is hier het veranderen? 37 00:02:00,970 --> 00:02:06,000 Nou, de bestandsgrootte gaat veranderen want we gaan naar meer hebben 38 00:02:06,000 --> 00:02:07,900 pixels dan voorheen. 39 00:02:07,900 --> 00:02:11,060 Het beeldformaat is dus ook gaat veranderen, zoals het 40 00:02:11,060 --> 00:02:13,050 breedte en hoogte. 41 00:02:13,050 --> 00:02:17,180 >> Dus welke variabelen zijn die precies? 42 00:02:17,180 --> 00:02:20,960 Nou, als je kijkt in de header informatie, zie je er 43 00:02:20,960 --> 00:02:25,640 biSizeImage, wat het totaal vertegenwoordigt grootte van de afbeelding in bytes, 44 00:02:25,640 --> 00:02:28,340 inclusief pixels en opvulling. 45 00:02:28,340 --> 00:02:32,520 biWidth is de breedte van het beeld in pixels, minus de padding. 46 00:02:32,520 --> 00:02:35,580 biHeight is de hoogte van de afbeelding in pixels. 47 00:02:35,580 --> 00:02:39,200 En dus die zijn opgenomen in de structs BITMAPFILEHEADER en 48 00:02:39,200 --> 00:02:40,390 BITMAPINFOHEADER. 49 00:02:40,390 --> 00:02:45,300 U kunt vertellen welke is welke door gaat bmp.h en kijken naar de 50 00:02:45,300 --> 00:02:49,670 BITMAPINFOHEADER struct en zien welke variabelen zijn vermeld. 51 00:02:49,670 --> 00:02:54,700 >> Dus om de outfiles header updaten informatie, je gaat te willen 52 00:02:54,700 --> 00:02:57,025 de waarden van de te wijzigen hoogte en de breedte. 53 00:02:57,025 --> 00:03:00,570 Maar de kans is, zou je wat nodig hebt van header informatie de infile's 54 00:03:00,570 --> 00:03:03,670 later, dus het beste om bij te houden van beide. 55 00:03:03,670 --> 00:03:07,770 Maar wees heel duidelijk met uw variabele namen, zodat je niet per ongeluk 56 00:03:07,770 --> 00:03:12,490 schrijf de onjuiste waarden in de header voor de outfile. 57 00:03:12,490 --> 00:03:16,160 >> Dus nu laten we aan het lezen in de scanline pixel voor pixel. 58 00:03:16,160 --> 00:03:20,210 Nogmaals, we gaan te wenden tot onze trouwe file I / O-bibliotheek, en kijk naar 59 00:03:20,210 --> 00:03:22,100 de fread functie. 60 00:03:22,100 --> 00:03:26,150 fread neemt in een pointer naar een struct dat zal de bytes bevatten dat 61 00:03:26,150 --> 00:03:30,130 je leest in, de grootte van elk element dat u nu leest - 62 00:03:30,130 --> 00:03:34,410 opnieuw wordt sizeof zal nuttig zijn functie hier het aantal 63 00:03:34,410 --> 00:03:38,820 elementen van grootte, omvang, dat je lezen in, en uiteindelijk, de 64 00:03:38,820 --> 00:03:41,310 inpointer, het bestand dat je leest uit. 65 00:03:41,310 --> 00:03:46,770 Dus je neemt het aantal elementen van grootte van inpointer, en 66 00:03:46,770 --> 00:03:49,040 ze in de gegevens. 67 00:03:49,040 --> 00:03:51,695 >> Nu is het tijd om horizontaal formaat. 68 00:03:51,695 --> 00:03:56,880 wanneer n gelijk is aan 2, dan worden voor elke pixel in de infile, we gaan om het te schrijven 69 00:03:56,880 --> 00:04:00,870 twee keer in de outfile. 70 00:04:00,870 --> 00:04:02,210 Hoe gaan we bestanden weg te schrijven? 71 00:04:02,210 --> 00:04:06,400 Nou, we hebben de fwrite functie, zodat we hebben de aanwijzer genomen om de structuur 72 00:04:06,400 --> 00:04:10,170 dat de bytes die je bent bevat het schrijven van, en dan gaan we in 73 00:04:10,170 --> 00:04:14,430 grootte, aantal en de uitgang, waar je gaat worden schriftelijk. 74 00:04:14,430 --> 00:04:19,200 En vervolgens op een werkwijze herhalen, zal staat een eenvoudige iteratieve lus. 75 00:04:19,200 --> 00:04:21,740 >> Maar we moeten niet vergeten padding voegen inch 76 00:04:21,740 --> 00:04:26,040 Het concept van de vulling is dat goed, elke pixel drie beten, maar de 77 00:04:26,040 --> 00:04:28,940 grootte van elk scanline must zijn een veelvoud van 4 bytes. 78 00:04:28,940 --> 00:04:33,660 Dus als het aantal pixels is geen veelvoud van 4, moeten we een aantal voegen 79 00:04:33,660 --> 00:04:36,630 padding, dat is gewoon nullen. 80 00:04:36,630 --> 00:04:42,130 Nu, in tegenstelling Wie Done It, en in tegenstelling tot kopie, dan infile imago en de 81 00:04:42,130 --> 00:04:44,370 outfile bestand hebben verschillende hebben verschillende vulling omdat ze 82 00:04:44,370 --> 00:04:46,360 wijdtes. 83 00:04:46,360 --> 00:04:46,690 >> OK. 84 00:04:46,690 --> 00:04:51,050 Dus misschien een formule zou komen hier goed van pas. 85 00:04:51,050 --> 00:04:55,120 Ik zal het aan u om het te vinden, maar u vertellen dat, om padding schrijven, 86 00:04:55,120 --> 00:04:59,360 goed, het is gewoon een simpele fputc functie, passeren in de aard 87 00:04:59,360 --> 00:05:02,200 dat u wilt schrijven, en vervolgens de file pointer die je 88 00:05:02,200 --> 00:05:04,280 willen schrijven. 89 00:05:04,280 --> 00:05:08,670 Dus nu hebben we horizontaal aangepast, en vervolgens gebruikt padding, 90 00:05:08,670 --> 00:05:12,030 vergeet niet dat je nodig hebt om uw bestand te verplaatsen positie-indicator, omdat je 91 00:05:12,030 --> 00:05:14,480 kan niet fread in padding. 92 00:05:14,480 --> 00:05:18,230 Dus wilt u ervoor zorgen dat uw bestand positie-indicator in de infile 93 00:05:18,230 --> 00:05:19,980 is op het juiste moment. 94 00:05:19,980 --> 00:05:23,970 Omdat we willen ook resize verticaal. 95 00:05:23,970 --> 00:05:27,090 We kunnen niet zomaar uitrekken horizontaal, omdat elke rij behoeften 96 00:05:27,090 --> 00:05:30,370 n keer te kopiƫren. 97 00:05:30,370 --> 00:05:33,050 >> Nu zijn er verschillende manieren om dit te doen. 98 00:05:33,050 --> 00:05:39,010 Zodat men, kunnen we een rewrite gebruiken, in dat we niet vergeten alle pixels 99 00:05:39,010 --> 00:05:42,840 van een bepaalde rij in een array, en dan schrijven we dat array als 100 00:05:42,840 --> 00:05:44,730 vaak als nodig. 101 00:05:44,730 --> 00:05:49,530 Of er is de recopy methode waarbij, na het lezen in een rij in de infile 102 00:05:49,530 --> 00:05:53,530 en dan schrijven dat in de outfile, het toevoegen van de vulling, we fseek 103 00:05:53,530 --> 00:05:57,250 terug naar het begin van de oorspronkelijke regel, en herhaal de horizontale 104 00:05:57,250 --> 00:05:58,710 resizen van daar. 105 00:05:58,710 --> 00:06:02,280 Ongeacht de methode, maar, zult u wil dat elke pixel worden herhaald 106 00:06:02,280 --> 00:06:06,370 n keer, en elke rij om herhaald n keer ook. 107 00:06:06,370 --> 00:06:09,160 >> Met dat, zul je bitmap hebt groter dan het leven. 108 00:06:09,160 --> 00:06:11,760 Mijn naam is Zamyla, en dit is CS50. 109 00:06:11,760 --> 00:06:19,542