[CHWARAE CERDDORIAETH] ZAMYLA Chan: Yr oedd Miss Scarlett gyda'r canhwyllbren. Whodunit? Wel, rydym yn mynd i gael gwybod. Yn y gêm fwrdd Cliw, efallai eich bod yn cael delwedd coch corfforol. A dyna ddelwedd yn goch iawn ac smotiog, a bod eich gwaith yw dangos y neges gudd. Ac fel arfer rydych yn eu darparu gyda goch chwyddwydr, neu sgrîn coch i yn datgelu bod neges gudd. Wel, rydym yn mynd i ddynwared hynny. Yn whodunit, rydych yn rhoi delwedd bitmap sy'n edrych smotiog a choch iawn, ac yna rhedeg y rhaglen whodunit i ddatgelu neges gudd. Felly, gadewch i ni dorri hyn yn gamau. Yn gyntaf, yr ydych am i agor y ffeil - y cliw eich bod wedi ei roi. Ac yna hefyd yn creu ffeil didfap rheithfarn. Yna ydych am i ddiweddaru'r didfap header gwybodaeth ar gyfer yr outfile rheithfarn. Mwy am hynny yn nes ymlaen. Ac yna rydych chi'n mynd i ddarllen i mewn i'r cliw, scanline, picsel gan picsel, newid y lliwiau pixel fel angen, ac ysgrifennu hynny yn y dyfarniad - picsel gan picsel i mewn i'r scanline rheithfarn. Sut ydym yn dechrau mynd o gwmpas hyn? Wel, yn ffodus, rydym wedi copy.c yn y cod dosbarthu. Ac mae hyn yn mynd i brofi eithaf defnyddiol i ni. Copy.c yn agor ffeil, darllen yn y header infile, ac yna yn diweddaru'r header outfile yn. Ac yna mae'n darllen bob picsel yn y scanline, picsel gan picsel, ac yna yn ysgrifennu bod picsel i mewn i'r outfile. Felly, gallai eich cam cyntaf fydd rhedeg y canlynol gorchymyn yn y derfynell - cp whodunit.c copy.c. Bydd hyn yn creu copi o copy.c a enwir whodunit.c. Felly, ein cam cyntaf i agor y ffeil, wel, mae union replica o hynny yn copy.c. Felly, byddaf yn eich gadael i edrych ar hynny. Yr hyn yr ydym yn delio â hwy yn PSET hwn yn cael ei ffeil gallaf / O, yn y bôn yn cymryd ffeil, darllen, ysgrifennu, eu golygu. Sut ydych chi yn gyntaf agor ffeil? Wel, yr ydych yn mynd i ddatgan ffeil pwyntydd, ac yna byddwch yn ffonio y fopen swyddogaeth. Pasio yn y llwybr, neu enw hwnnw ffeilio, ac yna y modd yr ydych am i agor y ffeil i mewn Bydd Pasio mewn r agor foo.bmp ar gyfer darllen. Tra fopen gyda pasio mewn w yn bar.bmp agored, ar gyfer ysgrifennu y ffeil ac mewn gwirionedd yn golygu ei. Felly, yn awr ein bod wedi agor y ffeil, bydd ein cam nesaf yw diweddaru'r wybodaeth pennawd gyfer y outfile. Beth yw wybodaeth pennawd? Wel, yn gyntaf mae angen i ni wybod beth yw didfap ydyw. Mae didfap yn unig yw syml trefniant o bytes. Ac maent yn datgan yn y ffeil hon yma, bmp.h, gyda chriw o gwybodaeth am beth yw bitmap yn cael ei wneud mewn gwirionedd y tu allan i. Ond yr hyn yr ydym yn wir yn poeni am y header ffeil didfap, dde yma, a pennawd gwybodaeth didfap, dros yma. Mae'r pennawd yn cynnwys un neu ddau o newidynnau a fydd yn ddefnyddiol iawn. Mae biSizeImage, sef y cyfanswm maint y ddelwedd mewn bytes. Ac mae hyn yn cynnwys picsel a padin. Padin yn bwysig iawn, ond byddwn yn mynd at hynny yn ddiweddarach. BiWidth cynrychioli lled y delwedd mewn picseli heb y padin. BiHeight wedyn hefyd uchder o'r ddelwedd mewn picseli. Ac yna y BITMAPFILEHEADER a'r BITMAPINFOHEADER, fel y soniais yn gynharach, y rhai yn cael eu cynrychioli fel structs. Felly, ni allwch gael mynediad i'r pennawd ffeil ei hun, ond byddwch yn dymuno mynd i'r newidynnau hynny y tu mewn. OK. Felly, sut rydym yn diweddaru'r wybodaeth pennawd? Wel, yn gyntaf mae'n rhaid i ni weld a ydym Mae angen i newid unrhyw wybodaeth gan y infile, y cliw, i'r outfile, y dyfarniad. A yw unrhyw beth sy'n newid yn yr achos hwn? Wel, nid mewn gwirionedd, oherwydd ein bod yn mynd i gael dim ond newid y lliwiau. Nid ydym yn mynd i fod yn newid y ffeil maint, maint delwedd, y lled, neu uchder. Felly, rydych chi'n iawn ar hyn o bryd gan dim ond copïo pob picsel. OK. Felly nawr gadewch i ni edrych ar sut yr ydym mewn gwirionedd yn gallu darllen pob picsel o'r ffeil. Ffeil arall I / O swyddogaeth yn dod i chwarae - fread. Mae'n cynnwys pwyntydd i'r strwythur a fydd yn cynnwys y bytes sy'n ydych yn darllen. Felly, rydych yn darllen i mewn i hynny. Ac yna byddwch yn mynd heibio mewn maint, sydd yn maint pob elfen yr ydych eisiau darllen. Yma, mae'r sizeof swyddogaeth yn dod mewn 'n hylaw. Yna byddwch yn pasio yn nifer, a oedd yn yn cynrychioli nifer yr elfennau o maint i ddarllen. Ac yna yn olaf, inptr, sy'n y pwyntydd ffeil eich bod yn mynd i ddarllen o. Felly yr holl elfennau hynny yn y tu mewn inptr ac maent yn mynd i data. Gadewch i ni edrych ar ychydig o esiampl. Os ydw i eisiau darllen yn ddata dau gi, wel, yr wyf yn ei wneud yn un o ddwy ffordd. Gallaf naill ai darllen dau wrthrych o faint ci o fy inptr, neu a allaf ddarllen mewn un wrthwynebu y maint o ddau gi. Felly, byddwch yn gweld bod gan ddibynnu ar y ffordd eich bod yn trefnu maint a nifer, yr ydych yn gallu darllen yn yr un nifer o bytes. Felly nawr, gadewch i ni newid y lliw picsel gan fod angen. Os ydych yn edrych ar bmp.h eto, yna byddwch yn gweld bod ar y gwaelod RGBTRIPLEs yn strwythur arall, lle maent yn cael eu cynnwys o dri bytes. Un, rgbtBlue, rgbtGreen, a rgbtRed. Felly, pob un o'r rhain yn cynrychioli'r swm o sidan glas, y swm o wyrdd, ac mae'r faint o goch y tu mewn picsel hwn, lle pob swm yn cael ei gynrychioli gan rhif hecsadegol. Felly bydd ff0000 fod yn lliw glas, oherwydd ei fod yn mynd o las, i wyrdd, i goch. Ac yna bydd yr holl f fod yn wyn. Gadewch i ni edrych ar smiley.bmp, a oedd yn sydd gennych yn eich cod dosbarthu. Os byddwch yn agor mewn dim ond delwedd gwyliwr, yna wnewch chi helpu ond yn gweld gwenu goch. Ond cymryd plymio ddyfnach i mewn, rydym yn annhymerus ' gweld bod y strwythur ohono yn unig picsel. Mae gennym picsel gwyn, ac yna picsel coch. Y gwyn, FFFFFF, ac yna pob un o'r picsel coch Rwyf wedi lliw ar eich rhan yma, a byddwch yn gweld eu bod yn 0000ff. Sero glas, gwyrdd sero, a choch llawn. Ac ers gwenu yn wyth picsel o led, Nid oes gennym unrhyw padin. Mae pob hawl. Felly, pe bawn yn neilltuo gwahanol werthoedd i RGBTRIPLE ac roeddwn i eisiau wneud yn wyrdd, yna beth fyddwn i'n ei wneud yw Byddwn yn datgan RGBTRIPLE, a enwyd triphlyg, ac yna i gael mynediad at bob beit o fewn y strwythur yr wyf yn fyddai'n defnyddio'r gweithredwr dot. Felly triple.rgbtBlue, gallaf aseinio hynny i 0. Green Gallaf neilltuo i llawn - unrhyw rhif, mewn gwirionedd, rhwng 0 a ff. Ac yna goch, yr wyf hefyd i'n mynd i ddweud 0. Felly, yna mae hynny'n rhoi picsel gwyrdd mi. Nesaf, beth os ydw i eisiau i wirio gwerth o rywbeth? Gallai gen i rywbeth sy'n gwirio a yw gwerth rgbtBlue yw'r triphlyg yn ff ac yna print, "Rydw i'n teimlo'n glas! ", o ganlyniad. Nawr, nid yw hynny'n golygu o reidrwydd bod y picsel yn las, dde? Gan fod gwerthoedd gwyrdd a choch y picsel yn gallai hefyd gael nad ydynt yn 0 gwerthoedd. Cyfan y mae hyn yn ei olygu, a hynny i gyd mae hyn yn gwirio amdano yw ar gyfer lliw glas llawn. Ond gallai pob picsel hefyd rhannol gwerthoedd lliw, fel hyn enghraifft nesaf yma. Mae'n ychydig yn fwy anodd i weld pa ddelwedd hon yn awr. Mae hyn yn edrych ychydig yn fwy fel y clue.bmp y byddwch yn ei roi. Yn awr, yn gorfforol, efallai y byddwch yn datrys hyn, oherwydd mae llawer o goch, gan dal i fyny sgrin coch i'r ddelwedd, felly y gall y lliwiau eraill yn ymddangos. Felly, sut rydym yn dynwared hyn gyda c? Wel, efallai y byddwn yn symud yr holl coch o'r ddelwedd yn gyfan gwbl. Ac felly i wneud hynny byddwn yn gosod pob gwerth coch picsel i 0. Ac felly byddai y ddelwedd yn edrych ychydig yn ychydig fel hwn, lle nad oes gennym coch o gwbl. Gallwn weld y neges cudd a ychydig bach yn fwy clir yn awr. Mae'n wyneb sy'n gwenu arall. Neu efallai gallem ddefnyddio dull arall. Efallai, gallem nodi pob un o'r picsel coch - hynny yw, pob un o'r picsel gyda 0 glas, 0 gwyrdd, a 0 goch - a newid hynny i gwyn. Ac efallai ein delwedd yn edrych rhywbeth fel hyn. Ychydig bach yn haws eu gweld. Mae llawer o ffyrdd eraill i ddatgelu y neges gyfrinach hefyd, ymdrin â'r trin lliw. Efallai y gallech ddefnyddio un o'r dulliau y soniais amdanynt uchod. Ac yn ogystal, efallai y byddwch am i wella rhai lliwiau a ti eu. Felly, yn awr ein bod wedi newid y picsel lliw, nesaf mae'n rhaid i ni eu hysgrifennu i mewn i'r scanline, picsel gan picsel. Ac unwaith eto, byddwch am edrych yn ôl i copy.c, os nad ydych wedi copïo mae eisoes, ac edrych ar y fwrite swyddogaeth, sy'n cymryd data, pwyntydd at y strwythur sy'n cynnwys y bytes eich bod yn darllen o, maint y yr eitemau, mae nifer o eitemau, ac yna y outptr - cyrchfan y ffeiliau hynny. Ar ôl i chi ysgrifennu yn y picsel, wnewch chi helpu rhaid hefyd i ysgrifennu yn y padin. Beth yw padin? Wel, pob picsel rgbt yw tri bytes o hyd. Ond, mae'r scanline am ddelwedd didfap rhaid iddo fod yn lluosrif o bedwar bytes. Ac os nad yw nifer o bicseli yn lluosog o bedwar, yna mae angen i ychwanegu padin hwn. Padin yn unig a gynrychiolir gan 0s. Felly, sut yr ydym yn ysgrifennu, neu ddarllen hwn? Wel, mae'n troi allan nad ydych yn gallu padin fread mewn gwirionedd, ond gallwch gyfrifo. Yn yr achos hwn, y cliw a'r dyfarniad cael yr un lled, felly mae'r padin yr un fath. Ac mae'r padin, fel y byddwch yn gweld yn copy.c, yn cael ei gyfrifo â'r fformiwla isod - sizeof Amseroedd bi.biWidth (RGBTRIPLE) yn rhoi faint o bytes y bmp ni Mae ym mhob rhes. Oddi yno, mae'r modulos a thynnu gyda 4 yn gallu cyfrifo sut Rhaid nifer o bytes cael eu hychwanegu fel bod y lluosrif o bytes ar pob rhes yw pedwar. Nawr bod gennym y fformiwla ar gyfer faint o padin ei angen arnom, yn awr gallwn ei ysgrifennu. Yn awr, yr wyf yn crybwyll o'r blaen, padin yn unig 0s. Felly, yn yr achos hwnnw, rydym yn dim ond rhoi golosg, yn yr achos hwn 0, yn ein outptr - ein outfile. Felly, gall fod ychydig yn fputc 0, outptr coma. Felly, er ein bod wedi bod yn darllen i mewn i'n ffeil, ffeil I / O wedi cadw golwg ar ein sefyllfa mewn ffeiliau rhai sydd â rhywbeth Gelwir y dangosydd sefyllfa ffeil. Meddyliwch am y peth fel cyrchwr. Yn y bôn, mae'n datblygiadau bob tro ein bod yn fread, ond mae gennym reoli drosto, hefyd. Er mwyn symud y dangosydd sefyllfa ffeil, gallwch ddefnyddio'r fseek swyddogaeth. Lle mae'r inptr yn cynrychioli y ffeil pwyntydd eich bod yn chwilio am i mewn, y swm hwn yn y nifer o bytes eich bod yn eisiau symud y cyrchwr, ac yna o yn ymwneud â'r pwynt cyfeirio o ble mae eich cyrchwr. Os byddwch yn pasio yn SEEK_CUR, bod cynrychioli'r ar hyn o bryd safle yn y ffeil. Neu gallwch ddefnyddio rhai paramedrau eraill. Felly, efallai y byddwn am ddefnyddio fseek i sgip dros y padin y ffeil yn. Ac eto, os ydych yn sownd, mae enghraifft o hynny yn copy.c. Felly nawr rydym wedi agor y ffeil, y cliw, a'r dyfarniad. Rydym wedi diweddaru y wybodaeth pennawd ar gyfer ein dyfarniad, oherwydd y mae pob angen header didfap. Hynny rydym wedi darllen i mewn i'r cliw yn scanline, picsel gan picsel, newid bob lliw yn ôl yr angen, a ysgrifennu hynny yn y dyfarniad, picsel gan picsel. Unwaith y byddwch yn agor dyfarniad, gallwch weld pwy y troseddwr, neu beth y gyfrinach neges yn. Fy enw i yw Zamyla, ac roedd hyn yn whodunit.