1 00:00:00,000 --> 00:00:09,500 >> [Muusika mängib] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA chan oli Miss Scarlett koos küünlajalg. 3 00:00:12,350 --> 00:00:13,560 Dekkari? 4 00:00:13,560 --> 00:00:15,030 Noh, me saame teada. 5 00:00:15,030 --> 00:00:20,870 In lauamäng Clue, võite antakse füüsilise punane pilt. 6 00:00:20,870 --> 00:00:24,120 Ja see pilt on väga punane ja täpiline, ja teie töö on 7 00:00:24,120 --> 00:00:25,490 paljastada peidetud sõnum. 8 00:00:25,490 --> 00:00:29,740 Ja tavaliselt sa ette punase luup või punane ekraanil 9 00:00:29,740 --> 00:00:31,410 selgub, et peidetud sõnum. 10 00:00:31,410 --> 00:00:33,340 Noh, me jäljendada. 11 00:00:33,340 --> 00:00:37,960 >> In Dekkari, sa oled andnud Rasterpildi , mis näeb välja väga täpiline ja punane, 12 00:00:37,960 --> 00:00:43,430 ning seejärel käivitage Dekkari programm paljastada peidetud sõnum. 13 00:00:43,430 --> 00:00:45,650 >> Niisiis olgem murda sisse samme. 14 00:00:45,650 --> 00:00:50,390 Esiteks, mida soovite faili avada - aimugi, et olete saanud. 15 00:00:50,390 --> 00:00:53,880 Ja siis ka looma kohtuotsust bitmap faili. 16 00:00:53,880 --> 00:00:58,240 Siis soovite värskendada bitmap header infot kohtuotsust outfile. 17 00:00:58,240 --> 00:00:59,920 Veel selle hiljem. 18 00:00:59,920 --> 00:01:04,319 Ja siis sa lähed välja lugeda aimugi, scanline, pixel by pixel, 19 00:01:04,319 --> 00:01:07,320 muutes pikslite värvid korral ja kirjalikult 20 00:01:07,320 --> 00:01:08,960 need võetakse otsus - 21 00:01:08,960 --> 00:01:12,000 pikselhaaval sisse kohtuotsust scanline. 22 00:01:12,000 --> 00:01:13,780 >> Kuidas me hakka selle kohta? 23 00:01:13,780 --> 00:01:16,940 Noh, õnneks on meil copy.c jaotuse kood. 24 00:01:16,940 --> 00:01:21,240 Ja see läheb tõestama üsna kasulik meile. 25 00:01:21,240 --> 00:01:29,700 Copy.c avab faili, loeb see, et infile päises ja siis värskendab 26 00:01:29,700 --> 00:01:31,070 outfile päises. 27 00:01:31,070 --> 00:01:37,010 Ja siis ta loeb iga piksel scanline, pikselhaaval ja seejärel 28 00:01:37,010 --> 00:01:42,390 kirjutab, et piksel arvesse outfile. 29 00:01:42,390 --> 00:01:45,020 >> Seega on teie esimene samm võiks olema käivitada järgmine 30 00:01:45,020 --> 00:01:46,420 käsk terminalis - 31 00:01:46,420 --> 00:01:50,270 cp copy.c whodunit.c. 32 00:01:50,270 --> 00:01:55,320 See loob koopia copy.c nimega whodunit.c. 33 00:01:55,320 --> 00:01:58,320 Nii et meie esimene samm, et avada fail, noh, seal on täpne 34 00:01:58,320 --> 00:02:00,070 replica et copy.c. 35 00:02:00,070 --> 00:02:03,360 Nii et ma jätan teid seda vaatama. 36 00:02:03,360 --> 00:02:07,860 >> Mida me tegeleme sellega Erksa on Faili I / O, põhimõtteliselt võttes failid 37 00:02:07,860 --> 00:02:10,229 lugemine, kirjutamine, toimetamine neid. 38 00:02:10,229 --> 00:02:12,650 Kuidas sa esimese faili avamisel? 39 00:02:12,650 --> 00:02:16,800 Noh, sa lähed, et kuulutada fail pointer, ja siis helistada 40 00:02:16,800 --> 00:02:18,670 funktsioon fopen. 41 00:02:18,670 --> 00:02:23,150 Pass tee või nimi, mis faili ja seejärel režiim, mida soovite 42 00:02:23,150 --> 00:02:24,700 avada see fail sisse 43 00:02:24,700 --> 00:02:28,620 Sööte r avab foo.bmp lugemiseks. 44 00:02:28,620 --> 00:02:35,670 Arvestades fopen koos kulgeb w tahe avatud bar.bmp, kirjutamiseks faili ja 45 00:02:35,670 --> 00:02:37,020 tegelikult seda redigeerima. 46 00:02:37,020 --> 00:02:41,970 >> Nüüd, et oleme avanud faili, meie Järgmise sammuna tuleb ajakohastada kaudu info 47 00:02:41,970 --> 00:02:43,230 jaoks outfile. 48 00:02:43,230 --> 00:02:44,610 Mida header info? 49 00:02:44,610 --> 00:02:48,160 Noh, esiteks on meil vaja teada mida bitmap on. 50 00:02:48,160 --> 00:02:51,000 Bitmap on lihtsalt paigutus baiti. 51 00:02:51,000 --> 00:02:55,480 Ja nad deklareeritud seda pilti Siit bmp.h, hunnik 52 00:02:55,480 --> 00:02:58,610 teave selle kohta, mida bitmap tegelikult valmistatud. 53 00:02:58,610 --> 00:03:05,730 Aga mida me tõesti hoolivad bitmap faili päis, siin, ja 54 00:03:05,730 --> 00:03:08,460 bitmap info kaudu, on siin. 55 00:03:08,460 --> 00:03:13,170 Päis koosneb paar muutujaid, mis osutub väga kasulik. 56 00:03:13,170 --> 00:03:18,400 On biSizeImage, mis kogu pildi suurus baitides. 57 00:03:18,400 --> 00:03:20,890 Ja see hõlmab pikslit ja polster. 58 00:03:20,890 --> 00:03:24,210 Polster on väga tähtis, kuid me jõuame hiljem. 59 00:03:24,210 --> 00:03:30,000 >> BiWidth esindab laius image pikslites miinus polster. 60 00:03:30,000 --> 00:03:34,220 BiHeight on siis ka kõrguse pildi pikslites. 61 00:03:34,220 --> 00:03:38,240 Ja siis BITMAPFILEHEADER ja BITMAPINFOHEADER, nagu ma mainisin, 62 00:03:38,240 --> 00:03:40,900 varem, need on esindatud kui structs. 63 00:03:40,900 --> 00:03:45,410 Niisiis, sa ei pääse faili päis ise, kuid sa tahad saada 64 00:03:45,410 --> 00:03:47,370 need muutujad sees. 65 00:03:47,370 --> 00:03:48,170 >> OK. 66 00:03:48,170 --> 00:03:50,600 Niisiis, kuidas me värskendame header info? 67 00:03:50,600 --> 00:03:54,020 Noh, kõigepealt peame vaatama, kas me on vaja muuta mis tahes teavet 68 00:03:54,020 --> 00:03:58,480 infile, aimugi, et outfile, kohtuotsust. 69 00:03:58,480 --> 00:04:00,250 Kas midagi muutes sel juhul? 70 00:04:00,250 --> 00:04:04,320 Noh, tegelikult ei, sest me tuleb lihtsalt muutes värve. 71 00:04:04,320 --> 00:04:07,550 Me ei kavatse muutes faili suurus, pildi suurus, laius, 72 00:04:07,550 --> 00:04:08,310 või kõrgust. 73 00:04:08,310 --> 00:04:14,010 Nii et teil on kõik korras nüüd poolt lihtsalt kopeerides iga piksli. 74 00:04:14,010 --> 00:04:14,840 >> OK. 75 00:04:14,840 --> 00:04:20,720 Nüüd vaatame, kuidas me tegelikult võib lugeda iga piksli failist. 76 00:04:20,720 --> 00:04:23,640 Teine fail I / O funktsioon tulevad mängu - 77 00:04:23,640 --> 00:04:24,700 fread. 78 00:04:24,700 --> 00:04:28,440 See võtab kursor struct mis sisaldab bytes et 79 00:04:28,440 --> 00:04:30,110 sa loed. 80 00:04:30,110 --> 00:04:31,890 Nii et sa loed sinna. 81 00:04:31,890 --> 00:04:36,090 Ja siis liigu suurus, mis on suurus iga element, et sa 82 00:04:36,090 --> 00:04:37,360 soovite lugeda. 83 00:04:37,360 --> 00:04:40,640 Siin funktsiooni sizeof tulevad mugav. 84 00:04:40,640 --> 00:04:45,570 Siis liigu number, mis tähistab arvu elemente 85 00:04:45,570 --> 00:04:47,480 suurus lugeda. 86 00:04:47,480 --> 00:04:51,180 Ja siis lõpuks, inptr, mis on file pointer, et sa oled 87 00:04:51,180 --> 00:04:52,530 loen alates. 88 00:04:52,530 --> 00:04:58,650 Nii et kõik need elemendid on sees inptr ja nad ei kavatse andmed. 89 00:04:58,650 --> 00:05:01,660 >> Vaatame natuke näiteks. 90 00:05:01,660 --> 00:05:07,590 Kui ma tahan lugeda andmeteks kaks koera Noh, ma ei saa seda teha kahel viisil. 91 00:05:07,590 --> 00:05:15,250 Võin kas lugeda kaks objektide suurus koer minu inptr või võin lugeda 92 00:05:15,250 --> 00:05:19,280 ühes vastuväiteid suurus kaks koera. 93 00:05:19,280 --> 00:05:23,580 Nii et näete, et olenevalt sellest, kuidas et teil korraldada suurus ja arv, siis 94 00:05:23,580 --> 00:05:25,840 võib lugeda sama baitide arvu. 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> Nüüd, olgem muuta pixel värvi me vajame. 97 00:05:33,020 --> 00:05:37,320 Kui te vaatate bmp.h uuesti, näete, et allosas 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs on teine ​​struktuure, kus nad koosnevad kolmest baiti. 99 00:05:42,920 --> 00:05:49,220 Üks, rgbtBlue, rgbtGreen ja rgbtRed. 100 00:05:49,220 --> 00:05:52,480 Niisiis kõik need kujutab summa sinine, rohelise värvi, ja 101 00:05:52,480 --> 00:05:57,250 punaste sees pixel, kus iga summa on esindatud 102 00:05:57,250 --> 00:05:58,670 kuueteistkümnendsüsteemis number. 103 00:05:58,670 --> 00:06:04,370 >> Nii ff0000 on sinine värv, sest see läheb sinisest, 104 00:06:04,370 --> 00:06:05,850 roheliseks, punaseks. 105 00:06:05,850 --> 00:06:09,300 Ja siis kõik f on on valge. 106 00:06:09,300 --> 00:06:13,440 Võtame pilk smiley.bmp, mis on teie jaotuse kood. 107 00:06:13,440 --> 00:06:15,690 Kui avate selle lihtsalt pilt vaataja, siis saate 108 00:06:15,690 --> 00:06:17,080 lihtsalt näha punane smiley. 109 00:06:17,080 --> 00:06:20,380 Aga võttes sügavamale sukelduda, siis tulen näha, et struktuur 110 00:06:20,380 --> 00:06:22,340 see on lihtsalt pikslit. 111 00:06:22,340 --> 00:06:25,880 Meil on valge pikslit, ja siis punane pikslit. 112 00:06:25,880 --> 00:06:31,000 Valge, ffffff, ja siis on kõik punane pikslit Olen värvimata teile 113 00:06:31,000 --> 00:06:35,440 siin, ja te näete, et nad 0000FF. 114 00:06:35,440 --> 00:06:39,760 Zero sinine, null roheline ja täis punane. 115 00:06:39,760 --> 00:06:45,350 Ja kuna smiley on kaheksa pikslit lai, meil ei ole mingit polster. 116 00:06:45,350 --> 00:06:47,360 Hea küll. 117 00:06:47,360 --> 00:06:53,310 >> Niisiis, kui ma määrata erinevad väärtused et RGBTRIPLE ja ma tahtsin 118 00:06:53,310 --> 00:06:58,350 muuta see roheliseks, siis mida ma teeksin, on Ma kinnitan, RGBTRIPLE nimega 119 00:06:58,350 --> 00:07:02,660 triple ja seejärel näha iga bait selles struct I 120 00:07:02,660 --> 00:07:04,030 kasutab dot operaator. 121 00:07:04,030 --> 00:07:08,430 Nii triple.rgbtBlue, ma ei määrata, et kuni 0. 122 00:07:08,430 --> 00:07:13,460 Green Ma ei määrata selle täis - kõik number, tõesti, vahel 0 ja ff. 123 00:07:13,460 --> 00:07:15,470 Ja siis punane, ma ka ütlen 0. 124 00:07:15,470 --> 00:07:19,160 Niisiis, mis annab mulle roheline pixel. 125 00:07:19,160 --> 00:07:23,030 >> Järgmine, aga kui ma tahan, et kontrollida väärtus midagi? 126 00:07:23,030 --> 00:07:27,250 Ma võiks olla midagi, mis kontrollib kas triple on rgbtBlue väärtus on 127 00:07:27,250 --> 00:07:31,080 ff ja seejärel printida, "ma tunnen sinine! ", nagu tulemus. 128 00:07:31,080 --> 00:07:35,640 Nüüd, see ei tähenda tingimata, mis piksel on sinine, eks? 129 00:07:35,640 --> 00:07:40,060 Kuna piksli punase ja rohelise väärtused võib olla ka mitte-0 väärtused. 130 00:07:40,060 --> 00:07:43,470 Kõik see tähendab, ja kõik sellised see kontrollimine on 131 00:07:43,470 --> 00:07:45,610 terve sinine värv. 132 00:07:45,610 --> 00:07:50,050 Aga kõik piksleid ka osalise värvi väärtused, nagu see 133 00:07:50,050 --> 00:07:52,180 Järgmine näide siin. 134 00:07:52,180 --> 00:07:55,400 >> See on natuke raskem näha mida see pilt on nüüd. 135 00:07:55,400 --> 00:08:00,320 See tundub natuke nagu clue.bmp et antakse teile. 136 00:08:00,320 --> 00:08:03,600 Nüüd, füüsiliselt, siis võiks seda lahendada, sest seal on palju punast, mida 137 00:08:03,600 --> 00:08:07,040 hoidmine punase ekraani pilt nii et teised värvid võivad ilmneda. 138 00:08:07,040 --> 00:08:10,968 Niisiis, kuidas me jäljendada seda c? 139 00:08:10,968 --> 00:08:15,640 Noh, me võiksime kõrvaldada kõik punased alates pilt täielikult. 140 00:08:15,640 --> 00:08:21,870 Ja mida teha, et me määrata iga piksli punase väärtuseks 0. 141 00:08:21,870 --> 00:08:25,020 Ja nii et pilti näeks natuke natuke nagu see, kus meil ei ole punane 142 00:08:25,020 --> 00:08:26,300 üldse. 143 00:08:26,300 --> 00:08:29,390 >> Näeme peidetud sõnum natuke selgemalt nüüd. 144 00:08:29,390 --> 00:08:31,730 See on teine ​​naerusuu. 145 00:08:31,730 --> 00:08:33,870 Või äkki me võiks kasutada mõnda muud meetodit. 146 00:08:33,870 --> 00:08:36,480 Äkki me võiks määratleda kõik punased pikslit - 147 00:08:36,480 --> 00:08:41,100 see tähendab, et kõik pikslid 0 sinine 0 roheline ja 0 punane - 148 00:08:41,100 --> 00:08:43,169 ja muuta need valgeks. 149 00:08:43,169 --> 00:08:45,470 Ja meie pilt võiks välja midagi sellist. 150 00:08:45,470 --> 00:08:48,250 Natuke lihtsam näha. 151 00:08:48,250 --> 00:08:51,170 >> Seal on palju muid võimalusi, et paljastada salajane sõnum ka, 152 00:08:51,170 --> 00:08:53,730 tegelevad värvi manipuleerimist. 153 00:08:53,730 --> 00:08:57,050 Äkki võib kasutada ühte meetoditest et ma eespool mainitud. 154 00:08:57,050 --> 00:08:59,600 Ja lisaks võiksite suurendada mõned värvid 155 00:08:59,600 --> 00:09:02,620 ja tuua need välja. 156 00:09:02,620 --> 00:09:06,190 >> Nüüd, et oleme muutnud pixel värv kõrval on meil vaja kirjutada neid 157 00:09:06,190 --> 00:09:08,500 sisse scanline, pixel by pixel. 158 00:09:08,500 --> 00:09:11,860 Ja veel kord, sa tahad, et vaadata tagasi et copy.c, kui sa ei ole kopeerinud 159 00:09:11,860 --> 00:09:18,170 seda juba, ja vaadata fwrite funktsioon, mis võtab andmeid pointer 160 00:09:18,170 --> 00:09:23,230 et struct mis sisaldab bytes et sa loed alates suurus 161 00:09:23,230 --> 00:09:26,610 esemed, esemete arv, ja siis outptr - 162 00:09:26,610 --> 00:09:29,450 sihtkoha neid faile. 163 00:09:29,450 --> 00:09:34,010 >> Pärast kirjutad pikslit, siis saad ka kirjutada polster. 164 00:09:34,010 --> 00:09:34,970 Mis on polster? 165 00:09:34,970 --> 00:09:38,670 Noh, iga rgbt pixel on kolm baiti pikk. 166 00:09:38,670 --> 00:09:43,670 Aga scanline jaoks Rasterpildi peab olema mitu neli baiti. 167 00:09:43,670 --> 00:09:47,650 Ja kui pikslite arv ei ole Mitme neli, siis on meil vaja lisada 168 00:09:47,650 --> 00:09:48,880 see polster. 169 00:09:48,880 --> 00:09:51,420 Polster on lihtsalt esindab 0.. 170 00:09:51,420 --> 00:09:54,380 Niisiis, kuidas me kirjutada või lugeda seda? 171 00:09:54,380 --> 00:09:59,280 Noh, tuli välja, et sa ei saa tegelikult fread polster, kuid võite 172 00:09:59,280 --> 00:10:00,970 arvutada. 173 00:10:00,970 --> 00:10:04,400 >> Sel juhul aimugi ja kohtuotsust on sama laiusega, nii 174 00:10:04,400 --> 00:10:05,910 polster sama. 175 00:10:05,910 --> 00:10:09,370 Ja polstrist, kui näete aastal copy.c, arvutatakse 176 00:10:09,370 --> 00:10:11,790 koos allpool valemiga - 177 00:10:11,790 --> 00:10:16,690 bi.biWidth korda sizeof (RGBTRIPLE) tahe meile kui palju baite bmp 178 00:10:16,690 --> 00:10:18,280 on igas reas. 179 00:10:18,280 --> 00:10:21,890 Sealt MODULOS ja lahutamine 4 võib arvutada, kui 180 00:10:21,890 --> 00:10:25,610 palju baite tuleb lisada, et Mitme baite edasi 181 00:10:25,610 --> 00:10:27,250 igal real on neli. 182 00:10:27,250 --> 00:10:30,490 >> Nüüd, kui meil on valem kui palju padding peame nüüd 183 00:10:30,490 --> 00:10:31,610 saame kirjutada. 184 00:10:31,610 --> 00:10:34,080 Nüüd juba mainisin, polster on lihtsalt 0.. 185 00:10:34,080 --> 00:10:39,730 Nii et sel juhul me lihtsalt pannes char, antud juhul 0, meie 186 00:10:39,730 --> 00:10:41,710 outptr - meie outfile. 187 00:10:41,710 --> 00:10:47,530 Nii et saab lihtsalt fputc 0, koma outptr. 188 00:10:47,530 --> 00:10:52,400 >> Seega, kui me oleme olnud lugedes meie , faili I / O on hoida silma peal meie 189 00:10:52,400 --> 00:10:57,440 positsiooni neid faile koos midagi nimega faili positsiooni indikaator. 190 00:10:57,440 --> 00:10:59,350 Mõtle seda kursor. 191 00:10:59,350 --> 00:11:03,550 Põhimõtteliselt, see areneb iga kord et me fread, kuid meil 192 00:11:03,550 --> 00:11:05,671 kontroll selle üle ka. 193 00:11:05,671 --> 00:11:11,030 >> Faili teisaldada positsiooni indikaator, saate kasutada funktsiooni fseek. 194 00:11:11,030 --> 00:11:15,600 Kui inptr tähistab faili pointer, et otsite kohta, 195 00:11:15,600 --> 00:11:20,370 summa on baitide arv, mis te tahad liigutada kursorit, ja siis 196 00:11:20,370 --> 00:11:23,470 seotud võrdluspunkti kust kursor. 197 00:11:23,470 --> 00:11:26,770 Kui teil liigu SEEK_CUR, et esindab praegune 198 00:11:26,770 --> 00:11:28,100 positsiooni faili. 199 00:11:28,100 --> 00:11:31,020 Või võite kasutada mõnda muud parameetrid. 200 00:11:31,020 --> 00:11:35,400 Niisiis, me võiksite kasutada fseek vahele üle polstrist faili. 201 00:11:35,400 --> 00:11:39,410 Ja veel, kui sa oled ummikus, ei Näiteks, et copy.c. 202 00:11:39,410 --> 00:11:43,260 >> Nüüd oleme avatud faili aimugi, ja kohtuotsus. 203 00:11:43,260 --> 00:11:46,450 Oleme uuendanud header info eest meie otsus, sest iga 204 00:11:46,450 --> 00:11:48,730 bitmap vaja päises. 205 00:11:48,730 --> 00:11:52,280 Oleme siis loe arvesse aimugi on scanline, pikselhaaval, muutes 206 00:11:52,280 --> 00:11:55,210 iga värvi muudetakse vajadusel kirjalikult neid arvesse 207 00:11:55,210 --> 00:11:57,340 kohtuotsust, pixel by pixel. 208 00:11:57,340 --> 00:12:01,550 Kui avate kohtuotsust, saab näha, kes süüdlane, või mis saladus 209 00:12:01,550 --> 00:12:02,850 sõnum. 210 00:12:02,850 --> 00:12:05,550 Minu nimi on Zamyla ja see oli Dekkari. 211 00:12:05,550 --> 00:12:12,864