1 00:00:00,000 --> 00:00:10,210 >> [Musikgengivelse] 2 00:00:10,210 --> 00:00:13,320 >> ZAMYLA CHAN: Lad os slag tingene op med resize. 3 00:00:13,320 --> 00:00:17,710 I resize, vil brugeren passere i gennem kommandolinjen, en bitmap billede, 4 00:00:17,710 --> 00:00:21,860 de vil have dig til at skalere med en række at de også passere, 5 00:00:21,860 --> 00:00:23,770 i kommandolinjen. 6 00:00:23,770 --> 00:00:24,690 Hvordan gør vi det? 7 00:00:24,690 --> 00:00:28,270 >> Nå, første ting først, lad os opdele det i trin. 8 00:00:28,270 --> 00:00:31,510 Du vil ønsker at åbne infile at de giver dig, såvel som 9 00:00:31,510 --> 00:00:35,560 skabe og åbn outfile der du kommer til at sætte 10 00:00:35,560 --> 00:00:38,020 ændrede billede i. 11 00:00:38,020 --> 00:00:42,050 Så fordi du resizing, og fordi det er en bitmap, det en overskrift, så 12 00:00:42,050 --> 00:00:46,080 du vil også opdatere header oplysninger til outfile, 13 00:00:46,080 --> 00:00:47,950 og skrive, at i. 14 00:00:47,950 --> 00:00:51,850 Så du kommer til at læse i Den scanlinie af infile, 15 00:00:51,850 --> 00:00:56,890 pixel-for-pixel, resizing vandret og skrive de pixels i 16 00:00:56,890 --> 00:01:00,910 outfile, som specificeret af brugerens skala. 17 00:01:00,910 --> 00:01:03,940 >> Du kommer til at huske at tilføje polstring nødvendigt. 18 00:01:03,940 --> 00:01:05,400 Mere om det senere. 19 00:01:05,400 --> 00:01:07,790 Og så også ændre størrelsen lodret. 20 00:01:07,790 --> 00:01:08,890 OK. 21 00:01:08,890 --> 00:01:13,280 Så dette vil være en lille smule mere kompliceret end Hvem gjort det, men 22 00:01:13,280 --> 00:01:18,310 hvad der er ens, er, at copy.c vil, igen, vise sig meget nyttig. 23 00:01:18,310 --> 00:01:23,160 Husk, at copy.c åbner en fil, opdaterer oplysninger om headeren 24 00:01:23,160 --> 00:01:28,250 outfile, læser derefter ind i scanlinie, pixel-for-pixel, skrive hver pixel 25 00:01:28,250 --> 00:01:30,510 i uddatafilens scanlinie. 26 00:01:30,510 --> 00:01:37,040 >> Så igen, dit første skridt ville sandsynligvis være at cp, copy.c, resize.c 27 00:01:37,040 --> 00:01:40,560 ind i din PSET5 bibliotek. 28 00:01:40,560 --> 00:01:43,920 Husk dog, før du kopierer det, at sikre, at du forstår 29 00:01:43,920 --> 00:01:46,600 copy.c meget grundigt. 30 00:01:46,600 --> 00:01:47,620 OK. 31 00:01:47,620 --> 00:01:49,880 >> Så lad os åbne en fil. 32 00:01:49,880 --> 00:01:50,870 Du ved, hvordan man gør det. 33 00:01:50,870 --> 00:01:52,600 Jeg har tænkt mig at overlade til dig. 34 00:01:52,600 --> 00:01:56,050 Dernæst opdatere oplysningerne header for outfile. 35 00:01:56,050 --> 00:01:59,240 Fordi vi har en ny bitmap, Vi har nye header info. 36 00:01:59,240 --> 00:02:00,970 Hvad ændrer sig her? 37 00:02:00,970 --> 00:02:06,000 Nå, er filstørrelsen kommer til at ændre fordi vi vil have mere 38 00:02:06,000 --> 00:02:07,900 pixels end før. 39 00:02:07,900 --> 00:02:11,060 Billedet størrelse er således også kommer til at ændre, som det er 40 00:02:11,060 --> 00:02:13,050 bredden og højden. 41 00:02:13,050 --> 00:02:17,180 >> Så hvilke variable er dem, helt præcist? 42 00:02:17,180 --> 00:02:20,960 Tja, hvis du kigger ind i header information, du ser der er 43 00:02:20,960 --> 00:02:25,640 biSizeImage, der repræsenterer det samlede billedets størrelse i byte, 44 00:02:25,640 --> 00:02:28,340 herunder pixels og polstring. 45 00:02:28,340 --> 00:02:32,520 biWidth er bredden af ​​billedet i pixels minus polstring. 46 00:02:32,520 --> 00:02:35,580 biHeight er højden af billedet i pixels. 47 00:02:35,580 --> 00:02:39,200 Og så dem, der er indeholdt i structs BITMAPFILEHEADER og 48 00:02:39,200 --> 00:02:40,390 BITMAPINFOHEADER. 49 00:02:40,390 --> 00:02:45,300 Du kan fortælle hvilken en der er ved kommer til at bmp.h og kigge på 50 00:02:45,300 --> 00:02:49,670 BITMAPINFOHEADER struct og seeing hvilke variable, er optaget dér. 51 00:02:49,670 --> 00:02:54,700 >> Så for at opdatere outfiles header information, du vil ønsker at 52 00:02:54,700 --> 00:02:57,025 ændre disse værdier af højden og bredden. 53 00:02:57,025 --> 00:03:00,570 Men chancerne er, du måske brug for nogle af infile overskrift information 54 00:03:00,570 --> 00:03:03,670 senere, så bedst at holde styr på begge. 55 00:03:03,670 --> 00:03:07,770 Men vær meget klar med din variabel navne, så du ikke ved et uheld 56 00:03:07,770 --> 00:03:12,490 skriver de forkerte værdier i header for outfile. 57 00:03:12,490 --> 00:03:16,160 >> Så lad os nu komme til at læse ind i den scanlinie pixel-for-pixel. 58 00:03:16,160 --> 00:03:20,210 Igen, vi kommer til at henvende sig til vores trofaste fil I / O-bibliotek, og se på 59 00:03:20,210 --> 00:03:22,100 den fread funktion. 60 00:03:22,100 --> 00:03:26,150 fread tager i en pointer til en struct , der skal indeholde de byte, der 61 00:03:26,150 --> 00:03:30,130 du læser i, størrelsen af ​​hver element, du læser - 62 00:03:30,130 --> 00:03:34,410 igen, sizeof vil være nyttig fungere her antallet af 63 00:03:34,410 --> 00:03:38,820 elementer af størrelse, størrelse, at du er læsning i, og endelig 64 00:03:38,820 --> 00:03:41,310 inpointer, den fil, du læser fra. 65 00:03:41,310 --> 00:03:46,770 Så du tager antal elementer størrelse fra inpointer og 66 00:03:46,770 --> 00:03:49,040 sætte dem i data. 67 00:03:49,040 --> 00:03:51,695 >> Nu er det tid til at ændre størrelsen vandret. 68 00:03:51,695 --> 00:03:56,880 hvis n er lig med 2 og derefter for hver pixel i den infile, vi kommer til at skrive det 69 00:03:56,880 --> 00:04:00,870 to gange i outfile. 70 00:04:00,870 --> 00:04:02,210 Hvordan kan vi skrive filer? 71 00:04:02,210 --> 00:04:06,400 Tja, vi har den fwrite funktion, så vi har taget pointer til struct 72 00:04:06,400 --> 00:04:10,170 der indeholder de bytes, at du er skriver fra, og så må vi passere i 73 00:04:10,170 --> 00:04:14,430 størrelse, antal, og output, hvor du kommer til at skrive det. 74 00:04:14,430 --> 00:04:19,200 Og derefter at gentage en proces, vil være kunne et simpelt iterativ for loop. 75 00:04:19,200 --> 00:04:21,740 >> Men vi er nødt til at huske at tilføje polstring i. 76 00:04:21,740 --> 00:04:26,040 Begrebet polstring er at, ja, hver pixel er tre bites, men 77 00:04:26,040 --> 00:04:28,940 størrelsen af ​​hver scanlinie must være et multiplum af 4 byte. 78 00:04:28,940 --> 00:04:33,660 Så hvis antallet af pixels er ikke multiplum af 4, er vi nødt til at tilføje nogle 79 00:04:33,660 --> 00:04:36,630 polstring, der er kun nuller. 80 00:04:36,630 --> 00:04:42,130 Nu, i modsætning Hvem gjort det, og i modsætning til kopi, så infile billede og 81 00:04:42,130 --> 00:04:44,370 outfile fil har forskellige har anderledes polstring, fordi de er 82 00:04:44,370 --> 00:04:46,360 forskellige bredder. 83 00:04:46,360 --> 00:04:46,690 >> OK. 84 00:04:46,690 --> 00:04:51,050 Så måske en formel ville komme i handy her. 85 00:04:51,050 --> 00:04:55,120 Jeg vil overlade det til dig at finde ud af det, men fortælle dig, at for at skrive polstring, 86 00:04:55,120 --> 00:04:59,360 godt, det er bare en simpel fputc funktion, passerer tegnet 87 00:04:59,360 --> 00:05:02,200 at du ønsker at skrive, og derefter filpointeren, du 88 00:05:02,200 --> 00:05:04,280 ønsker at skrive til. 89 00:05:04,280 --> 00:05:08,670 Så nu, at vi har ændret størrelse horisontalt, og derefter anvendes polstring, 90 00:05:08,670 --> 00:05:12,030 husk at du skal flytte din fil position indikator, fordi du 91 00:05:12,030 --> 00:05:14,480 kan ikke fread i polstring. 92 00:05:14,480 --> 00:05:18,230 Så du vil være sikker på, at din fil position indikator i infile 93 00:05:18,230 --> 00:05:19,980 er på det rigtige tidspunkt. 94 00:05:19,980 --> 00:05:23,970 Fordi vi ønsker også at resize lodret. 95 00:05:23,970 --> 00:05:27,090 Vi kan ikke bare strække det vandret, fordi hver række behov 96 00:05:27,090 --> 00:05:30,370 skal kopieres n gange. 97 00:05:30,370 --> 00:05:33,050 >> Nu er der flere forskellige måder at gøre dette. 98 00:05:33,050 --> 00:05:39,010 Så en, kan vi bruge en omskrivning metode, i at vi husker alle de pixels 99 00:05:39,010 --> 00:05:42,840 en given række i et array, og så vi skriver, at array som 100 00:05:42,840 --> 00:05:44,730 mange gange som nødvendigt. 101 00:05:44,730 --> 00:05:49,530 Eller der er den igen kopiere metoden, hvor efter at have læst i en række i infile 102 00:05:49,530 --> 00:05:53,530 og derefter skrive det ind i outfile, tilsætning af polstring, vi fseek 103 00:05:53,530 --> 00:05:57,250 tilbage til starten af ​​den oprindelige række, og derefter gentage den vandrette 104 00:05:57,250 --> 00:05:58,710 størrelsesændring derfra. 105 00:05:58,710 --> 00:06:02,280 Uanset hvilken metode, selv om, vil du ønsker hver pixel skal gentages 106 00:06:02,280 --> 00:06:06,370 n gange, og hver række til at være gentaget n gange så godt. 107 00:06:06,370 --> 00:06:09,160 >> Med det, vil du have bitmap større end livet. 108 00:06:09,160 --> 00:06:11,760 Mit navn er Zamyla, og det er CS50. 109 00:06:11,760 --> 00:06:19,542