1 00:00:00,000 --> 00:00:10,210 >> [MUSIK SPELA] 2 00:00:10,210 --> 00:00:13,320 >> ZAMYLA CHAN: Låt oss blåsa upp saker med resize. 3 00:00:13,320 --> 00:00:17,710 I storleksändring, kommer användaren att passera in via kommandoraden, en bitmappsbild som 4 00:00:17,710 --> 00:00:21,860 de vill att du ska skala av ett antal att de också passera i, 5 00:00:21,860 --> 00:00:23,770 på kommandoraden. 6 00:00:23,770 --> 00:00:24,690 Hur gör vi detta? 7 00:00:24,690 --> 00:00:28,270 >> Tja, det viktigaste först, låt oss dela upp det i steg. 8 00:00:28,270 --> 00:00:31,510 Du kommer att vilja öppna infil att de ger dig, liksom 9 00:00:31,510 --> 00:00:35,560 skapa och öppna utfil som du kommer att sätta den 10 00:00:35,560 --> 00:00:38,020 ändrade bilden i. 11 00:00:38,020 --> 00:00:42,050 Sedan, eftersom du ändra storlek, och eftersom det är en bitmapp, en rubrik, så 12 00:00:42,050 --> 00:00:46,080 ska du också uppdatera sidhuvudet Information för utfil, 13 00:00:46,080 --> 00:00:47,950 och skriva det i. 14 00:00:47,950 --> 00:00:51,850 Då du kommer att läsa in den scanlinje av infil, 15 00:00:51,850 --> 00:00:56,890 pixel-för-pixel, ändra storlek horisontellt och skriva dessa pixlar till den 16 00:00:56,890 --> 00:01:00,910 utfil, såsom anges av användarens skala. 17 00:01:00,910 --> 00:01:03,940 >> Du kommer att komma ihåg att lägga stoppning som behövs. 18 00:01:03,940 --> 00:01:05,400 Mer om det senare. 19 00:01:05,400 --> 00:01:07,790 Och sedan, också ändra storlek vertikalt. 20 00:01:07,790 --> 00:01:08,890 OK. 21 00:01:08,890 --> 00:01:13,280 Så det här kommer att vara lite mer komplicerat än Vem gjort det, men 22 00:01:13,280 --> 00:01:18,310 vad är liknande är att copy.c kommer, återigen, vara mycket användbar. 23 00:01:18,310 --> 00:01:23,160 Kom ihåg att copy.c öppnar en fil, uppdaterar informationen header för 24 00:01:23,160 --> 00:01:28,250 utfil, läser sedan in i scanline, pixel-för-pixel, skriva varje pixel 25 00:01:28,250 --> 00:01:30,510 i utdatafilen s scanline. 26 00:01:30,510 --> 00:01:37,040 >> Så återigen, ditt första steg kan nog vara att cp, copy.c, resize.c 27 00:01:37,040 --> 00:01:40,560 in i din PSET5 katalog. 28 00:01:40,560 --> 00:01:43,920 Kom dock ihåg, innan du kopierar den, att se till att du förstår 29 00:01:43,920 --> 00:01:46,600 copy.c mycket noggrant. 30 00:01:46,600 --> 00:01:47,620 OK. 31 00:01:47,620 --> 00:01:49,880 >> Så låt oss öppna en fil. 32 00:01:49,880 --> 00:01:50,870 Du vet hur man gör det. 33 00:01:50,870 --> 00:01:52,600 Jag kommer att lämna det till dig. 34 00:01:52,600 --> 00:01:56,050 Därefter uppdatera rubrikinformation för utfil. 35 00:01:56,050 --> 00:01:59,240 Eftersom vi har en ny bitmapp, Vi har ny header info. 36 00:01:59,240 --> 00:02:00,970 Vad är det som förändras här? 37 00:02:00,970 --> 00:02:06,000 Tja, är filstorleken kommer att förändras eftersom vi kommer att ha mer 38 00:02:06,000 --> 00:02:07,900 bildpunkter än tidigare. 39 00:02:07,900 --> 00:02:11,060 Bildstorleken är, alltså, även kommer att förändras, så är det 40 00:02:11,060 --> 00:02:13,050 bredd och höjd. 41 00:02:13,050 --> 00:02:17,180 >> Så vilka variabler som är de, egentligen? 42 00:02:17,180 --> 00:02:20,960 Tja, om man tittar in i sidhuvudet information finns du finns 43 00:02:20,960 --> 00:02:25,640 biSizeImage, vilket representerar det totala storleken på bilden i byte, 44 00:02:25,640 --> 00:02:28,340 inklusive pixlar och stoppning. 45 00:02:28,340 --> 00:02:32,520 biWidth är bredden av bilden i pixlar, minus stoppning. 46 00:02:32,520 --> 00:02:35,580 biHeight är höjden av bildpunkter. 47 00:02:35,580 --> 00:02:39,200 Och så de som finns i structs BITMAPFILEHEADER och 48 00:02:39,200 --> 00:02:40,390 BITMAPINFOHEADER. 49 00:02:40,390 --> 00:02:45,300 Du kan tala om vilken som är vilken av kommer att bmp.h och titta på 50 00:02:45,300 --> 00:02:49,670 BITMAPINFOHEADER struct och seende vilka variabler som är listade där. 51 00:02:49,670 --> 00:02:54,700 >> Så för att uppdatera outfiles header informationen, du kommer att vilja 52 00:02:54,700 --> 00:02:57,025 ändra dessa värden på höjd och bredd. 53 00:02:57,025 --> 00:03:00,570 Men risken är, kanske du behöver lite av infil s rubrikinformation 54 00:03:00,570 --> 00:03:03,670 senare, så bäst att hålla reda på båda. 55 00:03:03,670 --> 00:03:07,770 Men var mycket tydlig med din variabel namn så att du inte av misstag 56 00:03:07,770 --> 00:03:12,490 skriver de felaktiga värden i rubriken för utfil. 57 00:03:12,490 --> 00:03:16,160 >> Så nu ska vi komma till att läsa in den scanline pixel-för-pixel. 58 00:03:16,160 --> 00:03:20,210 Återigen, vi kommer att vända sig till vår trogna fil I / O-bibliotek, och titta på 59 00:03:20,210 --> 00:03:22,100 den fread funktion. 60 00:03:22,100 --> 00:03:26,150 fread tar in en pekare till en struct som kommer att innehålla de bytes som 61 00:03:26,150 --> 00:03:30,130 du läser in, storleken på varje element som du läser - 62 00:03:30,130 --> 00:03:34,410 igen, sizeof kommer att vara användbar fungera här, numret på den 63 00:03:34,410 --> 00:03:38,820 element av storlek, storlek, att du är läsa in, och sedan slutligen den 64 00:03:38,820 --> 00:03:41,310 inpointer, den fil som du läser från. 65 00:03:41,310 --> 00:03:46,770 Så du tar antal element av storlek från inpointer och 66 00:03:46,770 --> 00:03:49,040 sätta dem i data. 67 00:03:49,040 --> 00:03:51,695 >> Nu är det dags att ändra storlek horisontellt. 68 00:03:51,695 --> 00:03:56,880 om n är lika med 2, då för varje pixel i den infil, vi kommer att skriva den 69 00:03:56,880 --> 00:04:00,870 två gånger i utfil. 70 00:04:00,870 --> 00:04:02,210 Hur ska vi skriva filer? 71 00:04:02,210 --> 00:04:06,400 Tja, vi har fwrite funktion, så Vi har tagit pekaren till struct 72 00:04:06,400 --> 00:04:10,170 som innehåller de bytes som du är skriver från, och då vi passerar in 73 00:04:10,170 --> 00:04:14,430 storlek, antal, och utsignalen, där du kommer att skriva det. 74 00:04:14,430 --> 00:04:19,200 Och sedan upprepa en process, kommer att vara kan en enkel iterativ för slinga. 75 00:04:19,200 --> 00:04:21,740 >> Men vi måste komma ihåg att lägga stoppning i. 76 00:04:21,740 --> 00:04:26,040 Begreppet stoppning är att, ja, varje pixel är tre tuggor, men det 77 00:04:26,040 --> 00:04:28,940 storleken på varje scanline must vara en multipel av 4 byte. 78 00:04:28,940 --> 00:04:33,660 Så om antalet pixlar är inte multipel av 4, måste vi lägga till några 79 00:04:33,660 --> 00:04:36,630 stoppning, som ligger bara nollor. 80 00:04:36,630 --> 00:04:42,130 Nu, till skillnad vem gjort det, och till skillnad från kopia, då infil bilden och den 81 00:04:42,130 --> 00:04:44,370 utfil fil har olika har annorlunda stoppning för att de är 82 00:04:44,370 --> 00:04:46,360 olika bredder. 83 00:04:46,360 --> 00:04:46,690 >> OK. 84 00:04:46,690 --> 00:04:51,050 Så kanske en formel skulle komma väl till pass här. 85 00:04:51,050 --> 00:04:55,120 Jag lämnar det till dig att hitta det, men säga att, att skriva stoppning, 86 00:04:55,120 --> 00:04:59,360 bra, det är bara en enkel fputc funktion, passerar i karaktären 87 00:04:59,360 --> 00:05:02,200 som du vill skriva, och sedan filpekaren att du 88 00:05:02,200 --> 00:05:04,280 vill skriva till. 89 00:05:04,280 --> 00:05:08,670 Så nu när vi har storleksändras vågrätt, och sedan används stoppning, 90 00:05:08,670 --> 00:05:12,030 kom ihåg att du måste flytta din fil lägesindikator, eftersom du 91 00:05:12,030 --> 00:05:14,480 kan inte fread in stoppning. 92 00:05:14,480 --> 00:05:18,230 Så du vill vara säker på att filen lägesindikering i infil 93 00:05:18,230 --> 00:05:19,980 är vid den korrekta punkten. 94 00:05:19,980 --> 00:05:23,970 Eftersom vi även vill ändra storlek vertikalt. 95 00:05:23,970 --> 00:05:27,090 Vi kan inte bara sträcka ut den horisontellt, eftersom varje rad behov 96 00:05:27,090 --> 00:05:30,370 som ska kopieras N gånger. 97 00:05:30,370 --> 00:05:33,050 >> Nu finns det flera olika sätt att göra detta. 98 00:05:33,050 --> 00:05:39,010 Så en, kan vi använda en omskrivningsmetod, i att vi minns alla de pixlar 99 00:05:39,010 --> 00:05:42,840 av en given rad i en matris, och då skriver vi att array som 100 00:05:42,840 --> 00:05:44,730 många gånger som behövs. 101 00:05:44,730 --> 00:05:49,530 Eller finns det kopieras igen metod där, efter att ha läst i en rad i infil 102 00:05:49,530 --> 00:05:53,530 och sedan skriva in det i utfil, tillsats av den stoppning, vi fseek 103 00:05:53,530 --> 00:05:57,250 tillbaka till början av den ursprungliga raden, och sedan upprepa den horisontella 104 00:05:57,250 --> 00:05:58,710 storleksändring därifrån. 105 00:05:58,710 --> 00:06:02,280 Oavsett vilken metod, men, du ska vill att varje bildpunkt ska upprepas 106 00:06:02,280 --> 00:06:06,370 n gånger, och varje rad för att vara upprepas n gånger också. 107 00:06:06,370 --> 00:06:09,160 >> Med det får du bitmapp större än livet. 108 00:06:09,160 --> 00:06:11,760 Mitt namn är Zamyla, och detta är CS50. 109 00:06:11,760 --> 00:06:19,542