1 00:00:00,000 --> 00:00:09,500 >> [Music kucheza] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA CHAN: Ilikuwa Miss Scarlett na kinara. 3 00:00:12,350 --> 00:00:13,560 Whodunit? 4 00:00:13,560 --> 00:00:15,030 Naam, tunakwenda kujua. 5 00:00:15,030 --> 00:00:20,870 Katika mchezo wa bodi kidokezo, huenda kupewa kimwili nyekundu picha. 6 00:00:20,870 --> 00:00:24,120 Na picha kwamba ni nyekundu sana na spotty, na kazi yako ni 7 00:00:24,120 --> 00:00:25,490 yatangaza ujumbe siri. 8 00:00:25,490 --> 00:00:29,740 Na kwa kawaida wewe ni zinazotolewa na nyekundu magnifying kioo, au screen nyekundu 9 00:00:29,740 --> 00:00:31,410 yanaonyesha kwamba ujumbe siri. 10 00:00:31,410 --> 00:00:33,340 Naam, tunakwenda kuiga hiyo. 11 00:00:33,340 --> 00:00:37,960 >> Katika whodunit, wewe ni kupewa bitmap picha kwamba inaonekana spotty sana na nyekundu, 12 00:00:37,960 --> 00:00:43,430 na kisha kuendesha programu whodunit kudhihirisha ujumbe wa siri. 13 00:00:43,430 --> 00:00:45,650 >> Basi hebu kuvunja hii katika hatua. 14 00:00:45,650 --> 00:00:50,390 Kwanza, unataka kufungua faili - kidokezo kwamba tumekuwa huo. 15 00:00:50,390 --> 00:00:53,880 Na kisha pia kujenga uamuzi bitmap file. 16 00:00:53,880 --> 00:00:58,240 Kisha unataka update bitmap header info kwa ajili ya uamuzi outfile. 17 00:00:58,240 --> 00:00:59,920 Zaidi juu ya baadaye. 18 00:00:59,920 --> 00:01:04,319 Na kisha utaenda kusoma katika kidokezo, scanline, pixel kwa pixel, 19 00:01:04,319 --> 00:01:07,320 kubadilisha rangi pixel kama muhimu, na kuandika 20 00:01:07,320 --> 00:01:08,960 wale katika uamuzi - 21 00:01:08,960 --> 00:01:12,000 pixel kwa pixel katika uamuzi scanline. 22 00:01:12,000 --> 00:01:13,780 >> Je, sisi kuanza kwenda kuhusu hili? 23 00:01:13,780 --> 00:01:16,940 Naam, bahati, tuna copy.c katika usambazaji code. 24 00:01:16,940 --> 00:01:21,240 Na hii ni kwenda kuthibitisha muhimu kabisa kwetu. 25 00:01:21,240 --> 00:01:29,700 Copy.c kufungua faili, wasomaji katika infile ya kichwa, na kisha updates 26 00:01:29,700 --> 00:01:31,070 header outfile ya. 27 00:01:31,070 --> 00:01:37,010 Na kisha wasomaji kila pixel katika scanline, pixel kwa pixel, na kisha 28 00:01:37,010 --> 00:01:42,390 anaandika kwamba pixel katika outfile. 29 00:01:42,390 --> 00:01:45,020 >> Hivyo, hatua yako ya kwanza nguvu kuwa na kukimbia zifuatazo 30 00:01:45,020 --> 00:01:46,420 amri katika terminal - 31 00:01:46,420 --> 00:01:50,270 cp copy.c whodunit.c. 32 00:01:50,270 --> 00:01:55,320 Hii itakuwa kujenga nakala ya copy.c jina lake whodunit.c. 33 00:01:55,320 --> 00:01:58,320 Hivyo hatua yetu ya kwanza kufungua file, vizuri, kuna halisi 34 00:01:58,320 --> 00:02:00,070 replica ya kwamba katika copy.c. 35 00:02:00,070 --> 00:02:03,360 Basi, mimi itabidi kuondoka kwa kuangalia kwamba. 36 00:02:03,360 --> 00:02:07,860 >> Nini sisi ni kushughulika na katika pset hii ni file I / O, kimsingi kuchukua files, 37 00:02:07,860 --> 00:02:10,229 kusoma, kuandika, editing yao. 38 00:02:10,229 --> 00:02:12,650 Jinsi gani unaweza kwanza kufungua faili? 39 00:02:12,650 --> 00:02:16,800 Naam, wewe ni kwenda kutangaza file pointer, na kisha wewe piga 40 00:02:16,800 --> 00:02:18,670 kazi fopen. 41 00:02:18,670 --> 00:02:23,150 Kupita katika njia, au jina la faili, na kisha mode kwamba unataka 42 00:02:23,150 --> 00:02:24,700 kufungua faili kwamba in 43 00:02:24,700 --> 00:02:28,620 Kupita katika r itafungua foo.bmp kwa ajili ya kusoma. 44 00:02:28,620 --> 00:02:35,670 Wakati fopen na kupita katika w mapenzi bar.bmp wazi, kwa ajili ya kuandika file na 45 00:02:35,670 --> 00:02:37,020 kweli editing yake. 46 00:02:37,020 --> 00:02:41,970 >> Hivyo sasa kwamba tumekuwa kufunguliwa faili, yetu Hatua ya pili ni update header info 47 00:02:41,970 --> 00:02:43,230 kwa outfile. 48 00:02:43,230 --> 00:02:44,610 Nini header info? 49 00:02:44,610 --> 00:02:48,160 Naam, kwanza tunahitaji kujua nini bitmap ni. 50 00:02:48,160 --> 00:02:51,000 bitmap ni rahisi tu mpangilio wa ka. 51 00:02:51,000 --> 00:02:55,480 Na wao ni alitangaza katika faili hii hapa, bmp.h, pamoja na kundi la 52 00:02:55,480 --> 00:02:58,610 habari ya nini bitmap ni kweli alifanya nje ya. 53 00:02:58,610 --> 00:03:05,730 Lakini nini sisi kweli huduma ya juu ni bitmap file header, hapa, na 54 00:03:05,730 --> 00:03:08,460 bitmap info header, zaidi ya hapa. 55 00:03:08,460 --> 00:03:13,170 header ni linajumuisha ya wanandoa wa vigezo ambayo kuthibitisha muhimu sana. 56 00:03:13,170 --> 00:03:18,400 Kuna biSizeImage, ambayo ni jumla ukubwa wa picha katika bytes. 57 00:03:18,400 --> 00:03:20,890 Na hii ni pamoja na saizi na padding. 58 00:03:20,890 --> 00:03:24,210 Padding ni muhimu sana, lakini tutaweza kupata baadaye. 59 00:03:24,210 --> 00:03:30,000 >> BiWidth inawakilisha upana wa picha katika saizi minus padding. 60 00:03:30,000 --> 00:03:34,220 BiHeight ni kisha pia urefu ya picha katika saizi. 61 00:03:34,220 --> 00:03:38,240 Na kisha BITMAPFILEHEADER na BITMAPINFOHEADER, kama nilivyoeleza 62 00:03:38,240 --> 00:03:40,900 mapema, wale kuwakilishwa kama structs. 63 00:03:40,900 --> 00:03:45,410 Kwa hiyo, huwezi kupata file header yenyewe, lakini utasikia wanataka kupata 64 00:03:45,410 --> 00:03:47,370 vigezo wale walio ndani ya. 65 00:03:47,370 --> 00:03:48,170 >> OK. 66 00:03:48,170 --> 00:03:50,600 Hivyo ni jinsi gani sisi update header info? 67 00:03:50,600 --> 00:03:54,020 Naam, kwanza tuna ili kuona kama sisi haja ya kubadili taarifa yoyote kutoka 68 00:03:54,020 --> 00:03:58,480 infile, habari, kwa outfile, uamuzi. 69 00:03:58,480 --> 00:04:00,250 Ni kitu chochote kubadilisha katika kesi hii? 70 00:04:00,250 --> 00:04:04,320 Naam, si kweli, kwa sababu tunakwenda kuwa tu kubadilisha rangi. 71 00:04:04,320 --> 00:04:07,550 Sisi siyo kwenda kuwa kubadilisha faili ukubwa, ukubwa wa picha, upana, 72 00:04:07,550 --> 00:04:08,310 au urefu. 73 00:04:08,310 --> 00:04:14,010 Basi, wewe ni sawa kwa sasa na tu kuiga kila pixel. 74 00:04:14,010 --> 00:04:14,840 >> OK. 75 00:04:14,840 --> 00:04:20,720 Hivyo sasa hebu tuangalie jinsi sisi kweli unaweza kusoma kila pixel kutoka faili. 76 00:04:20,720 --> 00:04:23,640 File mwingine I / O kazi ataingia ndani ya kucheza - 77 00:04:23,640 --> 00:04:24,700 fread. 78 00:04:24,700 --> 00:04:28,440 Inachukua katika pointer kwa struct ambayo yana ka kwamba 79 00:04:28,440 --> 00:04:30,110 wewe ni kusoma. 80 00:04:30,110 --> 00:04:31,890 Hivyo wewe ni kusoma katika hiyo. 81 00:04:31,890 --> 00:04:36,090 Na kisha kupita katika kawaida, ambayo ni ukubwa wa kila hiki kwamba 82 00:04:36,090 --> 00:04:37,360 unataka kusoma. 83 00:04:37,360 --> 00:04:40,640 Hapa, kazi sizeof atakuja katika Handy. 84 00:04:40,640 --> 00:04:45,570 Kisha kupita katika idadi, ambayo inawakilisha idadi ya mambo ya 85 00:04:45,570 --> 00:04:47,480 ukubwa kusoma. 86 00:04:47,480 --> 00:04:51,180 Na kisha hatimaye, inptr, ambayo ni file pointer kwamba wewe ni 87 00:04:51,180 --> 00:04:52,530 kwenda kusoma kutoka. 88 00:04:52,530 --> 00:04:58,650 Basi wote wa mambo hayo ni ndani ya inptr na wao wanaenda data. 89 00:04:58,650 --> 00:05:01,660 >> Hebu tuangalie mfano kidogo. 90 00:05:01,660 --> 00:05:07,590 Kama mimi nataka kusoma katika data mbwa wawili, vizuri, siwezi kufanya ni moja ya njia mbili. 91 00:05:07,590 --> 00:05:15,250 Mimi unaweza ama kusoma katika vitu viwili wa kawaida mbwa kutoka inptr yangu, au naweza kusoma 92 00:05:15,250 --> 00:05:19,280 katika moja kitu ukubwa wa mbwa wawili. 93 00:05:19,280 --> 00:05:23,580 Hivyo unaweza kuona kwamba kulingana na njia kwamba kupanga ukubwa na idadi, wewe 94 00:05:23,580 --> 00:05:25,840 unaweza kusoma katika idadi sawa ya ka. 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> Hivyo sasa, hebu kubadili pixel rangi kama tunahitaji. 97 00:05:33,020 --> 00:05:37,320 Kama ukiangalia bmp.h tena, basi utaona kwamba chini 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs ni struct nyingine, ambapo wao ni zikiwemo ya ka tatu. 99 00:05:42,920 --> 00:05:49,220 Moja, rgbtBlue, rgbtGreen, na rgbtRed. 100 00:05:49,220 --> 00:05:52,480 Hivyo kila moja ya haya inawakilisha kiasi rangi ya bluu, kiasi cha kijani, na 101 00:05:52,480 --> 00:05:57,250 kiasi cha nyekundu ndani ya pixel hii, ambapo kila kiasi ni kuwakilishwa na 102 00:05:57,250 --> 00:05:58,670 hexadesimoli idadi. 103 00:05:58,670 --> 00:06:04,370 >> Hivyo ff0000 itakuwa rangi ya bluu, kwa sababu inakwenda kutoka bluu, 104 00:06:04,370 --> 00:06:05,850 ya kijani, na nyekundu. 105 00:06:05,850 --> 00:06:09,300 Na kisha wote f itakuwa nyeupe. 106 00:06:09,300 --> 00:06:13,440 Hebu tuangalie smiley.bmp, ambayo una katika usambazaji code yako. 107 00:06:13,440 --> 00:06:15,690 Kama wazi katika tu picha mtazamaji, basi utakuwa 108 00:06:15,690 --> 00:06:17,080 tu kuona smiley nyekundu. 109 00:06:17,080 --> 00:06:20,380 Lakini kuchukua kupiga mbizi zaidi katika, tutaweza kuona kwamba muundo 110 00:06:20,380 --> 00:06:22,340 yake ni saizi tu. 111 00:06:22,340 --> 00:06:25,880 Tuna saizi nyeupe, na kisha saizi nyekundu. 112 00:06:25,880 --> 00:06:31,000 nyeupe, ffffff, na kisha yote ya saizi nyekundu nimekuwa rangi katika kwa ajili yenu 113 00:06:31,000 --> 00:06:35,440 hapa, na unaweza kuona kwamba wao ni 0000ff. 114 00:06:35,440 --> 00:06:39,760 Zero bluu, zero kijani, na nyekundu full. 115 00:06:39,760 --> 00:06:45,350 Na tangu smiley ni nane saizi kubwa, hatuna padding yoyote. 116 00:06:45,350 --> 00:06:47,360 Sawa. 117 00:06:47,360 --> 00:06:53,310 >> Hivyo kama ningekuwa hawawajui maadili tofauti kwa RGBTRIPLE na nilitaka 118 00:06:53,310 --> 00:06:58,350 kufanya hivyo kijani, basi nini napenda kufanya ni Napenda kutangaza RGBTRIPLE, jina lake 119 00:06:58,350 --> 00:07:02,660 tatu, na kisha kupata kila byte ndani ya kuwa struct mimi 120 00:07:02,660 --> 00:07:04,030 bila kutumia dot operator. 121 00:07:04,030 --> 00:07:08,430 Hivyo triple.rgbtBlue, siwezi hawawajui kwamba 0. 122 00:07:08,430 --> 00:07:13,460 Green naweza hawawajui kwa full - yoyote idadi, kwa kweli, kati ya 0 na ff. 123 00:07:13,460 --> 00:07:15,470 Na kisha nyekundu, mimi nina pia kwenda kusema 0. 124 00:07:15,470 --> 00:07:19,160 Hivyo basi, kwamba anatoa mimi pixel ya kijani. 125 00:07:19,160 --> 00:07:23,030 >> Next, nini kama nataka kuangalia thamani ya kitu? 126 00:07:23,030 --> 00:07:27,250 Mimi naweza kuwa na kitu ambacho hundi kama rgbtBlue mara tatu ya thamani ya ni 127 00:07:27,250 --> 00:07:31,080 ff na kisha magazeti, "Mimi nina hisia blue! ", kama matokeo. 128 00:07:31,080 --> 00:07:35,640 Sasa, haimaanishi kwamba pixel ni rangi ya bluu, sawa? 129 00:07:35,640 --> 00:07:40,060 Kwa sababu maadili pixel ya kijani na nyekundu inaweza pia kuwa na mashirika yasiyo ya 0 maadili. 130 00:07:40,060 --> 00:07:43,470 Yote hii ina maana, na yote hii ni kuangalia kwa ni 131 00:07:43,470 --> 00:07:45,610 kwa full rangi ya bluu. 132 00:07:45,610 --> 00:07:50,050 Lakini saizi wote wanaweza pia kuwa na sehemu maadili rangi, kama hii 133 00:07:50,050 --> 00:07:52,180 mfano ijayo hapa. 134 00:07:52,180 --> 00:07:55,400 >> Ni vigumu kidogo kuona nini picha hii ni sasa. 135 00:07:55,400 --> 00:08:00,320 Hii inaonekana kidogo zaidi kama clue.bmp kwamba utasikia kutolewa. 136 00:08:00,320 --> 00:08:03,600 Sasa, kimwili, unaweza kutatua, kwa sababu kuna mengi ya nyekundu, na 137 00:08:03,600 --> 00:08:07,040 kufanya up screen nyekundu na mfano ili kwamba rangi nyingine inaweza kuonekana. 138 00:08:07,040 --> 00:08:10,968 Hivyo ni jinsi gani sisi kuiga na c? 139 00:08:10,968 --> 00:08:15,640 Naam, tupate kuondoa nyekundu sanamu kabisa. 140 00:08:15,640 --> 00:08:21,870 Na kufanya hivyo kwamba tunatarajia kuweka kila pixel nyekundu thamani kwa 0. 141 00:08:21,870 --> 00:08:25,020 Na hivyo picha bila kuangalia kidogo kidogo kama hii, ambapo hatuna nyekundu 142 00:08:25,020 --> 00:08:26,300 wowote. 143 00:08:26,300 --> 00:08:29,390 >> Tunaweza kuona siri ujumbe a kidogo zaidi wazi sasa. 144 00:08:29,390 --> 00:08:31,730 Ni uso mwingine smiley. 145 00:08:31,730 --> 00:08:33,870 Au labda tunaweza kutumia njia nyingine. 146 00:08:33,870 --> 00:08:36,480 Labda, tunaweza kutambua yote ya saizi nyekundu - 147 00:08:36,480 --> 00:08:41,100 yaani, ya saizi na 0 bluu, 0 kijani, na 0 nyekundu - 148 00:08:41,100 --> 00:08:43,169 na mabadiliko ya wale nyeupe. 149 00:08:43,169 --> 00:08:45,470 Na mfano wetu ili kuangalia kitu kama hiki. 150 00:08:45,470 --> 00:08:48,250 kidogo rahisi kuona. 151 00:08:48,250 --> 00:08:51,170 >> Kuna kura ya njia nyingine ya kubaini ujumbe wa siri kama vile, 152 00:08:51,170 --> 00:08:53,730 kushughulika na kudanganywa rangi. 153 00:08:53,730 --> 00:08:57,050 Labda unaweza kutumia moja ya njia kwamba mimi zilizotajwa hapo juu. 154 00:08:57,050 --> 00:08:59,600 Na kuongeza, unaweza kutaka kuimarisha baadhi ya rangi 155 00:08:59,600 --> 00:09:02,620 na kuleta wale nje. 156 00:09:02,620 --> 00:09:06,190 >> Hivyo sasa kwamba tumekuwa iliyopita pixel rangi, karibu sisi tu haja ya kuwaandikia 157 00:09:06,190 --> 00:09:08,500 katika scanline, pixel kwa pixel. 158 00:09:08,500 --> 00:09:11,860 Na tena, utasikia wanataka kuangalia nyuma kwa copy.c, kama una si kunakiliwa 159 00:09:11,860 --> 00:09:18,170 tayari, na kuangalia fwrite kazi, ambayo inachukua data, pointer 160 00:09:18,170 --> 00:09:23,230 kwa struct ambayo ina ka kwamba wewe ni kusoma kutoka, ukubwa wa 161 00:09:23,230 --> 00:09:26,610 vitu, idadi ya vitu, na kisha outptr - 162 00:09:26,610 --> 00:09:29,450 marudio ya files hizo. 163 00:09:29,450 --> 00:09:34,010 >> Baada ya kuandika katika saizi, itabidi pia kuwa na kuandika katika padding. 164 00:09:34,010 --> 00:09:34,970 Padding ni nini? 165 00:09:34,970 --> 00:09:38,670 Naam, kila pixel rgbt ni ka tatu kwa muda mrefu. 166 00:09:38,670 --> 00:09:43,670 Lakini, scanline kwa bitmap picha ina kuwa nyingi ya ka nne. 167 00:09:43,670 --> 00:09:47,650 Na kama idadi ya saizi ni si mbalimbali ya nne, basi tunahitaji kuongeza 168 00:09:47,650 --> 00:09:48,880 padding hii. 169 00:09:48,880 --> 00:09:51,420 Padding ni tu kuwakilishwa na sekunde 0. 170 00:09:51,420 --> 00:09:54,380 Hivyo, jinsi gani sisi kuandika, au kusoma hii? 171 00:09:54,380 --> 00:09:59,280 Naam, zinageuka kuwa huwezi kweli fread padding, lakini unaweza 172 00:09:59,280 --> 00:10:00,970 mahesabu yake. 173 00:10:00,970 --> 00:10:04,400 >> Katika kesi hiyo, habari na uamuzi na upana huo, hivyo 174 00:10:04,400 --> 00:10:05,910 padding ni sawa. 175 00:10:05,910 --> 00:10:09,370 Na padding, kama utaona katika copy.c, ni mahesabu 176 00:10:09,370 --> 00:10:11,790 na chini ya formula - 177 00:10:11,790 --> 00:10:16,690 mara bi.biWidth sizeof (RGBTRIPLE) mapenzi kutupa jinsi ka wengi bmp 178 00:10:16,690 --> 00:10:18,280 ina katika kila mstari. 179 00:10:18,280 --> 00:10:21,890 Kutoka huko, modulos na vipunguzi na 4 unaweza mahesabu ya jinsi ya 180 00:10:21,890 --> 00:10:25,610 ka wengi lazima aliongeza ili nyingi ya ka juu ya 181 00:10:25,610 --> 00:10:27,250 kila mstari ni nne. 182 00:10:27,250 --> 00:10:30,490 >> Sasa kwa kuwa tuna formula kwa kiasi gani padding, tunahitaji sasa 183 00:10:30,490 --> 00:10:31,610 tunaweza kuandika. 184 00:10:31,610 --> 00:10:34,080 Sasa, nilivyoeleza hapo awali, padding ni sekunde 0 tu. 185 00:10:34,080 --> 00:10:39,730 Hivyo katika kesi hiyo, sisi ni kuweka tu char, katika kesi hii 0, ndani ya yetu 186 00:10:39,730 --> 00:10:41,710 outptr - outfile yetu. 187 00:10:41,710 --> 00:10:47,530 Hivyo kwamba wanaweza tu kuwa fputc 0, comma outptr. 188 00:10:47,530 --> 00:10:52,400 >> Hivyo, wakati tumekuwa kusoma katika yetu faili, faili I / O ina naendelea wimbo wa wetu 189 00:10:52,400 --> 00:10:57,440 nafasi katika files wale walio na kitu aitwaye file nafasi kiashiria. 190 00:10:57,440 --> 00:10:59,350 Fikiria kama mshale. 191 00:10:59,350 --> 00:11:03,550 Kimsingi, ni maendeleo ya kila wakati kwamba sisi fread, lakini tuna 192 00:11:03,550 --> 00:11:05,671 kudhibiti juu yake, pia. 193 00:11:05,671 --> 00:11:11,030 >> Hoja file nafasi kiashiria, unaweza kutumia kazi fseek. 194 00:11:11,030 --> 00:11:15,600 Ambapo inptr inawakilisha file pointer kwamba wewe ni kutafuta katika, 195 00:11:15,600 --> 00:11:20,370 kiasi ni idadi ya ka kwamba wanataka hoja ya mshale, na kisha kutoka 196 00:11:20,370 --> 00:11:23,470 inahusiana na kiini kutoka ambapo mshale ni. 197 00:11:23,470 --> 00:11:26,770 Kama kupita katika SEEK_CUR, kwamba inawakilisha sasa 198 00:11:26,770 --> 00:11:28,100 nafasi katika faili. 199 00:11:28,100 --> 00:11:31,020 Au unaweza kutumia baadhi vigezo vingine. 200 00:11:31,020 --> 00:11:35,400 Kwa hiyo, sisi kutaka kutumia fseek ruka juu ya padding ya faili katika. 201 00:11:35,400 --> 00:11:39,410 Na tena, kama wewe ni kukwama, kuna mfano wa kwamba katika copy.c. 202 00:11:39,410 --> 00:11:43,260 >> Hivyo sasa tumekuwa kufunguliwa faili, kidokezo, na uamuzi. 203 00:11:43,260 --> 00:11:46,450 Tumekuwa updated header info kwa uamuzi wetu, kwa sababu kila 204 00:11:46,450 --> 00:11:48,730 bitmap mahitaji ya header. 205 00:11:48,730 --> 00:11:52,280 Tumekuwa kisha kusoma katika fununu ya scanline, pixel kwa pixel, kubadilisha 206 00:11:52,280 --> 00:11:55,210 kila rangi kama ni lazima, na kuandika hayo katika 207 00:11:55,210 --> 00:11:57,340 uamuzi, pixel kwa pixel. 208 00:11:57,340 --> 00:12:01,550 Mara baada ya kufungua uamuzi, unaweza kuona ambao culprit, au nini siri 209 00:12:01,550 --> 00:12:02,850 ujumbe ni. 210 00:12:02,850 --> 00:12:05,550 Jina langu ni Zamyla, na hii ilikuwa whodunit. 211 00:12:05,550 --> 00:12:12,864