1 00:00:00,000 --> 00:00:02,700 [Powered by Google Translate] [Walk Through - Probleem Set 4] 2 00:00:02,700 --> 00:00:05,000 [Zamyla Chan - Harvard Universiteit] 3 00:00:05,000 --> 00:00:07,340 [Hierdie is CS50. - CS50.TV] 4 00:00:08,210 --> 00:00:11,670 Alles reg. Hallo, almal, en welkom by Walk Through 4. 5 00:00:11,670 --> 00:00:14,270 >> Vandag ons pset is Forensics. 6 00:00:14,270 --> 00:00:18,080 Forensics is 'n baie pret pset wat die volgende behels die hantering van bitmap lêers 7 00:00:18,080 --> 00:00:21,550 om te ontdek wat 'n misdaad gepleeg het. 8 00:00:21,550 --> 00:00:24,200 Daarna het ons gaan 'n bitmap lêers om te verander, 9 00:00:24,200 --> 00:00:27,780 dan is ons ook gaan om te gaan met 'n baie pret deel genoem Herstel, 10 00:00:27,780 --> 00:00:31,160 wat ons is basies 'n geheue kaart ingehandig 11 00:00:31,160 --> 00:00:34,350 wat iemand per ongeluk geskrap al hulle lêers, 12 00:00:34,350 --> 00:00:38,860 en ons is gevra om die lêers te herstel. 13 00:00:38,860 --> 00:00:42,910 >> Maar eers, voor ons in die pset kry, ek regtig wil net almal geluk te wens. 14 00:00:42,910 --> 00:00:45,230 Ons is op die punt om by die middelpunt van hierdie kursus. 15 00:00:45,230 --> 00:00:50,070 Quiz 0 is agter ons, en ons is op pset4, so in wese, het ons halfpad is. 16 00:00:50,070 --> 00:00:55,490 Ons het 'n lang pad as jy terugkyk na jou psets, pset0 en pset1, 17 00:00:55,490 --> 00:00:57,300 so gelukwens jouself oor wat, 18 00:00:57,300 --> 00:01:00,760 en ons gaan om te kry in 'n paar regtig fun stuff. 19 00:01:00,760 --> 00:01:07,070 >> So ons toolbox vir hierdie pset, weer, in plaas van die bestuur van sudo yum-y update, 20 00:01:07,070 --> 00:01:13,890 ons is in staat om net hardloop update50 as jy by weergawe 17,3 en bo van die toestel. 21 00:01:13,890 --> 00:01:17,380 So seker wees update50 uit te voer - dit is 'n baie makliker, 'n paar minder karakters - 22 00:01:17,380 --> 00:01:20,640 om seker te maak dat jy die nuutste weergawe van die toestel. 23 00:01:20,640 --> 00:01:25,410 Dit is veral belangrik om te update50 wanneer ons begin met behulp van CS50 Check. 24 00:01:25,410 --> 00:01:28,700 So maak seker dat jy dit doen. 25 00:01:28,700 --> 00:01:30,760 >> Vir al die afdelings vir hierdie pset, 26 00:01:30,760 --> 00:01:34,350 ons gaan doen met lêer insette en uitsette, lêer I / O. 27 00:01:34,350 --> 00:01:38,140 Ons gaan om te gaan oor 'n klomp van programme wat hanteer skikkings 28 00:01:38,140 --> 00:01:40,350 verwys na lêers en dinge soos wat, 29 00:01:40,350 --> 00:01:43,050 sodat ons wil hê om seker te maak dat ons regtig vertroud en gemaklik 30 00:01:43,050 --> 00:01:47,990 wat handel oor hoe om te inset en uitset in lêers. 31 00:01:47,990 --> 00:01:52,080 >> In die verspreiding kode vir hierdie pset is 'n lêer genaamd copy.c, 32 00:01:52,080 --> 00:01:55,280 en dit is wat ons gaan om uit te vind is gaan om te wees regtig nuttig vir ons 33 00:01:55,280 --> 00:02:00,340 want ons gaan eindig eintlik die kopiëring van die copy.c lêer 34 00:02:00,340 --> 00:02:05,350 en net verander dit effens in staat te wees om die eerste 2 dele van die probleem stel te bereik. 35 00:02:05,350 --> 00:02:09,030 >> En so is daar dan soos ek voorheen genoem, is ons handel met bitmaps sowel as JPEG. 36 00:02:09,030 --> 00:02:13,170 So regtig begrip van die struktuur van hoe dié lêers georganiseer, 37 00:02:13,170 --> 00:02:16,170 hoe ons werklik kan vertaal die 0'e en 1s in structs 38 00:02:16,170 --> 00:02:19,040 en dinge dat ons werklik kan verstaan ​​en te interpreteer, wysig, 39 00:02:19,040 --> 00:02:21,000 wat werklik belangrik sal wees, 40 00:02:21,000 --> 00:02:25,970 so gaan in JPEG en bitmap lêers en begrip van die struktuur van daardie. 41 00:02:25,970 --> 00:02:30,780 >> Pset4, soos gewoonlik, begin met 'n gedeelte van die vrae. 42 00:02:30,780 --> 00:02:36,600 Diegene sal hanteer lêer I / O en jy gewoond aan. 43 00:02:36,600 --> 00:02:42,520 Dan deel 1 is detective verhaal, waarin jy 'n bitmap-lêer is gegee 44 00:02:42,520 --> 00:02:45,630 wat lyk soort van soos rooi kolletjies oral oor. 45 00:02:45,630 --> 00:02:52,180 En dan basies wat ons gaan doen is om hierdie lêer en dit verander net effens 46 00:02:52,180 --> 00:02:54,010 in 'n weergawe wat ons kan lees. 47 00:02:54,010 --> 00:02:56,000 Wese, sodra ons klaar is, sal ons dieselfde lêer, 48 00:02:56,000 --> 00:03:02,630 behalwe ons sal in staat wees om die verborge boodskap te sien wat verborge is deur al die rooi kolle. 49 00:03:02,630 --> 00:03:07,310 Dan Resize is 'n program dat, gegewe 'n lêer 50 00:03:07,310 --> 00:03:11,490 en dan die naam van die lêer wat dit uitgange en dan 'n aantal so goed, 51 00:03:11,490 --> 00:03:16,850 sal werklik die grootte van daardie bitmap deur daardie heelgetalwaarde. 52 00:03:16,850 --> 00:03:19,240 Dan laastens, ons het van die vergete pset. 53 00:03:19,240 --> 00:03:24,160 Ons kry 'n geheue kaart en dan het al die foto's om te herstel 54 00:03:24,160 --> 00:03:25,920 wat per ongeluk geskrap is, 55 00:03:25,920 --> 00:03:31,420 Maar, soos ons sal leer, nie eintlik verwyder en verwyder uit die lêer; 56 00:03:31,420 --> 00:03:38,470 ons net soort van verlore waar hulle was in die lêer nie, maar ons gaan om te herstel. 57 00:03:38,470 --> 00:03:44,950 >> Groot. So gaan in lêer I / O spesifiek, dit is 'n hele lys van funksies wat jy sal gebruik word. 58 00:03:44,950 --> 00:03:49,840 Jy het reeds 'n bietjie gesien die basiese beginsels van die fopen, fread en fwrite, 59 00:03:49,840 --> 00:03:54,350 maar ons gaan om verder te kyk na 'n paar lêer I / O funksies soos fputc, 60 00:03:54,350 --> 00:03:56,930 wat jy net skryf 'n karakter op 'n tyd, 61 00:03:56,930 --> 00:04:02,000 fseek, waar jy soort van die lêer posisie aanwyser beweeg vorentoe en agtertoe, 62 00:04:02,000 --> 00:04:05,770 en dan 'n paar ander. Maar ons gaan in dat 'n bietjie later gedurende die pset. 63 00:04:08,050 --> 00:04:13,100 >> So die eerste, om net in die lêer I / O voordat ons gaan in die pset, 64 00:04:13,100 --> 00:04:19,860 'n lêer oop te maak, byvoorbeeld, is eintlik wat jy hoef te doen 'n wyser na daardie lêer. 65 00:04:19,860 --> 00:04:22,710 So ons het 'n lêer * wyser. 66 00:04:22,710 --> 00:04:27,140 In hierdie geval, ek noem dit 'n wyser, want dit gaan my infile. 67 00:04:27,140 --> 00:04:33,340 En so gaan ek die funksie fopen en dan die naam van die lêer te gebruik 68 00:04:33,340 --> 00:04:36,360 en dan die wyse waarop ek gaan te doen het met die lêer. 69 00:04:36,360 --> 00:04:42,080 So daar is "r" in hierdie geval vir lees, "w" oopmaak vir skryf, en dan 'n "" vir die aanbring. 70 00:04:42,080 --> 00:04:44,270 Byvoorbeeld, wanneer jy te doen het met 'n infile 71 00:04:44,270 --> 00:04:47,310 en al wat jy wil doen is lees die bits en bytes wat daar gestoor word, 72 00:04:47,310 --> 00:04:50,420 dan is jy waarskynlik gaan om te wil "r" as jou modus te gebruik. 73 00:04:50,420 --> 00:04:54,520 As jy wil om werklik te skryf, soort van 'n nuwe lêer, 74 00:04:54,520 --> 00:04:57,220 dan wat ons gaan doen, is ons gaan die nuwe lêer oop te maak 75 00:04:57,220 --> 00:05:02,410 en gebruik die "W"-modus vir skryf. 76 00:05:02,410 --> 00:05:07,540 >> So dan wanneer jy eintlik lees in die lêers, die struktuur is as volg. 77 00:05:07,540 --> 00:05:14,930 Die eerste wat jy sluit in die wyser na die struct wat die grepe wat jy lees sal bevat. 78 00:05:14,930 --> 00:05:19,830 So wat gaan aan die einde ligging van die grepe wat jy lees. 79 00:05:19,830 --> 00:05:23,360 Jy dan gaan om die grootte aan te dui, soos basies hoeveel bytes 80 00:05:23,360 --> 00:05:30,100 jou program het te lees in die lêer, die grootte basies een element is, 81 00:05:30,100 --> 00:05:32,620 en dan moet jy gaan om te spesifiseer hoeveel elemente wat jy wil lees. 82 00:05:32,620 --> 00:05:34,980 En dan uiteindelik, moet jy weet waar jy die lees van, 83 00:05:34,980 --> 00:05:37,580 so wat gaan jou in wyser wees. 84 00:05:37,580 --> 00:05:41,780 Ek kleur-gekodeer hierdie omdat fread is ook baie soortgelyk aan fwrite, 85 00:05:41,780 --> 00:05:47,050 behalwe as jy wil om seker te maak dat jy gebruik maak van die korrekte volgorde, 86 00:05:47,050 --> 00:05:51,960 maak seker dat jy eintlik wil skryf of lees van die regte lêer. 87 00:05:54,910 --> 00:05:58,610 >> So dan as voorheen, as ons die grootte van die element sowel as die aantal elemente, 88 00:05:58,610 --> 00:06:00,600 dan kan ons speel hier 'n bietjie. 89 00:06:00,600 --> 00:06:06,810 Sê ek het 'n hond struct en so dan wil ek twee honde op 'n keer te lees. 90 00:06:06,810 --> 00:06:12,450 Wat ek kan doen is die grootte van een element sê gaan na die grootte van 'n hond te wees 91 00:06:12,450 --> 00:06:14,770 en ek gaan om werklik te lees twee van hulle. 92 00:06:14,770 --> 00:06:18,290 Alternatiewelik, wat ek kon doen, sê ek net gaan om een ​​element te lees 93 00:06:18,290 --> 00:06:21,340 en dat een element is gaan om die grootte van die twee honde. 94 00:06:21,340 --> 00:06:24,320 So wat is analoog hoe jy kan soort van speel rond met die grootte en aantal 95 00:06:24,320 --> 00:06:28,250 afhangend op wat meer intuïtief aan jou is. 96 00:06:28,250 --> 00:06:30,810 >> Alles reg. So nou het ons kry om te skryf van lêers. 97 00:06:30,810 --> 00:06:36,880 As jy wil om 'n lêer te skryf, die eerste argument is eintlik waar jy die lees van. 98 00:06:36,880 --> 00:06:42,050 So wat is basies die data wat jy gaan skryf in die lêer, 99 00:06:42,050 --> 00:06:44,490 wat die uit wyser aan die einde. 100 00:06:44,490 --> 00:06:47,670 So wanneer jy die hantering met die pset, maak seker dat jy nie deurmekaar raak nie. 101 00:06:47,670 --> 00:06:50,480 Miskien het die definisies kant deur die kant. 102 00:06:50,480 --> 00:06:58,090 Jy kan trek die definisies in die handleiding deur te tik man en dan fwrite, byvoorbeeld, 103 00:06:58,090 --> 00:06:59,950 in die terminale, of jy kan verwys terug na hierdie slide 104 00:06:59,950 --> 00:07:03,570 en maak seker dat jy die regte een gebruik. 105 00:07:03,570 --> 00:07:08,700 So weer, vir fwrite, wanneer jy 'n lêer wat jy wil om te skryf in, 106 00:07:08,700 --> 00:07:14,290 wat gaan die laaste argument wees en dit gaan 'n wyser na daardie lêer. 107 00:07:14,290 --> 00:07:18,670 So dan is dit hoe ons omgaan met die skryf van miskien 'n paar grepe op 'n slag, 108 00:07:18,670 --> 00:07:21,820 maar sê jy wil om net te skryf in net een enkele karakter. 109 00:07:21,820 --> 00:07:25,940 Soos ons later sal sien, in hierdie voorbeeld, in die bitmaps ons sal hê om dit te gebruik. 110 00:07:25,940 --> 00:07:32,180 Dit is wanneer ons kan gebruik fputc, in wese net om een ​​karakter op 'n tyd, chromosoom, 111 00:07:32,180 --> 00:07:37,050 in die lêer pointer, en dit is ons uit wyser daar. 112 00:07:38,700 --> 00:07:41,560 So is dan wanneer ons soek of skryf in 'n lêer, 113 00:07:41,560 --> 00:07:44,690 die lêer dop van waar ons is. 114 00:07:44,690 --> 00:07:47,810 So dit is 'n soort van die muis, die lêer posisie aanwyser. 115 00:07:47,810 --> 00:07:54,330 En so wanneer ons lees of skryf nie weer in 'n lêer, 116 00:07:54,330 --> 00:07:56,760 die lêer onthou eintlik waar dit is, 117 00:07:56,760 --> 00:07:59,270 en so is dit steeds van waar die wyser is. 118 00:07:59,270 --> 00:08:03,970 Dit kan voordelig wees wanneer jy wil, sê, lees in 'n sekere bedrag om iets te doen 119 00:08:03,970 --> 00:08:06,160 en lees dan in die volgende bedrag, 120 00:08:06,160 --> 00:08:10,700 maar soms het ons dalk wil terug of eintlik die begin van 'n sekere verwysing waarde. 121 00:08:10,700 --> 00:08:16,870 So dan is die fseek funksie, wat dit doen, is stel ons in staat om die wyser om te beweeg in 'n bepaalde lêer 122 00:08:16,870 --> 00:08:19,680 'n sekere aantal grepe. 123 00:08:19,680 --> 00:08:24,260 En dan wat ons hoef te doen is om te spesifiseer waar die verwysing waarde is. 124 00:08:24,260 --> 00:08:31,520 Dus of dit vorentoe of agtertoe beweeg waar die wyser tans is, 125 00:08:31,520 --> 00:08:35,750 of ons kan bepaal dat dit net van die begin van die lêer moet beweeg in 126 00:08:35,750 --> 00:08:37,090 of van die einde van die lêer. 127 00:08:37,090 --> 00:08:41,230 En sodat jy kan slaag in 'n negatiewe of positiewe waardes bedrag, 128 00:08:41,230 --> 00:08:44,960 en dat die soort van beweeg die muis óf vorentoe of agtertoe. 129 00:08:46,170 --> 00:08:51,920 >> Voordat ons in die ander psets, enige vrae oor lêer I / O? 130 00:08:53,860 --> 00:08:59,990 Okay. Soos ons kry in meer voorbeelde, voel vry om my te stop vir vrae. 131 00:08:59,990 --> 00:09:06,930 >> So in die detective verhaal, jy oorhandig 'n bitmap lêer soortgelyk aan die rooi een op die slide, 132 00:09:06,930 --> 00:09:14,510 en dit lyk soos hierdie - 'n klomp van die rooi kolletjies - en jy nie regtig weet wat geskryf. 133 00:09:14,510 --> 00:09:23,310 As jy squint, kan jy in staat wees om te sien 'n effense blouerige kleur binne-in die middel. 134 00:09:23,310 --> 00:09:26,270 Wese, dit is waar die teks gestoor word. 135 00:09:26,270 --> 00:09:30,270 Daar was 'n moord wat gebeur het, en wat ons nodig het om uit te vind wat dit gedoen het. 136 00:09:30,270 --> 00:09:36,760 Ten einde dit te doen, moet ons soort van hierdie beeld omskakel in 'n leesbare formaat. 137 00:09:36,760 --> 00:09:42,740 As julle ooit hierdie teëgekom word, soms is daar min kits 138 00:09:42,740 --> 00:09:48,510 waar jy wil hê 'n vergrootglas met 'n rooi film. Iemand? Ja. 139 00:09:48,510 --> 00:09:52,770 So jy sal oorhandig word iets soos hierdie, sou jy 'n vergrootglas 140 00:09:52,770 --> 00:09:58,130 met die rooi film oor dit, sou jy dit oor die beeld, 141 00:09:58,130 --> 00:10:03,410 en jy sal in staat wees om te sien die boodskap daarin weggesteek. 142 00:10:03,410 --> 00:10:07,080 Ons het nie 'n vergrootglas met rooi film, so plaas ons gaan soort van ons eie 143 00:10:07,080 --> 00:10:09,060 in hierdie pset. 144 00:10:09,060 --> 00:10:15,760 En so die gebruiker gaan insette detective verhaal, dan is die leidraad, bmp, 145 00:10:15,760 --> 00:10:18,800 so wat is die infile, wat is die rooi dot boodskap, 146 00:10:18,800 --> 00:10:23,550 en dan hulle sê verdict.bmp gaan ons outfile. 147 00:10:23,550 --> 00:10:27,900 So dit gaan 'n nuwe bitmap image soortgelyk aan die leidraad een te skep 148 00:10:27,900 --> 00:10:32,600 behalwe in 'n leesbare formaat waar ons kan sien die verborge boodskap. 149 00:10:32,600 --> 00:10:37,550 >> Aangesien ons gaan doen met die redigering en bitmaps van een of ander aard te manipuleer, 150 00:10:37,550 --> 00:10:42,400 ons gaan soort duik in die struktuur van hierdie bitmap lêers. 151 00:10:42,400 --> 00:10:48,130 Ons het oor hierdie 'n bietjie in die lesing, maar laat ons kyk na hulle 'n paar meer. 152 00:10:48,130 --> 00:10:51,740 Bitmaps is in wese net 'n rangskikking van bytes 153 00:10:51,740 --> 00:10:55,790 waar ons het gespesifiseer wat bytes beteken wat. 154 00:10:55,790 --> 00:11:00,540 So hier is soort van soos 'n kaart van die bitmapafbeelding 155 00:11:00,540 --> 00:11:08,550 sê dat dit begin met 'n paar header lêers, begin met 'n paar inligting in daar. 156 00:11:08,550 --> 00:11:16,540 Jy sien dat omstreeks byte nommer 14 die grootte is van die bitmapafbeelding aangedui, 157 00:11:16,540 --> 00:11:18,520 en dit gaan voort. 158 00:11:18,520 --> 00:11:23,810 Maar wat ons werklik geïnteresseerd is hier besig is om rondom byte nommer 54. 159 00:11:23,810 --> 00:11:26,060 Ons het hierdie RGB triples. 160 00:11:26,060 --> 00:11:30,760 Wat dit gaan doen, is die werklike pixels, die kleur waardes bevat. 161 00:11:30,760 --> 00:11:35,950 Alles bo in die kop is 'n paar inligting 162 00:11:35,950 --> 00:11:41,240 wat ooreenstem met die grootte van die beeld, die breedte van die beeld, en die hoogte. 163 00:11:41,240 --> 00:11:44,930 Wanneer gaan ons later in padding op, sal ons sien waarom die grootte van die beeld 164 00:11:44,930 --> 00:11:48,670 anders kan wees as die breedte of die hoogte. 165 00:11:48,670 --> 00:11:54,240 So dan voor te stel - hierdie bitmap beelde rye grepe - 166 00:11:54,240 --> 00:11:59,370 wat ons kan doen is om te sê okay, ek gaan om te onthou dat by indeks 14, 167 00:11:59,370 --> 00:12:03,380 dit is waar die grootte is, byvoorbeeld, maar eerder wat ons gaan doen om dit makliker te maak 168 00:12:03,380 --> 00:12:06,020 is kapselt dit in 'n struct. 169 00:12:06,020 --> 00:12:08,880 En so het ons twee structs vir ons gemaak, 'n BITMAPFILEHEADER 170 00:12:08,880 --> 00:12:10,440 en 'n BITMAPINFOHEADER, 171 00:12:10,440 --> 00:12:14,840 en so wanneer ons lees in daardie lêer, by verstek dit gaan om te gaan ten einde, 172 00:12:14,840 --> 00:12:22,360 en so ten einde dit gaan ook in te vul in veranderlikes soos biWidth en biSize. 173 00:12:25,270 --> 00:12:31,230 En dan uiteindelik, is elke pixel verteenwoordig deur drie grepe. 174 00:12:31,230 --> 00:12:35,500 Die eerste een is die bedrag van blou in die pixel, die tweede is die bedrag van groen, 175 00:12:35,500 --> 00:12:41,120 en uiteindelik, die bedrag van rooi, waar 0 is in wese geen blou of geen groen of geen rooi 176 00:12:41,120 --> 00:12:43,720 en dan ff is die maksimum waarde. 177 00:12:43,720 --> 00:12:46,800 Dit is hexadecimale waardes. 178 00:12:46,800 --> 00:12:53,870 Daarom dan, as ons het ff0000>, dan is wat ooreenstem met die maksimum bedrag van blou 179 00:12:53,870 --> 00:12:58,890 en dan geen groen en geen rooi, so dan nie wat jou sal gee ons 'n blou pixel. 180 00:12:58,890 --> 00:13:04,190 Dan as ons het ff se oor die hele raad, dan beteken dit dat ons het 'n wit pixel. 181 00:13:04,190 --> 00:13:11,370 Dit is 'n soort van teenoor tipies wanneer ons sê RGB. Dit is eintlik gaan BGR. 182 00:13:12,750 --> 00:13:18,990 >> So as ons eintlik kyk na 'n voorbeeld van 'n bitmap beeld - laat my toe een hier. 183 00:13:31,560 --> 00:13:33,830 Dit is 'n bietjie klein. 184 00:13:39,890 --> 00:13:47,840 Ek inzoomen, en ons kan sien dit is pixelated. Dit lyk soos blokke van kleur. 185 00:13:47,840 --> 00:13:50,110 Jy het 'n wit blokke en dan rooi blokke. 186 00:13:50,110 --> 00:13:53,700 As jy speel in Microsoft Paint, byvoorbeeld, kan jy maak iets soos dit 187 00:13:53,700 --> 00:13:58,960 deur basies net verf sekere blokkies in 'n spesifieke volgorde. 188 00:13:58,960 --> 00:14:08,060 So dan wat dit beteken in die bitmap is soos volg. 189 00:14:08,060 --> 00:14:15,710 Hier het ons eerste wit pixels, dat alle 6 f se, en dan het ons rooi pixels, 190 00:14:15,710 --> 00:14:19,910 aangedui deur 0000FF. 191 00:14:19,910 --> 00:14:27,940 En so het die volgorde van die grepe wat ons het dui aan hoe die bitmapafbeelding gaan om te kyk. 192 00:14:27,940 --> 00:14:32,230 So, wat ek hier gedoen het is net uitgeskryf al die grepe en dan bruin in die rooi 193 00:14:32,230 --> 00:14:37,550 sodat jy kan soort van sien, as jy squint 'n bietjie, hoe daardie soort dui op 'n smiley face. 194 00:14:40,180 --> 00:14:46,390 >> Die manier waarop bitmap beelde werk is ek visies dit basies as 'n rooster. 195 00:14:46,390 --> 00:14:54,940 En so by verstek, elke ry van die rooster het aan 'n veelvoud van 4 grepe. 196 00:15:00,520 --> 00:15:07,060 As ons kyk na 'n bitmap image, jy vul in elke waarde. 197 00:15:07,060 --> 00:15:17,370 Byvoorbeeld, kan jy 'n rooi hier, 'n groen hier, hier 'n blou, 198 00:15:17,370 --> 00:15:24,950 maar jy het om seker te maak dat die beeld is gevul met 'n veelvoud van vier grepe. 199 00:15:24,950 --> 00:15:32,200 So as ek wil my beeld te wees drie blokke wyd, dan sou ek 'n leë waarde te stel 200 00:15:32,200 --> 00:15:35,640 in die laaste een om te maak dit 'n veelvoud van vier. 201 00:15:35,640 --> 00:15:39,530 So, dan sou ek voeg in iets wat ons roep padding. 202 00:15:39,530 --> 00:15:43,750 Ek gaan net om aan te dui dat daar met 'n x. 203 00:15:44,920 --> 00:15:54,160 Nou sê ons wil 'n beeld wat 7 pixels lank is, byvoorbeeld. 204 00:15:54,160 --> 00:15:59,550 Ons het 1, 2, 3, 4, 5, 6, 7, 205 00:16:04,750 --> 00:16:07,000 en al wat is gevul met kleur. 206 00:16:07,000 --> 00:16:10,620 Die manier waarop bitmap beelde werk is dat ons 'n 8ste. 207 00:16:10,620 --> 00:16:12,460 Reg nou is ons het 1, 2, 3, 4, 5, 6, 7. 208 00:16:12,460 --> 00:16:19,360 Ons moet 8 ruimtes vir die bitmap beeld te korrek te lees. 209 00:16:19,360 --> 00:16:25,600 So dan wat ons hoef te doen is voeg in net 'n bietjie van die padding 210 00:16:25,600 --> 00:16:29,430 om seker te maak dat al die breedtes is uniform 211 00:16:29,430 --> 00:16:34,260 en dat al die breedtes is 'n veelvoud van 4. 212 00:16:42,110 --> 00:16:47,310 En so het ek voorheen aangedui, padding as 'n x of 'n kronkel lyn, 213 00:16:47,310 --> 00:16:53,880 maar in die werklike bitmap beelde die padding word aangedui deur 'n heksadesimale 0. 214 00:16:53,880 --> 00:16:57,340 So, wat sou 'n enkele karakter, 0 wees. 215 00:16:58,980 --> 00:17:06,329 Wat kan handig te pas kom in die xxd opdrag. 216 00:17:06,329 --> 00:17:11,220 Wat beteken dit eintlik wys jy, soos soortgelyk aan wat ek gedoen het voordat met die smiley 217 00:17:11,220 --> 00:17:15,630 wanneer ek eintlik gedruk wat elke kleur sou wees vir die pixel 218 00:17:15,630 --> 00:17:21,800 en dan kleur-gekodeer, wanneer jy loop xxd met die volgende opdragte, 219 00:17:21,800 --> 00:17:28,670 dan sal dit werklik druk wat die kleure is vir diegene pixels. 220 00:17:28,670 --> 00:17:33,810 Wat jy hoef te doen, is ek hier aandui, soos die-s 54 221 00:17:33,810 --> 00:17:36,530 sê dat ek gaan om te begin by die 54ste byte 222 00:17:36,530 --> 00:17:40,820 want voor dit, onthou as ons terug kyk na die kaart van die bitmaps, 223 00:17:40,820 --> 00:17:42,690 dis al wat die header information en dinge soos dat. 224 00:17:42,690 --> 00:17:46,280 Maar wat ons regtig omgee, is die werklike pixels wat dui op die kleur. 225 00:17:46,280 --> 00:17:52,700 So deur die toevoeging in daardie vlag,-s 54, dan is ons in staat om die kleur waardes te sien. 226 00:17:52,700 --> 00:17:56,020 En moenie bekommerd wees oor die ingewikkelde vlae en dinge soos dat. 227 00:17:56,020 --> 00:18:05,020 In die probleem stel spec, sal jy aanwysings oor hoe om te gebruik xxd die pixels te vertoon. 228 00:18:07,070 --> 00:18:15,590 So as jy hier sien, lyk dit soort van soos 'n groen boks, hierdie klein ding. 229 00:18:15,590 --> 00:18:23,610 Ek het kleur-gekodeer die 00FF00 as basies sê geen blou, 'n baie van groen, en geen rooi. 230 00:18:23,610 --> 00:18:26,370 So wat ooreenstem met groen. 231 00:18:26,370 --> 00:18:31,920 As wat jy hier sien, sien ons 'n groen reghoek. 232 00:18:31,920 --> 00:18:36,660 Hierdie groen reghoek is slegs 3 pixels wyd, so dan wat ons hoef te doen 233 00:18:36,660 --> 00:18:44,350 om seker te maak dat die beeld is 'n veelvoud van 4 breed voeg in 'n ekstra padding. 234 00:18:44,350 --> 00:18:49,460 En so dan is dit hoe jy hierdie 0'e sien hier. 235 00:18:49,460 --> 00:18:54,510 Dit sal eintlik die gevolg van jou Resize pset, 236 00:18:54,510 --> 00:19:01,350 hoofsaaklik om die klein bitmap en dan die uitbreiding van dit deur 4. 237 00:19:01,350 --> 00:19:09,380 En so wat ons sien is dat eintlik hierdie beeld is 12 pixels wyd, maar 12 is 'n veelvoud van 4, 238 00:19:09,380 --> 00:19:12,940 en so het ons eintlik sien nie enige 0'e aan die einde, want ons hoef nie by te voeg 239 00:19:12,940 --> 00:19:19,070 want dit is ten volle opgestopte. Dit hoef nie 'n meer ruimte. 240 00:19:20,720 --> 00:19:23,470 >> Okay. Enige vrae oor padding? 241 00:19:25,150 --> 00:19:27,460 Okay. Cool. 242 00:19:27,460 --> 00:19:32,520 >> Soos ek voorheen genoem, die bitmaps is net 'n reeks van grepe. 243 00:19:32,520 --> 00:19:39,170 En wat ons het, is in plaas van nodig om tred te hou van presies watter aantal byte 244 00:19:39,170 --> 00:19:47,050 ooreenstem met 'n spesifieke element, ons eintlik 'n struct om dit te stel. 245 00:19:47,050 --> 00:19:50,930 So, wat ons het is 'n RGBTRIPLE struct. 246 00:19:50,930 --> 00:19:54,590 Wanneer jy 'n voorbeeld van 'n RGB triple, 247 00:19:54,590 --> 00:20:00,970 want dit is 'n tipe definieer struct, dan kan jy toegang tot die rgbtBlue veranderlike, 248 00:20:00,970 --> 00:20:09,520 insgelyks die groen en rooi veranderlikes, wat sal aandui hoeveel blou, groen en rooi, 249 00:20:09,520 --> 00:20:11,580 onderskeidelik, wat jy het. 250 00:20:11,580 --> 00:20:16,800 >> So indien ons het die blou veranderlike stel tot 0, die groen stel ff 251 00:20:16,800 --> 00:20:22,060 wat is die maksimum waarde wat jy kan hê, en dan die rooi veranderlike ingestel op 0, 252 00:20:22,060 --> 00:20:27,870 dan watter kleur sou hierdie spesifieke RGB triple verteenwoordig? >> [Student] Green. 253 00:20:27,870 --> 00:20:29,150 Green. Presies. 254 00:20:29,150 --> 00:20:34,480 Dit gaan nuttig wees om te weet dat wanneer jy 'n voorbeeld van 'n RGB triple, 255 00:20:34,480 --> 00:20:41,340 jy kan eintlik toegang tot die bedrag van kleur - blou, groen en rooi - afsonderlik. 256 00:20:43,350 --> 00:20:54,900 >> Nou dat ons het gepraat oor die struktuur van die, kom ons neem 'n blik op die BMP-lêer. 257 00:20:54,900 --> 00:20:57,870 Dit is structs vir jou gemaak. 258 00:20:57,870 --> 00:21:01,820 Hier het ons het 'n BITMAPFILEHEADER struct. 259 00:21:01,820 --> 00:21:07,610 Van belang is die grootte. 260 00:21:07,610 --> 00:21:12,660 Later, het ons die info kop, wat het 'n paar dinge wat interessant is vir ons, 261 00:21:12,660 --> 00:21:15,480 naamlik die grootte, die breedte en die hoogte. 262 00:21:15,480 --> 00:21:19,170 Soos ons gaan in later, wanneer jy lees in die lêer, 263 00:21:19,170 --> 00:21:25,500 dit lees outomaties in, want ons het die bevel om dieselfde te wees. 264 00:21:25,500 --> 00:21:31,990 So die biSize sal die regte bytes wat ooreenstem met die werklike grootte van die beeld. 265 00:21:34,700 --> 00:21:40,500 En dan hier, laastens, as ons het gepraat oor, het ons die RGBTRIPLE typedef struct. 266 00:21:40,500 --> 00:21:46,840 Ons het 'n rgbtBlue, Green, en Red wat verband hou met dit. 267 00:21:48,210 --> 00:21:49,340 >> Groot. Okay. 268 00:21:49,340 --> 00:21:56,360 Nou dat ons verstaan ​​bitmaps 'n bietjie, verstaan ​​dat ons 'n lêer header 269 00:21:56,360 --> 00:22:00,790 en 'n info header wat verband hou met dit en dan na daardie, ons het die interessante dinge 270 00:22:00,790 --> 00:22:05,110 van die kleure en die kleure verteenwoordig deur RGBTRIPLE structs, 271 00:22:05,110 --> 00:22:12,710 en diegene wat, op sy beurt, het drie waardes verbonde aan die blou, die groen en die rooi. 272 00:22:12,710 --> 00:22:17,270 >> So, nou, kan ons soort Herstel dink 'n bietjie. 273 00:22:17,270 --> 00:22:20,130 Jammer. Dink oor die detective verhaal. 274 00:22:20,130 --> 00:22:25,750 Wanneer ons ons leidraad lêer, dan wat ons wil doen, is om dit te lees in pixel vir pixel 275 00:22:25,750 --> 00:22:33,860 en dan een of ander manier daardie pixels verander sodat ons dit kan uitvoer in 'n leesbare formaat. 276 00:22:33,860 --> 00:22:41,020 En so het dit tot uitvoer, ons gaan pixel pixel in die verdict.bmp lêer te skryf. 277 00:22:41,020 --> 00:22:45,120 Dit is soort van 'n baie om te doen. Ons besef dat. 278 00:22:45,120 --> 00:22:49,860 So wat ons gedoen het is ons eintlik het op voorwaarde dat jy met copy.c. 279 00:22:49,860 --> 00:22:57,610 Wat copy.c doen is net maak 'n presiese kopie van 'n gegewe bitmap lêer en dan uitgange dit. 280 00:22:57,610 --> 00:23:01,900 So dit open reeds die lêer vir jou, lees pixel vir pixel, 281 00:23:01,900 --> 00:23:04,510 en skryf dit dan in 'n uitvoer lêer. 282 00:23:04,510 --> 00:23:07,080 >> Kom ons neem 'n blik op dit. 283 00:23:13,390 --> 00:23:18,290 Dit is om te verseker behoorlike gebruik, 284 00:23:18,290 --> 00:23:22,640 om die lêername hier. 285 00:23:22,640 --> 00:23:29,940 Wat dit beteken is dit stel die invoer lêer om te wees wat ons het geslaag in die infile hier, 286 00:23:29,940 --> 00:23:34,750 wat ons tweede opdrag-lyn argument. 287 00:23:34,750 --> 00:23:37,640 Kontroleer om seker te maak dat ons die lêer kan oopmaak. 288 00:23:38,960 --> 00:23:44,860 Kontroleer om seker te maak ons ​​kan 'n nuwe outfile hier. 289 00:23:45,630 --> 00:23:53,270 Dan wat dit hier doen, is dit net begin basies lees van die begin af aan die bitmap lêer. 290 00:23:53,270 --> 00:23:56,700 Die begin, soos ons weet, bevat die BITMAPFILEHEADER, 291 00:23:56,700 --> 00:24:03,200 en so daardie rye bisse sal direk vul in die BITMAPFILEHEADER. 292 00:24:03,200 --> 00:24:07,940 So, wat het ons hier sê dat BITMAPFILEHEADER bf - 293 00:24:07,940 --> 00:24:13,150 dit is ons nuwe veranderlike van tipe BITMAPFILEHEADER - 294 00:24:13,150 --> 00:24:22,560 ons gaan sit binne bf wat ons lees in wyser, wat ons infile. 295 00:24:22,560 --> 00:24:23,970 Hoeveel lees ons? 296 00:24:23,970 --> 00:24:32,160 Ons lees in hoeveel bytes ons die hele BITMAPFILEHEADER nodig te bevat. 297 00:24:32,160 --> 00:24:34,660 Net so, dit is wat ons doen vir die info kop. 298 00:24:34,660 --> 00:24:39,010 Sodat ons verder in ons lêer in die infile, 299 00:24:39,010 --> 00:24:44,360 en ons is die lees van die bits en bytes en ons steek hulle direk in 300 00:24:44,360 --> 00:24:47,880 in hierdie gevalle van die veranderlikes wat ons maak. 301 00:24:49,370 --> 00:24:53,800 Hier is ons net om seker te maak dat die bitmap is 'n bitmap. 302 00:24:57,670 --> 00:25:01,030 >> Nou het ons 'n outfile, reg? 303 00:25:01,030 --> 00:25:04,420 So as dit staan, wanneer ons dit geskep het, dit is in wese leeg. 304 00:25:04,420 --> 00:25:07,710 So ons moet basies 'n nuwe bitmap van nuuts af skep. 305 00:25:07,710 --> 00:25:12,280 Wat ons doen is ons het om seker te maak dat ons in die lêer header kopieer 306 00:25:12,280 --> 00:25:16,850 en die info bladsyboskrif ('header') net soos die infile. 307 00:25:16,850 --> 00:25:22,850 Wat ons doen is ons skryf - en onthou dat bf is die veranderlike 308 00:25:22,850 --> 00:25:29,300 van die tipe BITMAPFILEHEADER, so wat ons doen is ons net gebruik om die inhoud 309 00:25:29,300 --> 00:25:34,980 om te skryf in die outfile. 310 00:25:36,550 --> 00:25:38,510 Hier, onthou ons het gepraat oor padding, 311 00:25:38,510 --> 00:25:47,820 hoe dit is belangrik om seker te maak dat die bedrag van pixels wat ons het is 'n veelvoud van 4. 312 00:25:47,820 --> 00:25:52,790 Dit is 'n redelik bruikbare formule om te bereken hoeveel padding jy 313 00:25:52,790 --> 00:25:57,670 gegewe die breedte van jou lêer. 314 00:25:57,670 --> 00:26:04,120 Ek wil julle ouens om te onthou dat in copy.c ons het 'n formule vir die berekening van die padding. 315 00:26:04,120 --> 00:26:07,970 Okay? Sodat almal onthou dat. Groot. 316 00:26:07,970 --> 00:26:14,050 So dan wat copy.c doen volgende is dit iterate oor al die horisontale skandeerlyne. 317 00:26:14,050 --> 00:26:23,730 Dit gaan eers deur die rye en dan slaan elke triple wat dit lees 318 00:26:23,730 --> 00:26:26,920 en skryf dit dan in die outfile. 319 00:26:26,920 --> 00:26:33,120 So, hier is ons die lees van slegs een RGB triple op 'n tyd 320 00:26:33,120 --> 00:26:39,860 en dan om dieselfde triple na die outfile. 321 00:26:41,120 --> 00:26:48,340 Die moeilike deel is dat die padding nie is 'n RGB triple, 322 00:26:48,340 --> 00:26:55,200 en daarom kan ons nie net gelees dat padding bedrag van RGB triples. 323 00:26:55,200 --> 00:27:01,460 Wat ons moet doen is eintlik net ons lêer posisie aanwyser beweeg, beweeg ons wyser, 324 00:27:01,460 --> 00:27:06,840 soort slaan oor al die padding sodat ons by die volgende ry. 325 00:27:06,840 --> 00:27:12,990 En is dan wat dit doen afskrif wys jou hoe jy wil dalk die padding te voeg. 326 00:27:12,990 --> 00:27:14,990 Dus het ons bereken hoeveel padding wat ons nodig het, 327 00:27:14,990 --> 00:27:18,220 so dit beteken dat ons moet padding aantal van 0e. 328 00:27:18,220 --> 00:27:24,510 Wat dit beteken is 'n lus wat sit padding aantal 0'e in ons outfile. 329 00:27:24,510 --> 00:27:31,170 En dan uiteindelik, jy sluit beide lêers. Jy sluit die infile sowel as die outfile. 330 00:27:31,170 --> 00:27:34,870 >> So dit is hoe copy.c werke, 331 00:27:34,870 --> 00:27:37,430 en dit gaan baie handig wees. 332 00:27:39,720 --> 00:27:43,750 In plaas van net eintlik direk kopieer en plak dit 333 00:27:43,750 --> 00:27:46,800 of net op soek na dit en tik in wat jy wil, 334 00:27:46,800 --> 00:27:49,440 jy dalk net wil om hierdie opdrag uit te voer in die terminale, 335 00:27:49,440 --> 00:27:54,520 cp copy.c whodunit.c, wat sal 'n nuwe lêer te skep, whodunit.c, 336 00:27:54,520 --> 00:27:58,330 wat bevat presies dieselfde inhoud as die kopie nie. 337 00:27:58,330 --> 00:28:03,880 So dan wat ons kan doen is die gebruik dat as 'n raamwerk om op te bou en te wysig 338 00:28:03,880 --> 00:28:06,900 vir ons detective verhaal lêer. 339 00:28:08,500 --> 00:28:14,670 >> Dit is ons tot-dos te doen vir detective verhaal, maar wat copy.c doen 340 00:28:14,670 --> 00:28:16,730 is eintlik neem sorg van die meeste van hulle vir ons. 341 00:28:16,730 --> 00:28:21,900 So al wat ons nodig het om volgende te doen, is die pixels verander as dit nodig is 342 00:28:21,900 --> 00:28:25,920 om werklik te maak die lêer leesbaar. 343 00:28:25,920 --> 00:28:32,960 Onthou dat vir 'n gegewe pixel triple, so vir 'n gegewe veranderlike van tipe RGBTRIPLE, 344 00:28:32,960 --> 00:28:35,990 kan jy toegang tot die blou, groen, rooi en waardes. 345 00:28:35,990 --> 00:28:38,670 Wat gaan handig te pas kom, want as jy hulle kan toegang tot, 346 00:28:38,670 --> 00:28:41,770 wat beteken dat jy kan ook check hulle, 347 00:28:41,770 --> 00:28:45,430 en dit beteken dat jy kan ook verander hulle. 348 00:28:45,430 --> 00:28:49,430 >> So wanneer ons gaan terug na ons rooi vergrootglas voorbeeld, 349 00:28:49,430 --> 00:28:53,390 basies, is wat optree as 'n soort van filter vir ons. 350 00:28:53,390 --> 00:28:58,160 So, wat ons wil doen, is wat ons wil al van die drietalle wat inkom te filter 351 00:28:58,160 --> 00:29:01,240 Daar is verskillende maniere om dit te doen. 352 00:29:01,240 --> 00:29:07,100 Basies, kan jy watter tipe filter wat jy wil. 353 00:29:07,100 --> 00:29:09,890 Miskien wil jy al die rooi pixels te verander 354 00:29:09,890 --> 00:29:13,570 of dalk wil jy 'n ander kleur pixel te verander na 'n ander kleur. 355 00:29:13,570 --> 00:29:15,400 Dit is aan jou. 356 00:29:15,400 --> 00:29:19,580 Onthou dat jy kan sien watter kleur die pixel is 357 00:29:19,580 --> 00:29:23,000 en dan kan jy ook verander dit as jy gaan deur. 358 00:29:24,410 --> 00:29:26,420 >> Okay. So dit is detective verhaal. 359 00:29:26,420 --> 00:29:32,760 Sodra jy hardloop detective verhaal, sal jy weet wie die skuldige van die misdaad was. 360 00:29:32,760 --> 00:29:35,540 >> Nou het ons gaan om te gaan om grootte aan te pas. 361 00:29:35,540 --> 00:29:37,990 Ons gaan om nog te doen het met bitmaps. 362 00:29:37,990 --> 00:29:40,750 Wat ons gaan doen, ons gaan 'n inset bitmap te hê 363 00:29:40,750 --> 00:29:45,890 en dan gaan ons in 'n getal en dan kry 'n outfile bitmap 364 00:29:45,890 --> 00:29:51,380 waar dit is basies ons infile afgeskaal deur n. 365 00:29:54,670 --> 00:30:01,450 Sê my lêer is net 'n pixel groot. 366 00:30:01,450 --> 00:30:09,100 En as my n 3, skalering deur 3, dan sou ek dat pixel n aantal kere herhaal, 367 00:30:09,100 --> 00:30:14,410 so 3 keer, en dan ook skaal dit af 3 keer so goed. 368 00:30:14,410 --> 00:30:17,840 So jy sien ek dit is skalering vertikaal sowel as horisontaal. 369 00:30:17,840 --> 00:30:19,680 >> En dan is hier is 'n voorbeeld. 370 00:30:19,680 --> 00:30:27,590 As jy 'n = 2, sien jy dat die eerste blou pixel is daar twee keer herhaal 371 00:30:27,590 --> 00:30:30,930 horisontaal sowel as twee keer vertikaal. 372 00:30:30,930 --> 00:30:38,040 En dan is dit nog steeds op, en sodat jy het 'n direkte skalering van jou oorspronklike beeld deur twee. 373 00:30:40,920 --> 00:30:47,600 >> Daarom dan, as ons aan detail die pseudokode vir hierdie, ons wil om die lêer oop te maak. 374 00:30:47,600 --> 00:30:49,880 En dan weet dat as ons terug gaan hier, 375 00:30:49,880 --> 00:30:54,540 sien ons dat die breedte vir die outfile gaan om anders te wees as die wydte van die infile. 376 00:30:54,540 --> 00:30:56,130 Wat beteken dit? 377 00:30:56,130 --> 00:31:01,230 Dit beteken dat ons header information gaan verander. 378 00:31:01,230 --> 00:31:03,790 En wat ons sal wil doen is werk die header info, 379 00:31:03,790 --> 00:31:11,820 weet dat wanneer ons lees in die lêers as jy op die copy.c raamwerk, 380 00:31:11,820 --> 00:31:17,570 ons het reeds 'n veranderlike wat aandui wat die grootte is en dinge soos dat. 381 00:31:17,570 --> 00:31:24,060 So wanneer jy dit gedoen het, wat jy dalk wil om dit te doen is om daardie spesifieke veranderlikes te verander. 382 00:31:24,060 --> 00:31:29,380 Onthou, as jy het 'n struct, hoe jy toegang tot die veranderlikes binne daardie. 383 00:31:29,380 --> 00:31:32,080 Jy gebruik die dot-operateur, reg? 384 00:31:32,080 --> 00:31:36,420 So dan met behulp van dat, jy weet wat jy nodig het om te verander die header info. 385 00:31:36,480 --> 00:31:41,030 So hier is net 'n lys van die werklike elemente wat gaan verander in jou lêer. 386 00:31:41,030 --> 00:31:45,180 Die lêer grootte gaan word verander, die beeld, sowel as die breedte en die hoogte. 387 00:31:45,180 --> 00:31:50,080 So dan terug te gaan na die kaart van die bitmaps, 388 00:31:50,080 --> 00:31:57,730 kyk of dit is die lêer kop-of die info header wat die inligting bevat 389 00:31:57,730 --> 00:32:00,920 en dan verander soos nodig. 390 00:32:05,010 --> 00:32:12,470 Weereens, sê cp copy.c resize.c. 391 00:32:12,470 --> 00:32:19,270 Dit beteken dat resize.c bevat alles wat binne afskrif 392 00:32:19,270 --> 00:32:24,490 omdat afskrif bied ons 'n manier van lees in elke scanline pixel pixel. 393 00:32:24,490 --> 00:32:29,860 Behalwe nou, in plaas van net die verandering van die waardes soos ons gedoen het in detective verhaal, 394 00:32:29,860 --> 00:32:37,980 wat ons wil doen, is wat ons wil om te skryf in verskeie pixels 395 00:32:37,980 --> 00:32:43,580 so lank as wat ons n groter as 1 is. 396 00:32:43,580 --> 00:32:47,110 >> Dan wat ons wil doen, is wat ons wil om dit te horisontaal strek deur n, 397 00:32:47,110 --> 00:32:50,490 sowel as dit vertikaal deur n rek. 398 00:32:50,490 --> 00:32:52,710 Hoe kan ons dit doen? 399 00:32:52,710 --> 00:32:56,890 Sê jou n 2 is, en jy het dit gegee infile. 400 00:32:56,890 --> 00:32:58,730 Jou cursor is gaan om te begin op die eerste een, 401 00:32:58,730 --> 00:33:03,530 en wat jy wil om dit te doen as n 2, wil jy te druk in 2 van daardie. 402 00:33:03,530 --> 00:33:05,490 So jy druk in 2 van daardie. 403 00:33:05,490 --> 00:33:10,830 Dan jou muis gaan om te skuif na die volgende pixel, wat is die rooi een, 404 00:33:10,830 --> 00:33:18,400 en dit gaan uit te druk 2 van daardie rooies, aanbring dit op wat dit voorheen gedoen. 405 00:33:18,400 --> 00:33:26,280 Toe het die wyser beweeg na die volgende pixel en trek in 2 van daardie. 406 00:33:26,280 --> 00:33:37,180 As jy kyk terug na die copy.c raamwerk, wat dit doen reg hier 407 00:33:37,180 --> 00:33:42,830 dit skep 'n nuwe geval van 'n RGB triple, 'n nuwe veranderlike genoem triple. 408 00:33:42,830 --> 00:33:50,500 En hier wanneer dit daarin lees, is dit van die infile 1 RGBTRIPLE lees 409 00:33:50,500 --> 00:33:53,470 en stoor dit binnekant van daardie triple veranderlike. 410 00:33:53,470 --> 00:33:57,590 So dan is jy eintlik 'n veranderlike wat daardie spesifieke pixel. 411 00:33:57,590 --> 00:34:05,290 Dan wanneer jy skryf, wat jy dalk wil om dit te doen, is omsluiten die fwrite verklaring in 'n for-lus 412 00:34:05,290 --> 00:34:11,080 wat skryf dit in jou outfile soveel keer as wat nodig is. 413 00:34:17,449 --> 00:34:20,100 Dit is eenvoudig genoeg. 414 00:34:20,200 --> 00:34:27,590 Net basies die skryfproses n aantal kere wat dit horisontaal skaal herhaal. 415 00:34:27,590 --> 00:34:32,969 >> Maar dan moet ons onthou dat ons padding gaan verander. 416 00:34:47,350 --> 00:34:53,020 Voorheen, sê ons het iets van lengte 3. 417 00:34:53,020 --> 00:35:00,130 Dan sou ons voeg net in hoeveel padding? Nog net een te maak dit 'n veelvoud van 4. 418 00:35:00,130 --> 00:35:10,480 Sê dit maar met ons hierdie besondere beeld skalering deur n = 2. 419 00:35:10,480 --> 00:35:16,300 So, hoe baie blou pixels sal ons aan die einde? Ons wil hê 6. 420 00:35:16,300 --> 00:35:21,470 1, 2, 3, 4, 5, 6. Alles reg. 421 00:35:21,470 --> 00:35:26,580 6 is nie 'n veelvoud van 4. Wat is die naaste veelvoud van 4? Wat gaan wees 8. 422 00:35:26,580 --> 00:35:33,200 So ons is eintlik 2 karakters van padding daar te hê. 423 00:35:33,200 --> 00:35:38,720 >> Nie almal onthou as ons 'n formule te bereken padding 424 00:35:38,720 --> 00:35:41,350 en waar dit kan wees? 425 00:35:41,350 --> 00:35:45,160 [Onhoorbaar student reaksie] >> Ja, copy.c. Reg. 426 00:35:45,160 --> 00:35:49,800 Daar is 'n formule in copy.c om te bereken hoeveel padding jy 427 00:35:49,800 --> 00:35:53,810 gegewe 'n spesifieke breedte van die bitmapafbeelding. 428 00:35:53,810 --> 00:36:02,950 So is daar dan wat gaan nuttig wees wanneer jy dit nodig om by te voeg in 'n sekere bedrag van die padding 429 00:36:02,950 --> 00:36:06,160 om werklik uit te vind hoe veel tyd wat jy nodig het om by te voeg. 430 00:36:10,820 --> 00:36:15,850 Maar een noot, al is, is dat jy wil om seker te maak dat jy die regte grootte gebruik. 431 00:36:15,850 --> 00:36:21,410 Net versigtig wees want jy basies gaan word wat met twee bitmap beelde. 432 00:36:21,410 --> 00:36:23,410 Jy wil om seker te maak dat jy die regte een gebruik. 433 00:36:23,410 --> 00:36:26,820 Wanneer jy die padding is bereken vir die outfile, jy wil die breedte van die outfile te gebruik 434 00:36:26,820 --> 00:36:29,860 en die breedte van die vorige een nie. 435 00:36:29,860 --> 00:36:37,240 >> Groot. Daardie soort van sorg van die strekking van 'n hele bitmap image horisontaal. 436 00:36:37,240 --> 00:36:41,290 Maar wat ons wil doen, is dit eintlik strek vertikaal sowel. 437 00:36:41,290 --> 00:36:48,760 Dit gaan 'n bietjie moeiliker te wees want as ons klaar is die kopiëring van 'n ry 438 00:36:48,760 --> 00:36:51,580 en die skryf van die ry, word ons wyser aan die einde gaan wees. 439 00:36:51,580 --> 00:36:56,210 So as ons lees weer, dan is dit net gaan om na die volgende lyn te lees. 440 00:36:56,210 --> 00:37:03,660 So, wat ons wil doen, is soort van 'n paar van die kopiëring van die rye weer 441 00:37:03,660 --> 00:37:12,500 of net soort van die neem van die ry en dan herskryf dit weer. 442 00:37:14,380 --> 00:37:17,940 As ek soort van verwys na, daar is verskillende maniere om dit te doen. 443 00:37:17,940 --> 00:37:23,040 Wat jy kan doen is as jy gaan deur en lees deur die betrokke scanline 444 00:37:23,040 --> 00:37:28,560 en om dit te verander as wat nodig is, dan soort van winkel al van daardie pixels in 'n skikking. 445 00:37:28,560 --> 00:37:36,350 Dan later op jou weet wat jy nodig het om uit te druk dat die skikking weer, 446 00:37:36,350 --> 00:37:39,830 en so kan jy net gebruik dat array om dit te doen. 447 00:37:39,830 --> 00:37:44,500 Nog 'n manier om dit te doen wat jy kan kopieer een ry, 448 00:37:44,500 --> 00:37:47,950 verstaan ​​wat jy nodig het om dit weer te kopieer, so eintlik beweeg jou muis, 449 00:37:47,950 --> 00:37:50,950 en wat gaan word met behulp van die metode fseek. 450 00:37:50,950 --> 00:37:56,410 Jy kan jou muis beweeg al die pad terug en dan die kopieer proses weer herhaal. 451 00:37:56,410 --> 00:38:03,960 >> So as ons skalering nommer is n, dan hoeveel keer sal ons om terug te gaan 452 00:38:03,960 --> 00:38:10,500 en herskryf 'n lyn? >> [Student] n - 1. >> Ja, volmaak. n - 1. 453 00:38:10,500 --> 00:38:14,390 Ons het dit een keer al gedoen, so dan sal ons wil gaan terug proses te herhaal 454 00:38:14,390 --> 00:38:17,460 n - 1 bedrag van die tye. 455 00:38:22,730 --> 00:38:25,860 Okay. So daar het jy jou resize funksie. 456 00:38:25,860 --> 00:38:34,360 >> Nou kan ons kry om 'n baie pret deel, my gunsteling pset, wat Herstel. 457 00:38:34,360 --> 00:38:39,580 In plaas van bitmaps, hierdie keer het ons te doen met JPEG. 458 00:38:39,580 --> 00:38:43,370 Ons is eintlik nie 'n lêer net van JPEG, 459 00:38:43,370 --> 00:38:46,600 ons is basies 'n rou formaat geheugenkaart. 460 00:38:46,600 --> 00:38:51,790 En so gaan dit bevat 'n bietjie van die info en vullis waardes in die begin, 461 00:38:51,790 --> 00:38:57,240 en dan is dit begin en dit het 'n klomp van JPEG-lêers. 462 00:38:57,240 --> 00:39:03,430 Egter, is ons oorhandig 'n kaart waar ons die foto's verwyder; 463 00:39:03,430 --> 00:39:08,300 in wese, het ons vergeet waar die foto's is geleë binne die kaart. 464 00:39:08,300 --> 00:39:12,770 So dan is ons taak in Herstel is om te gaan deur middel van hierdie kaart formaat 465 00:39:12,770 --> 00:39:16,500 en vind die foto's weer. 466 00:39:16,500 --> 00:39:23,990 >> Gelukkig, die struktuur van JPEG-lêers en die kaart lêer is 'n bietjie nuttig. 467 00:39:23,990 --> 00:39:28,850 Dit kan beslis 'n bietjie moeiliker gewees het as dit nie in hierdie spesifieke formaat. 468 00:39:28,850 --> 00:39:40,160 Elke JPEG-lêer begin eintlik met twee moontlike rye, hierbo gelys. 469 00:39:40,160 --> 00:39:42,970 Basies, wanneer jy 'n nuwe JPEG-lêer, 470 00:39:42,970 --> 00:39:52,720 dit begin met die volgorde ffd8 ffe0 of die ander een, ffd8 ffe1. 471 00:39:52,720 --> 00:39:59,530 Nog 'n nuttige ding om te weet is dat JPEG contiguously gestoor. 472 00:39:59,530 --> 00:40:03,380 So wanneer een JPEG lêer eindig, die ander een begin. 473 00:40:03,380 --> 00:40:07,070 So daar is nie enige soort van in-tussen waardes daar. 474 00:40:07,070 --> 00:40:15,510 Sodra jy druk op die begin van 'n JPEG, as jy reeds die lees van 'n JPEG, 475 00:40:15,510 --> 00:40:21,800 jy weet dat jy die einde van die vorige een en die begin van die volgende een het getref. 476 00:40:21,800 --> 00:40:25,890 >> Soort van visualiseer dit, ek het 'n skematiese voorstelling. 477 00:40:25,890 --> 00:40:36,910 Nog 'n ding oor JPEG is dat ons hulle in rye van 512 bytes kan lees op 'n tyd, 478 00:40:36,910 --> 00:40:39,380 insgelyks met die begin van die kaart. 479 00:40:39,380 --> 00:40:43,370 Ons hoef nie te wees die kontrolering van elke enkele byte want dit sou suig. 480 00:40:43,370 --> 00:40:48,200 So in plaas, wat ons kan doen is eintlik net lees in 512 grepe op 'n slag 481 00:40:48,200 --> 00:40:54,700 en dan, in plaas van kontrole tussen diegene in daardie klein snye, 482 00:40:54,700 --> 00:40:58,640 ons kan net so die begin van die 512 bytes. 483 00:40:58,640 --> 00:41:02,570 Wese, in hierdie prent, wat jy sien is in die begin van die kaart, 484 00:41:02,570 --> 00:41:08,700 jy het waardes wat nie regtig relevant is vir die werklike JPEG self. 485 00:41:08,700 --> 00:41:15,830 Maar wat ek het, is 'n ster aan te dui een van die twee begin reekse vir 'n JPEG. 486 00:41:15,830 --> 00:41:19,910 So wanneer jy 'n ster sien, weet jy dat jy 'n JPEG-lêer. 487 00:41:19,910 --> 00:41:25,030 En dan elke JPEG-lêer gaan tot 'n veelvoud van 512 bytes 488 00:41:25,030 --> 00:41:27,880 maar nie noodwendig dieselfde veelvoud. 489 00:41:27,880 --> 00:41:32,050 Die manier waarop jy weet dat jy 'n ander JPEG het getref is as jy teen 'n ander ster, 490 00:41:32,050 --> 00:41:39,090 n ander volgorde grepe. 491 00:41:39,090 --> 00:41:43,330 Dan wat jy hier is dat jy die rooi JPEG-lêer voortgaan totdat jy 'n ster getref het, 492 00:41:43,330 --> 00:41:45,150 wat aangedui word deur 'n nuwe kleur. 493 00:41:45,150 --> 00:41:48,510 Jy voortgaan en dan kan jy die ander ster getref, jy getref 'n ander JPEG, 494 00:41:48,510 --> 00:41:50,590 jy nog steeds al die pad tot die einde toe. 495 00:41:50,590 --> 00:41:53,180 Jy op die laaste prentjie hier, die pienk een. 496 00:41:53,180 --> 00:41:58,220 Jy gaan tot die einde toe totdat jy getref die einde van die lêer karakter. 497 00:41:58,220 --> 00:42:00,820 Dit gaan werklik nuttig te wees. 498 00:42:00,820 --> 00:42:03,170 >> 'N Paar wegneemetes hier: 499 00:42:03,170 --> 00:42:06,670 Die kaart lêer nie begin met 'n JPEG, 500 00:42:06,670 --> 00:42:13,350 maar sodra 'n JPEG begin, is almal van die JPEG gestoor langs mekaar. 501 00:42:17,520 --> 00:42:20,420 >> Sommige pseudokode vir die Herstel. 502 00:42:20,420 --> 00:42:22,570 Eerste, gaan ons ons kaart lêer oop te maak, 503 00:42:22,570 --> 00:42:27,500 en wat gaan word deur gebruik te maak van ons lêer I / O-funksies. 504 00:42:27,500 --> 00:42:32,430 Ons gaan die volgende proses te herhaal totdat ons het aan die einde van die lêer. 505 00:42:32,430 --> 00:42:36,450 Ons gaan 512 grepe op 'n slag te lees. 506 00:42:36,450 --> 00:42:39,180 En wat ek hier gesê het, is ons gaan dit in 'n buffer te stoor, 507 00:42:39,180 --> 00:42:46,230 so basies hou op die 512 bytes totdat ons presies weet wat om te doen met hulle. 508 00:42:46,230 --> 00:42:50,300 Dan wat ons wil doen, is wat ons wil om te kyk of ons 'n ster of nie getref het. 509 00:42:50,300 --> 00:42:57,960 As ons 'n ster getref het, as ons het een van die beginspan rye getref, 510 00:42:57,960 --> 00:42:59,980 dan weet ons dat ons 'n nuwe JPEG-lêer het getref. 511 00:42:59,980 --> 00:43:08,860 Wat sal ons wil doen, is ons gaan om te wil 'n nuwe lêer te skep in ons pset4 directory 512 00:43:08,860 --> 00:43:14,480 om voort te gaan om daardie lêer. 513 00:43:14,480 --> 00:43:18,220 Maar ook as ons het reeds 'n JPEG voor, 514 00:43:18,220 --> 00:43:25,620 dan wil ons dat die lêer te beëindig en dit stoot aan die pset4 gids, 515 00:43:25,620 --> 00:43:29,780 waar ons sal hê om die lêer gestoor, want as ons spesifiseer nie dat ons wat JPEG-lêer het geëindig, 516 00:43:29,780 --> 00:43:37,290 dan sal ons basies 'n onbepaalde bedrag. Die JPEG sal nooit 'n einde. 517 00:43:37,290 --> 00:43:40,840 Sodat ons wil hê om seker te maak dat wanneer ons na 'n JPEG-lêer te lees en skryf dat, 518 00:43:40,840 --> 00:43:46,590 ons wil om spesifiek te sluit ten einde die volgende een oop te maak. 519 00:43:46,590 --> 00:43:48,430 Ons sal wil hê om seker te maak van verskeie dinge. 520 00:43:48,430 --> 00:43:52,880 Ons wil om te kyk of ons aan die begin van 'n nuwe JPEG met ons buffer 521 00:43:52,880 --> 00:43:56,780 en ook as ons reeds gevind het 'n JPEG voor 522 00:43:56,780 --> 00:44:03,930 want dit sal vir jou 'n proses effens verander. 523 00:44:03,930 --> 00:44:07,880 So dan nadat jy gaan deur al die pad en jy druk op die einde van die lêer, 524 00:44:07,880 --> 00:44:11,570 dan wat jy sal wil hê om dit te doen, is wat jy sal wil hê dat al die lêers wat tans oop te sluit. 525 00:44:11,570 --> 00:44:14,100 Dit sal waarskynlik die laaste JPEG-lêer wat jy het, 526 00:44:14,100 --> 00:44:18,930 sowel as die kaart lêer wat jy is besig met. 527 00:44:21,940 --> 00:44:28,670 >> Die laaste struikelblok wat ons nodig het om aan te pak, is hoe om werklik 'n JPEG-lêer 528 00:44:28,670 --> 00:44:31,950 en hoe om werklik te stoot dit na die gids. 529 00:44:33,650 --> 00:44:39,850 Die pset vereis dat elke JPEG wat jy vind in die volgende formaat wees, 530 00:44:39,850 --> 00:44:43,990 waar jy die nommer. jpg. 531 00:44:43,990 --> 00:44:50,750 Die getal, selfs al is dit 0, noem ons dit 000.jpg. 532 00:44:50,750 --> 00:44:55,730 Wanneer jy 'n JPEG in jou program, 533 00:44:55,730 --> 00:44:58,040 jy gaan om te wil om dit te noem in die volgorde waarin dit gevind. 534 00:44:58,040 --> 00:44:59,700 Wat beteken dit? 535 00:44:59,700 --> 00:45:03,530 Ons moet soort hou van hoeveel ons het gevind 536 00:45:03,530 --> 00:45:08,680 en wat die getal van elke JPEG behoort te wees. 537 00:45:08,680 --> 00:45:13,800 Hier het ons gaan om voordeel te trek van die funksie sprintf. 538 00:45:13,800 --> 00:45:17,480 Soortgelyk aan printf, wat net soort van afdrukke 'n waarde in die terminale, 539 00:45:17,480 --> 00:45:23,910 sprintf druk die lêer in die gids. 540 00:45:23,910 --> 00:45:30,870 En wat dit sou doen as ek het sprintf, titel, en dan die tou daar, 541 00:45:30,870 --> 00:45:36,660 dit sou druk 2.jpg. 542 00:45:36,660 --> 00:45:41,020 Die veronderstelling dat ek my lêers korrek gesluit het, 543 00:45:41,020 --> 00:45:47,210 wat sou bevat die lêer wat ek het uitskryf. 544 00:45:47,210 --> 00:45:50,320 Maar een ding is dat die kode wat ek hier 545 00:45:50,320 --> 00:45:53,360 nie heeltemal voldoen aan wat die pset vereis. 546 00:45:53,360 --> 00:46:02,410 Die pset vereis dat die tweede JPEG-lêer in plaas van net 2 002 moet genoem word. 547 00:46:02,410 --> 00:46:09,160 So wanneer jy die naam uit te druk, dan miskien is jy dalk wil die plaatsaanduiding effens verander. 548 00:46:09,160 --> 00:46:18,140 >> Nie almal onthou hoe ons voorsiening te maak vir 'n ekstra spasies wanneer ons iets druk? 549 00:46:18,140 --> 00:46:22,530 Ja. >> [Student] Jy het 'n 3 tussen die procent teken en die 2. >> Ja, volmaak. 550 00:46:22,530 --> 00:46:25,610 Jy sit 'n 3 in hierdie geval, want ons wil ruimte vir 3. 551 00:46:25,610 --> 00:46:32,590 % 3d sal waarskynlik gee jou 002.jpg in plaas van 2. 552 00:46:32,590 --> 00:46:40,120 Die eerste argument in die sprintf funksie is eintlik 'n char verskeidenheid, 553 00:46:40,120 --> 00:46:42,520 wat ons voorheen geweet het as stringe. 554 00:46:42,520 --> 00:46:50,700 Diegene wil, soort van meer soos 'n tydelike berging, net die stoor van die resulterende string. 555 00:46:50,700 --> 00:46:54,950 Jy sal regtig nie om met hierdie, maar wat jy nodig het om dit in te sluit. 556 00:46:54,950 --> 00:47:00,710 >> Die wete dat elke lêernaam het die getal, wat neem drie karakters, 557 00:47:00,710 --> 00:47:06,770 en dan jpg, hoe lank moet hierdie verskeidenheid? 558 00:47:09,070 --> 00:47:14,310 Gooi uit 'n aantal. Hoeveel karakters in die titel, in die naam? 559 00:47:18,090 --> 00:47:26,320 So daar is 3 hashtags, tydperk, jpg. >> [Student] 7. >> 7. Nie heeltemal nie. 560 00:47:26,320 --> 00:47:32,000 Ons gaan 8 te wil, want ons wil om voorsiening te maak vir die null-terminator as goed. 561 00:47:45,340 --> 00:47:49,730 >> Ten slotte, om net te trek uit die proses wat jy sal moet doen vir Herstel, 562 00:47:49,730 --> 00:47:55,420 jy het 'n paar begin inligting. 563 00:47:55,420 --> 00:48:02,460 Jy voortgaan totdat jy die begin van 'n JPEG-lêer, 564 00:48:02,460 --> 00:48:07,900 en dit kan een van twee begin rye. 565 00:48:07,900 --> 00:48:12,510 Jy hou op lees. Elke streep hier verteenwoordig 512 bytes. 566 00:48:12,510 --> 00:48:22,630 Jy hou aan lees, hou op lees totdat jy teëkom 'n ander begin ry. 567 00:48:22,630 --> 00:48:29,790 Sodra jy dat jy die einde van die huidige JPEG - in hierdie geval, dit is die rooi een, 568 00:48:29,790 --> 00:48:31,030 so jy wil dat aan die einde. 569 00:48:31,030 --> 00:48:35,540 Jy wil sprintf die naam van daardie in jou pset4-lêergids, 570 00:48:35,540 --> 00:48:41,580 dan is jy 'n nuwe JPEG oop te maak en dan hou op die lees van 571 00:48:41,580 --> 00:48:46,370 totdat jy die volgende teëkom. 572 00:48:46,370 --> 00:48:49,040 Hou op lees, hou op lees, 573 00:48:49,040 --> 00:48:56,290 en dan uiteindelik, uiteindelik, jy gaan die einde van die lêer te bereik, 574 00:48:56,290 --> 00:49:00,360 en so sal jy wil die laaste JPEG te sluit dat jy die werk met, 575 00:49:00,360 --> 00:49:08,380 sprintf dat in jou pset4-lêergids, en dan kyk na al die foto's wat jy gekry het. 576 00:49:08,380 --> 00:49:12,050 Hierdie foto's is eintlik foto's van CS50 personeel, 577 00:49:12,050 --> 00:49:16,430 en so is dit waar die bonus pret deel van die pset kom in 578 00:49:16,430 --> 00:49:26,310 is dat jy in jou afdelings meeding die TFS in die foto's te vind 579 00:49:26,310 --> 00:49:34,610 en neem foto's saam met hulle om te bewys dat jy die pset gedoen het 580 00:49:34,610 --> 00:49:37,030 en sodat jy kan sien watter personeellede in die foto's. 581 00:49:37,030 --> 00:49:41,510 So dan kan jy foto's neem met die personeel. Soms moet jy om hulle af te jaag. 582 00:49:41,510 --> 00:49:44,680 Waarskynlik 'n paar van hulle probeer om te hardloop weg van jou af. 583 00:49:44,680 --> 00:49:47,320 Jy neem foto's saam met hulle. 584 00:49:47,320 --> 00:49:51,190 Dit is aan die gang. Dit is nie te wyte wanneer die pset is. 585 00:49:51,190 --> 00:49:53,340 Die sperdatum sal aangekondig word in die spec. 586 00:49:53,340 --> 00:49:58,060 Dan saam met jou artikel, wat ookal artikel neem die meeste foto's 587 00:49:58,060 --> 00:50:04,430 met die meeste personeellede sal wen 'n pretty awesome prys. 588 00:50:04,430 --> 00:50:08,890 Dit is soort aansporing te kry jou pset4 klaar so gou as moontlik 589 00:50:08,890 --> 00:50:10,820 want dan kan jy vir sake 590 00:50:10,820 --> 00:50:14,570 jag af al die verskillende CS50 personeellede. 591 00:50:14,570 --> 00:50:17,500 Dit is nie verpligtend nie, maar, so wanneer jy kry die foto's, 592 00:50:17,500 --> 00:50:20,310 dan is jy klaar met pset4. 593 00:50:20,310 --> 00:50:23,970 >> En ek is klaar met Walk Through 4, so dankie vir almal se koms. 594 00:50:23,970 --> 00:50:29,330 Sterkte met Forensics. [Applous] 595 00:50:29,330 --> 00:50:31,000 [CS50.TV]