1 00:00:00,000 --> 00:00:09,500 >> [Mūzikas atskaņošanai] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA Chan: Tā bija Miss Scarlett ar svečturis. 3 00:00:12,350 --> 00:00:13,560 Detektīvromāns? 4 00:00:13,560 --> 00:00:15,030 Nu, mēs ejam, lai uzzinātu. 5 00:00:15,030 --> 00:00:20,870 Jo galda spēle Clue, jūs varētu jāpiešķir fiziska sarkanu attēlu. 6 00:00:20,870 --> 00:00:24,120 Un tas tēls ir ļoti sarkana un plankumains, un jūsu uzdevums ir 7 00:00:24,120 --> 00:00:25,490 atklāt slēptās ziņu. 8 00:00:25,490 --> 00:00:29,740 Un parasti jūs nodrošina ar sarkanu lupas vai sarkano ekrāna 9 00:00:29,740 --> 00:00:31,410 atklāj, ka slēptās ziņu. 10 00:00:31,410 --> 00:00:33,340 Nu, mēs ejam, lai atdarinātu to. 11 00:00:33,340 --> 00:00:37,960 >> In detektīvromāns, jūs esat dota bitkartes attēlu kas izskatās ļoti plankumains un sarkans, 12 00:00:37,960 --> 00:00:43,430 un pēc tam palaist detektīvromāns programmu atklāt apslēpto vēstījumu. 13 00:00:43,430 --> 00:00:45,650 >> Tā ļauj lauzt to vērā posmos. 14 00:00:45,650 --> 00:00:50,390 Pirmkārt, jūs vēlaties, lai atvērtu failu - pavediens, ka jums ir dota. 15 00:00:50,390 --> 00:00:53,880 Un tad arī izveidot spriedums bitkartes failu. 16 00:00:53,880 --> 00:00:58,240 Tad jūs vēlaties, lai atjauninātu bitmap header info par spriedumu OUTFILE. 17 00:00:58,240 --> 00:00:59,920 Vairāk par šo vēlāk. 18 00:00:59,920 --> 00:01:04,319 Un tad jūs gatavojas lasīt par pavediens, scanline, pixel by pixel, 19 00:01:04,319 --> 00:01:07,320 mainot pikseļu krāsas kā nepieciešams, un rakstīšana 20 00:01:07,320 --> 00:01:08,960 tos uz spriedumu - 21 00:01:08,960 --> 00:01:12,000 pixel by pixel par spriedums scanline. 22 00:01:12,000 --> 00:01:13,780 >> Kā mēs sākam iet par šo? 23 00:01:13,780 --> 00:01:16,940 Nu, par laimi, mums ir copy.c izplatīšanas kodu. 24 00:01:16,940 --> 00:01:21,240 Un tas notiek, lai pierādītu ļoti noderīga, lai mums. 25 00:01:21,240 --> 00:01:29,700 Copy.c atver failu, skan, ka inFile galvene, un pēc tam atjaunina 26 00:01:29,700 --> 00:01:31,070 outfile galvene. 27 00:01:31,070 --> 00:01:37,010 Un tad tas skan katru pikseli, kas scanline, pixel by pixel, un pēc tam 28 00:01:37,010 --> 00:01:42,390 raksta, ka pikseli uz OUTFILE. 29 00:01:42,390 --> 00:01:45,020 >> Tātad, jūsu pirmais solis varētu palaist šādiem 30 00:01:45,020 --> 00:01:46,420 komandu terminālī - 31 00:01:46,420 --> 00:01:50,270 cp copy.c whodunit.c. 32 00:01:50,270 --> 00:01:55,320 Tas rada kopiju copy.c nosaukts whodunit.c. 33 00:01:55,320 --> 00:01:58,320 Tātad, mūsu pirmais solis, lai atvērtu failu, labi, tur ir precīza 34 00:01:58,320 --> 00:02:00,070 reprodukcija ka copy.c. 35 00:02:00,070 --> 00:02:03,360 Tāpēc es ņemšu atvaļinājumu jums apskatīt to. 36 00:02:03,360 --> 00:02:07,860 >> Kas mums ir darīšana ar šo PSET ir failu I / O, galvenokārt ņemot failus, 37 00:02:07,860 --> 00:02:10,229 lasīšana, rakstīšana, rediģēšanas tiem. 38 00:02:10,229 --> 00:02:12,650 Kā jūs pirmo reizi atverat failu? 39 00:02:12,650 --> 00:02:16,800 Nu, jūs gatavojas atzīt failu rādītājs, un tad jūs saucat 40 00:02:16,800 --> 00:02:18,670 Funkcija fopen. 41 00:02:18,670 --> 00:02:23,150 Iet ceļā, vai nosaukumu, kas failu, un tad veids, ka jūs vēlaties 42 00:02:23,150 --> 00:02:24,700 atvērt šo failu iekšā 43 00:02:24,700 --> 00:02:28,620 Iet kādā r atvērs foo.bmp lasīšanai. 44 00:02:28,620 --> 00:02:35,670 Tā fopen ar iet ar w būs atvērta bar.bmp, rakstot failu un 45 00:02:35,670 --> 00:02:37,020 faktiski rediģēt to. 46 00:02:37,020 --> 00:02:41,970 >> Tāpēc tagad, ka mēs esam atvērti failu, mūsu Nākamais solis ir atjaunināt galvenes info 47 00:02:41,970 --> 00:02:43,230 par OUTFILE. 48 00:02:43,230 --> 00:02:44,610 Kas ir galvenes informācija? 49 00:02:44,610 --> 00:02:48,160 Nu, vispirms mums ir nepieciešams zināt ko bitmap ir. 50 00:02:48,160 --> 00:02:51,000 Bitmap ir tikai vienkārša izkārtojums baitu. 51 00:02:51,000 --> 00:02:55,480 Un viņi deklarē šajā failā šeit, bmp.h, ar ķekars 52 00:02:55,480 --> 00:02:58,610 Informācija par to, bitmap faktiski ir izgatavots no. 53 00:02:58,610 --> 00:03:05,730 Bet tas, ko mēs tiešām rūp, ir bitmap failu header, tieši šeit, un 54 00:03:05,730 --> 00:03:08,460 bitmap info header, nekā šeit. 55 00:03:08,460 --> 00:03:13,170 Header sastāv no pāris mainīgie, kas būs ļoti noderīga. 56 00:03:13,170 --> 00:03:18,400 Ir biSizeImage, kas ir kopējais izmērs attēla baitos. 57 00:03:18,400 --> 00:03:20,890 Un tas ietver pikseļu un polsterējums. 58 00:03:20,890 --> 00:03:24,210 Polsterējums ir ļoti svarīgi, bet mēs nokļūt, ka vēlāk. 59 00:03:24,210 --> 00:03:30,000 >> BiWidth apzīmē platumu attēls pikseļos mīnus polsterējumu. 60 00:03:30,000 --> 00:03:34,220 BiHeight tad arī augstums attēla pikseļos. 61 00:03:34,220 --> 00:03:38,240 Un pēc tam BITMAPFILEHEADER un BITMAPINFOHEADER, kā jau es teicu 62 00:03:38,240 --> 00:03:40,900 agrāk, tie ir pārstāvētas kā structs. 63 00:03:40,900 --> 00:03:45,410 Tātad, jūs nevarat piekļūt failu galvenes pati par sevi, bet jūs vēlaties nokļūt 64 00:03:45,410 --> 00:03:47,370 šie mainīgie iekšpusē. 65 00:03:47,370 --> 00:03:48,170 >> OK. 66 00:03:48,170 --> 00:03:50,600 Tātad, kā mēs atjaunināt galvenes info? 67 00:03:50,600 --> 00:03:54,020 Nu, vispirms mums ir, lai redzētu, vai mēs nepieciešams mainīt jebkādu informāciju no 68 00:03:54,020 --> 00:03:58,480 infile, pavediens, lai outfile, spriedums. 69 00:03:58,480 --> 00:04:00,250 Vai kaut kas mainās šajā gadījumā? 70 00:04:00,250 --> 00:04:04,320 Nu, faktiski nav, jo mēs ejam kas tikai mainot krāsas. 71 00:04:04,320 --> 00:04:07,550 Mēs nebrauksim, mainās failu izmēra, attēla izmērs, platums, 72 00:04:07,550 --> 00:04:08,310 vai augstuma. 73 00:04:08,310 --> 00:04:14,010 Tātad, jūs visi labi tagad ar tikai kopēšanu katru pikseli. 74 00:04:14,010 --> 00:04:14,840 >> OK. 75 00:04:14,840 --> 00:04:20,720 Tāpēc tagad aplūkosim, cik mēs patiesībā var lasīt katru pikseli no lietas materiāliem. 76 00:04:20,720 --> 00:04:23,640 Citu failu I / O funkciju stāsies play - 77 00:04:23,640 --> 00:04:24,700 fread. 78 00:04:24,700 --> 00:04:28,440 Tas aizņem ar rādītāju uz struct kas satur baiti, kas 79 00:04:28,440 --> 00:04:30,110 jūs lasāt. 80 00:04:30,110 --> 00:04:31,890 Tātad jūs lasāt par to. 81 00:04:31,890 --> 00:04:36,090 Un tad jums iet ar izmēru, kas ir lielums katram elementam, kas jums 82 00:04:36,090 --> 00:04:37,360 vēlas lasīt. 83 00:04:37,360 --> 00:04:40,640 Lūk, funkciju sizeof noderēs. 84 00:04:40,640 --> 00:04:45,570 Tad jums iet ar numuru, kurā apzīmē skaitu elementu 85 00:04:45,570 --> 00:04:47,480 izmērs lasīt. 86 00:04:47,480 --> 00:04:51,180 Un tad beidzot, inptr, kas ir failu rādītājs, ka tu esi 87 00:04:51,180 --> 00:04:52,530 nolasīšu no. 88 00:04:52,530 --> 00:04:58,650 Tātad visi šie elementi ir iekšā inptr un viņi gatavojas datiem. 89 00:04:58,650 --> 00:05:01,660 >> Apskatīsim nelielu piemēru. 90 00:05:01,660 --> 00:05:07,590 Ja es gribu lasīt par datu diviem suņiem, labi, es varu darīt to par vienu no diviem veidiem. 91 00:05:07,590 --> 00:05:15,250 Es varu vai nu lasīt diviem objektiem izmēru suns no mana inptr, vai es varu izlasīt 92 00:05:15,250 --> 00:05:19,280 viens objekts izmēru diviem suņiem. 93 00:05:19,280 --> 00:05:23,580 Tātad jūs redzat, ka atkarībā no tā, ka jums organizēt lielumu un skaitu, jums 94 00:05:23,580 --> 00:05:25,840 var izlasīt vienā baitu skaitu. 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> Tāpēc tagad, pieņemsim mainīt pikseļu krāsu, kā mums vajag. 97 00:05:33,020 --> 00:05:37,320 Ja paskatās bmp.h atkal, tad Jūs redzēsiet, ka apakšā 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs ir vēl struktūrai, kur tie sastāv no trim bytes. 99 00:05:42,920 --> 00:05:49,220 Viens, rgbtBlue, rgbtGreen un rgbtRed. 100 00:05:49,220 --> 00:05:52,480 Tātad, katrs no tiem ir summa zilā, summa zaļā krāsā, un 101 00:05:52,480 --> 00:05:57,250 daudzums sarkano iekšā šo pikseli, ja katra summa pārstāv 102 00:05:57,250 --> 00:05:58,670 heksadecimālo numuru. 103 00:05:58,670 --> 00:06:04,370 >> Tāpēc ff0000 būs zilā krāsā, jo tā iet no zila, 104 00:06:04,370 --> 00:06:05,850 zaļā, sarkanā krāsā. 105 00:06:05,850 --> 00:06:09,300 Un tad visi f s būs baltā krāsā. 106 00:06:09,300 --> 00:06:13,440 Pieņemsim apskatīt smiley.bmp, kas Jums ir jūsu izplatīšanas kodu. 107 00:06:13,440 --> 00:06:15,690 Ja jūs atvērt to tikai attēlu skatītājs, tad jūs 108 00:06:15,690 --> 00:06:17,080 vienkārši redzēt sarkanu smaidiņu. 109 00:06:17,080 --> 00:06:20,380 Bet ņemot dziļāku nirt, mēs redzam, ka struktūra 110 00:06:20,380 --> 00:06:22,340 un tas ir tikai pikseļi. 111 00:06:22,340 --> 00:06:25,880 Mums ir baltas pikseļi, un tad sarkano pikseļi. 112 00:06:25,880 --> 00:06:31,000 Balts, ffffff, un tad visi sarkans pikseļi Esmu iezīmētu jums 113 00:06:31,000 --> 00:06:35,440 šeit, un jūs redzēsiet, ka viņi 0000FF. 114 00:06:35,440 --> 00:06:39,760 Nulle zils, nulle zaļā un sarkanu. 115 00:06:39,760 --> 00:06:45,350 Un tā kā smaidiņu ir astoņi pikseļus plats, mums nav nekādas polsterējums. 116 00:06:45,350 --> 00:06:47,360 Labi. 117 00:06:47,360 --> 00:06:53,310 >> Tātad, ja es būtu piešķirt dažādas vērtības līdz RGBTRIPLE, un es gribēju 118 00:06:53,310 --> 00:06:58,350 padarītu to zaļo krāsu, tad tas, ko es varētu darīt, ir Es vēlētos deklarēt RGBTRIPLE, nosaukts 119 00:06:58,350 --> 00:07:02,660 triple, un pēc tam, lai piekļūtu katru baitu šajā struct I 120 00:07:02,660 --> 00:07:04,030 varētu izmantot dot operatoram. 121 00:07:04,030 --> 00:07:08,430 Tātad triple.rgbtBlue, es varu piešķirt, ka līdz 0. 122 00:07:08,430 --> 00:07:13,460 Zaļā es varu piešķirt to pilnībā - jebkurš numuru, patiešām, starp 0 un ff. 123 00:07:13,460 --> 00:07:15,470 Un tad sarkana, es esmu arī gatavojas teikt 0. 124 00:07:15,470 --> 00:07:19,160 Tātad, kas man dod zaļo pikseļu. 125 00:07:19,160 --> 00:07:23,030 >> Nākamais, kas notiks, ja es gribu, lai pārbaudītu vērtība kaut ko? 126 00:07:23,030 --> 00:07:27,250 Es varētu būt kaut kas pārbauda vai trīskāršā ir rgbtBlue vērtība ir 127 00:07:27,250 --> 00:07:31,080 ff, un pēc tam izdrukāt, "Es jūtos blue! ", kā rezultātā. 128 00:07:31,080 --> 00:07:35,640 Tagad, tas nebūt nenozīmē, ka pikseļu ir zils, vai ne? 129 00:07:35,640 --> 00:07:40,060 Tāpēc, ka Pixel ir zaļā un sarkanā vērtības varētu būt arī ne-0 vērtības. 130 00:07:40,060 --> 00:07:43,470 Viss, ka tas nozīmē, un visu, kas tas ir pārbaudīt, ir 131 00:07:43,470 --> 00:07:45,610 par pilnu zilā krāsā. 132 00:07:45,610 --> 00:07:50,050 Bet visi pikseļi var būt arī daļēja krāsu vērtības, piemēram, tas, 133 00:07:50,050 --> 00:07:52,180 Nākamais piemērs šeit. 134 00:07:52,180 --> 00:07:55,400 >> Tas ir nedaudz grūtāk redzēt ko šis tēls ir tagad. 135 00:07:55,400 --> 00:08:00,320 Tas izskatās nedaudz vairāk kā clue.bmp, ka jums tiks dota. 136 00:08:00,320 --> 00:08:03,600 Tagad, fiziski, jūs varētu atrisināt šo, jo tur ir daudz sarkanā, ko 137 00:08:03,600 --> 00:08:07,040 turot sarkanu ekrānu attēlu, lai ka citas krāsas var parādīties. 138 00:08:07,040 --> 00:08:10,968 Tātad, kā mēs atdarinātu to ar c? 139 00:08:10,968 --> 00:08:15,640 Nu, mēs varētu noņemt visus sarkans no attēla pilnībā. 140 00:08:15,640 --> 00:08:21,870 Un tā, kā to darīt, mēs gribētu noteikti ik pikseļa sarkano vērtību 0. 141 00:08:21,870 --> 00:08:25,020 Un tā tēls varētu izskatīties mazliet bit, piemēram, tas, kur mums nav sarkans 142 00:08:25,020 --> 00:08:26,300 whatsoever. 143 00:08:26,300 --> 00:08:29,390 >> Mēs varam redzēt slēpto ziņa mazliet skaidrāk tagad. 144 00:08:29,390 --> 00:08:31,730 Tas ir vēl viens smiley sejas. 145 00:08:31,730 --> 00:08:33,870 Vai varbūt mēs varētu izmantot citu metodi. 146 00:08:33,870 --> 00:08:36,480 Varbūt mēs varētu identificēt visas sarkanās pikseļi - 147 00:08:36,480 --> 00:08:41,100 , tas ir, visas pikseļiem ar 0 zils, 0 zaļā un 0 sarkans - 148 00:08:41,100 --> 00:08:43,169 un mainīt tos, balta. 149 00:08:43,169 --> 00:08:45,470 Un mūsu tēls varētu izskatīties kaut kas līdzīgs šim. 150 00:08:45,470 --> 00:08:48,250 Mazliet vieglāk redzēt. 151 00:08:48,250 --> 00:08:51,170 >> Ir daudz citu veidu, kā atklāt noslēpums ziņu, kā arī, 152 00:08:51,170 --> 00:08:53,730 nodarbojas ar krāsu manipulācijas. 153 00:08:53,730 --> 00:08:57,050 Varbūt jūs varētu izmantot vienu no metodēm ka es minēts iepriekš. 154 00:08:57,050 --> 00:08:59,600 Un papildus, jūs varētu vēlēties uzlabot dažas krāsas 155 00:08:59,600 --> 00:09:02,620 un vainīgos saukt out. 156 00:09:02,620 --> 00:09:06,190 >> Tāpēc tagad, ka mēs esam mainījuši pixel krāsu, blakus mums ir nepieciešams, lai rakstīt tos 157 00:09:06,190 --> 00:09:08,500 , lai ar scanline, pixel by pixel. 158 00:09:08,500 --> 00:09:11,860 Un atkal, jūs vēlaties, lai atskatītos līdz copy.c, ja jums nav kopēt 159 00:09:11,860 --> 00:09:18,170 tā jau ir, un apskatīt fwrite funkcija, kas ņem datus rādītājs 160 00:09:18,170 --> 00:09:23,230 līdz struktūrai, kas satur baiti ka jūs lasāt no tās lieluma 161 00:09:23,230 --> 00:09:26,610 preces, preces, un pēc tam outptr - 162 00:09:26,610 --> 00:09:29,450 galamērķi no šiem failiem. 163 00:09:29,450 --> 00:09:34,010 >> Pēc tam, kad rakstīt pikseļiem, jūs arī rakstīt polsterējumu. 164 00:09:34,010 --> 00:09:34,970 Kas ir polsterējums? 165 00:09:34,970 --> 00:09:38,670 Nu, katrs rgbt pikseļu ir trīs baiti. 166 00:09:38,670 --> 00:09:43,670 Bet, scanline par bitmap attēlu ir jābūt vairākus no četriem bytes. 167 00:09:43,670 --> 00:09:47,650 Un, ja pikseļu skaits nav dalās ar četri, tad mums ir nepieciešams, lai pievienotu 168 00:09:47,650 --> 00:09:48,880 tas polsterējums. 169 00:09:48,880 --> 00:09:51,420 Polsterējums ir tikai pārstāv 0s. 170 00:09:51,420 --> 00:09:54,380 Tātad, kā mēs rakstīt, vai lasīt šo? 171 00:09:54,380 --> 00:09:59,280 Nu, izrādās, ka jūs nevarat faktiski fread polsterējums, bet jūs varat 172 00:09:59,280 --> 00:10:00,970 aprēķināt. 173 00:10:00,970 --> 00:10:04,400 >> Šajā gadījumā pavediens un verdikts ir vienāds platums, lai 174 00:10:04,400 --> 00:10:05,910 apdare ir tāda pati. 175 00:10:05,910 --> 00:10:09,370 Un polsterējums, kā jūs redzēsiet in copy.c, aprēķina 176 00:10:09,370 --> 00:10:11,790 ar zem formulas - 177 00:10:11,790 --> 00:10:16,690 bi.biWidth reizes sizeof (RGBTRIPLE) būs dod mums, cik daudz baitu bmp 178 00:10:16,690 --> 00:10:18,280 ir katrā rindā. 179 00:10:18,280 --> 00:10:21,890 No turienes, modulos un atskaitījumus ar 4, var aprēķināt, cik 180 00:10:21,890 --> 00:10:25,610 daudzi baiti ir pievienots tā, ka vairāku baitu par 181 00:10:25,610 --> 00:10:27,250 katrā rindā ir četri. 182 00:10:27,250 --> 00:10:30,490 >> Tagad, kad mums ir formula cik daudz polsterējums mums vajag, tagad 183 00:10:30,490 --> 00:10:31,610 mēs varam rakstīt to. 184 00:10:31,610 --> 00:10:34,080 Tagad, es minēju iepriekš, polsterējums ir tikai 0s. 185 00:10:34,080 --> 00:10:39,730 Tātad šajā gadījumā, mēs esam tikai liekot char, šajā gadījumā 0, mūsu 186 00:10:39,730 --> 00:10:41,710 outptr - mūsu outfile. 187 00:10:41,710 --> 00:10:47,530 Tā, ka var vienkārši fputc 0, komats outptr. 188 00:10:47,530 --> 00:10:52,400 >> Tātad, kamēr mēs esam lasījums mūsu failu, failu I / O, ir tur līdzi mūsu 189 00:10:52,400 --> 00:10:57,440 pozīcija šos failus ar kaut ko sauc failu stāvokļa indikators. 190 00:10:57,440 --> 00:10:59,350 Domājiet par to kā kursors. 191 00:10:59,350 --> 00:11:03,550 Būtībā, tas avansus katru reizi ka mēs fread, bet mums ir 192 00:11:03,550 --> 00:11:05,671 kontroli pār to, too. 193 00:11:05,671 --> 00:11:11,030 >> Lai pārvietotu failu pozīcijas indikatoru, Jūs varat izmantot šo funkciju fseek. 194 00:11:11,030 --> 00:11:15,600 Kur inptr pārstāv failu rādītājs, ka jūs esat meklē, kas, 195 00:11:15,600 --> 00:11:20,370 summa ir baitu skaits, kas jums vēlas, lai pārvietotu kursoru, un pēc tam no 196 00:11:20,370 --> 00:11:23,470 saistīts ar atskaites punktu No kur jūsu kursors. 197 00:11:23,470 --> 00:11:26,770 Ja jūs iet ar SEEK_CUR, ka pārstāv strāvu 198 00:11:26,770 --> 00:11:28,100 pozīciju failā. 199 00:11:28,100 --> 00:11:31,020 Vai arī jūs varat izmantot dažas citus parametrus. 200 00:11:31,020 --> 00:11:35,400 Tātad, mēs varētu vēlēties, lai izmantotu fseek izlaist pār polsterējums in failu. 201 00:11:35,400 --> 00:11:39,410 Un atkal, ja jūs esat iestrēdzis, tur ir piemērs, ka copy.c. 202 00:11:39,410 --> 00:11:43,260 >> Tāpēc tagad mēs esam atvērti failu, pavediens, un spriedums. 203 00:11:43,260 --> 00:11:46,450 Mēs esam atjauninājuši galvenes info par mūsu spriedums, jo katrs 204 00:11:46,450 --> 00:11:48,730 bitmap nepieciešams galveni. 205 00:11:48,730 --> 00:11:52,280 Mēs esam tad nolasīt atrisinājums ir scanline, pixel by pixel, mainot 206 00:11:52,280 --> 00:11:55,210 katru krāsu pēc vajadzības, un rakstot tos uz 207 00:11:55,210 --> 00:11:57,340 spriedums, pixel by pixel. 208 00:11:57,340 --> 00:12:01,550 Kad jūs atveriet spriedumu, jūs varat redzēt, kas vaininieks, vai kāds noslēpums 209 00:12:01,550 --> 00:12:02,850 vēstījums ir. 210 00:12:02,850 --> 00:12:05,550 Mans vārds ir Zamyla, un tas bija detektīvromāns. 211 00:12:05,550 --> 00:12:12,864