[Powered by Google Translate] [Walkthrough - Vandamál Set 4] [Zamyla Chan - Harvard University] [Þetta er CS50. - CS50.TV] Allt í lagi. Halló, allir, og velkomin til walkthrough 4. Í dag pset okkar er réttar. Réttar er mjög skemmtilegur pset sem felur að takast á við bitmap skrár að uppgötva hver framið glæp. Þá ætlum við að búa sumir punktamynd skrá, þá erum við líka að fara að takast á við mjög skemmtilegur hluti heitir batna, þar sem við erum í grundvallaratriðum hönd minniskort sem einhver hefur óvart eytt öllum skrám þeirra, og við erum beðin um að endurheimta þær skrár. En fyrst, áður en við komum inn í pset, ég bara til hamingju allir. Við erum um á miðju þessu námskeiði. Quiz 0 er á bak við okkur, og við erum á pset4, svo í raun, erum við á miðri leið. Við höfum komið langa leið ef þú lítur til baka psets þinn, pset0 og pset1, svo hamingju sjálfur um það, og við erum að fara að fá inn í sumir raunverulega skemmtilegt. Svo verkfærakista okkar fyrir þessa pset, aftur, í stað þess að keyra sudo Yum-Y uppfærslu, við getum bara hlaupa update50 ef þú ert á útgáfu 17,3 og yfir í tækið. Svo vera viss um að hlaupa update50 - það er mun auðveldara, nokkur minna stafir - að ganga úr skugga um að þú ert á nýjustu útgáfu af tækinu. Sérstaklega er mikilvægt að update50 þegar við byrjum að nota CS50 skefjum. Svo tryggja að þú gerir það. Í öllum köflum í þessum pset, við erum að fara að takast á við inntak skrá og framleiðsla, skrá I / O. Við ætlum að vera að fara yfir fullt af verkefnum sem eiga við fylki benda á skrár og svoleiðis, þannig að við viljum tryggja að við erum mjög kunnuglegt og þægilegt að takast á við hvernig á að inntak og úttak í skrá. Í dreifingu kóða fyrir þetta pset er skrá sem heitir copy.c, og það er það sem við erum að fara að finna er að fara að vera mjög gagnlegt að okkur vegna þess að við erum að fara að enda í raun að afrita copy.c skrá og bara að breyta henni aðeins að vera fær um að ná fyrstu 2 hluta af vandamálinu setja. Og svo þá sem ég nefndi áður, við erum að fást við bitmaps sem og JPEG. Svo í raun að skilja uppbyggingu á því hvernig þær skrár eru skipulögð, hvernig við getum raunverulega þýða 0s og 1s í structs og það sem við getum í raun og veru skilja og túlka og breyta, sem mun vera mjög mikilvægt, svo að fara inn í JPEG og bitmap skrár og skilja uppbyggingu þeirra. Pset4, eins og venjulega, byrjar með hluta af spurningum. Þeir munu fjalla um skrá I / O og þú fá vanur því. Þá er hluti 1 Whodunit, þar sem þú ert að fá punktamynd skrá sem útlit góður af eins og rauðum punktum allt. Og þá er í rauninni það sem við erum að fara að gera að taka þessa skrá og bara breytt því lítillega í útgáfu sem við getum lesið. Í meginatriðum, þegar við erum að klára, við munum hafa sama skrá, nema að við munum vera fær um að sjá falinn skilaboð falin af öllum þeim rauða punkta. Þá er Resize forrit að fá skrá og þá gefið nafnið á skránni sem það framleiðsla og svo gefið númer eins og heilbrigður, mun reyndar búa að punktamynd af því heiltölu gildi. Þá loksins, höfum við endurheimta pset. Við erum fá minniskort og þá þarf að endurheimta allar myndirnar sem hafa óvart verið eytt, en, eins og við munum læra, í raun ekki eytt og fjarlægt af skrá; við konar bara glatað þar sem þeir voru á skrá, en við erum að fara að batna það. Frábært. Svo fara í skrá I / O sérstaklega, þetta eru allt listi yfir aðgerðir sem þú munt nota. Þú hefur þegar séð smá grunnatriði fopen, fread og fwrite, en við erum að fara að horfa lengra í sumum skrá I / O aðgerðir eins fputc, þar sem þú skrifar bara einn staf í einu, til fseek, þar sem þú svona færa stöðu skrá vísir fram og aftur á bak, og þá nokkrum öðrum. En við förum inn í það svolítið síðar á pset. Svo fyrst, bara til að komast inn í skrá I / O áður en við förum inn í pset, til að opna skrá, til dæmis, hvað þú þarft að gera er í raun að stilla músina til að skrá. Þannig að við höfum * FILE músina. Í þessu tilfelli, ég kalla það í músina því það er að fara að vera INFILE minn. Og svo að ég ætla að nota virka fopen og síðan nafn á skrá og þá stillingu sem ég ætla að takast á við skrá. Svo er það "R" í þessu tilfelli að lesa, "W" til að skrifa, og svo "a" til að auka við. Til dæmis, þegar þú ert að takast á við INFILE og allt sem þú vilt gera er að lesa bita og bæti geymd þar, þá þú ert líklega að fara til að vilja nota "r" eins og stillingu. Þegar þú vilt í raun og veru að skrifa, svona gera nýja skrá þá er það sem við erum að fara að gera við erum að fara að opna nýja skrá og nota "W" ham til að skrifa. Svo þegar þú ert í raun að lesa inn skrár, uppbygging er sem hér segir. Fyrst þú setur bendilinn á strúktúr sem mun innihalda bæti sem þú ert að lesa. Svo það er að fara til vera the endir staðsetningu bæti sem þú ert að lesa. Þú ert þá að fara að benda á stærð, eins og í rauninni hversu mörg bæti program hefur til að lesa inn á skrá, stærð grundvallaratriðum er einn þáttur, og þá þú ert að fara að tilgreina hversu margir þættir sem þú vilt lesa. Og þá að lokum, þú þarft að vita hvar þú ert að lesa úr, þannig að er að fara að vera í músina þína. I lit-dulmáli þessa því fread er einnig mjög svipað fwrite, nema þú vilt vera viss um að þú notir rétt röð, ganga úr skugga um að þú ert í raun að skrifa eða lesa frá hægri skrá. Þá eins og áður, ef við höfum stærð frumefni eins og heilbrigður eins og the tala af þáttum, þá getum við spilað hérna svolítið. Segja að ég er með hund strúktúr og svo þá vil ég að lesa tvo hunda í einu. Það sem ég gæti gert er að segja að stærð einn þáttur er að fara að vera á stærð við einn hund og ég ætla að í raun að lesa tvær þeirra. Einnig það sem ég gæti gert er að segja að ég ætla bara að fara að lesa einn þáttur og einn þáttur er að fara að vera á stærð við tvo hunda. Svo er það hliðstætt því hvernig þú getur konar leika í kring með stærð og fjölda eftir því hvað er meira innsæi fyrir þig. Allt í lagi. Svo nú erum við að fá til að skrifa skrár. Þegar þú vilt að skrifa skrána, fyrsta rifrildi er í raun þar sem þú ert að lesa úr. Svo er það í grundvallaratriðum þau gögn sem þú ert að fara að skrifa í skrá, sem er út bendill í lokin. Svo þegar þú ert að takast á við pset, ganga úr skugga um að þú færð ekki rugla saman. Kannski hafa skilgreiningar hlið við hlið. Þú getur rífa skilgreiningar upp í handbókinni með því að slá mann og þá fwrite, til dæmis, í flugstöðinni, eða þú getur átt til baka til þessa mynd og ganga úr skugga um að þú ert að nota rétta. Svo aftur, fwrite, þegar þú ert með skrá sem þú vilt að skrifa inn, það er að fara til vera the síðastur rök og það er að fara til vera a músina til að skrá. Svo þá er það hvernig við takast á við að skrifa kannski nokkrar bæti í einu, en segjum að þú vilt bara að skrifa bara einn staf. Eins og við munum sjá síðar í þessu dæmi, á bitmaps við verðum að nota það. Það er þegar við getum notað fputc, í raun bara að setja einn staf í einu, Chr, í skrá músina, og það er út músina okkar þar. Svo þegar við leitum eða skrifa í skrá, skráin er að halda utan um hvar við erum. Svo það er eins konar bendilinn, stöðu skrá vísinn. Og svo þegar við skrifa eða lesa aftur inn í skrá, skráin man í raun þar sem það er, og svo heldur það frá þar sem bendillinn er. Þetta getur verið gagnlegt þegar þú vilt segja, lesa í ákveðna upphæð til að gera eitthvað og þá lesa í eftirfarandi upphæð, en stundum við gætum vilja til að fara til baka eða í raun að byrja frá ákveðnum viðmiðunargildi. Svo þá fseek virka, hvað það gerir er að leyfa okkur að færa bendilinn í ákveðinni skrá ákveðinn fjölda bæti. Og hvað þá að við þurfum að gera er að tilgreina þar sem viðmiðunargildi er. Svo annað hvort það færist áfram eða afturábak frá þar sem bendillinn eins og er, eða við getum valið að það ætti bara að fara í frá upphafi skrárinnar eða í lok skrá. Og svo þú geta fara framhjá í neikvætt eða jákvætt gildi að upphæð, og það mun konar færa bendilinn annaðhvort fram eða aftur. Áður en við komum inn í öðrum psets, einhverjar spurningar um skrá I / O? Allt í lagi. Eins og við komum inn fleiri dæmi, ekki hika við að stoppa mig fyrir spurningar. Svo í Whodunit, þú ert afhent punktamynd skrá svipað þessu rauða á mynd, og það lítur svona út - fullt af rauðum punktum - og þú í raun ekki vita hvað er skrifað. Ef þú squint, þú mega vera fær um að sjá smá bláleit lit inni í miðju. Í meginatriðum, það er þar sem textinn er geymt. Það var morð sem gerðist, og við þurfum að finna út hver gerði það. Til að gera það þurfum við að konar breyta þessari mynd í læsileg sniði. Ef þú krakkar alltaf upp þetta, stundum væri lítið pökkum þar sem þú vilt hafa stækkunargler með rauðu myndinni. Einhver? Já. Svo þú vildi vera hönd eitthvað eins og þetta, myndir þú hafa a stækkunargler með rauða filmu yfir það, myndir þú setja það á myndinni, og þú vildi vera fær til sjá the skilaboð falin þar. Við höfum ekki stækkunargler með rauðu myndinni, svo í stað þess að við erum að fara að eins konar skapa okkar eigin í pset. Og þannig að notandi er að fara að inntak whodunit, þá hugmynd,. BMP, þannig það er INFILE, það er rauður punktur skilaboð og þeir eru að segja verdict.bmp er að fara að vera OUTFILE okkar. Svo það er að fara að búa til nýja bitamyndina svipað vísbendingu einn nema í læsileg sniði þar sem við getum séð falinn skilaboð. Þar sem við erum að fara að takast á við að breyta og notfæra bitmaps af einhverju tagi, við erum að fara að konar kafa í inn í byggingu þessara bitmap skrá. Við fórum yfir þessum smá í fyrirlestri, en við skulum líta inn í þá meira. Bitmaps eru í raun bara fyrirkomulag bæti þar sem við höfum tilgreint sem bæti meina það. Svo hér er góður af eins og a kort af bitamyndina segja að það byrjar með einhverjum haus skrár, byrjar með einhverjum upplýsingum þar. Þú sérð að á um bæti númer 14 stærð er ætlað að bitamyndina, og það heldur áfram. En það sem við erum í raun áhuga á að hér er að byrja um bæti númer 54. Við höfum þessar RGB triples. Hvað það er að fara að gera er að vera í raun dílar, lit gildi. Allt fyrir ofan það á hausinn er einhverjar upplýsingar samsvarar stærð myndarinnar, breidd á myndinni, og hæð. Þegar við förum inn padding síðar, munum við sjá hverju stærð af myndinni gæti verið öðruvísi en breidd eða hæð. Svo til að tákna þessar - þessar punktamynd myndir eru röð af bytes - hvað við gætum gert er að segja allt í lagi, ég ætla að muna að á vísitölu 14, það er þar sem stærð er, til dæmis, en í staðinn það sem við erum að fara að gera til að gera þetta auðveldara er þjappa það í strúktúr. Og svo við höfum tvo structs gert fyrir okkur, fyrir BITMAPFILEHEADER og BITMAPINFOHEADER, og svo þegar við lesið í þeirri skrá, við vanræksla það er að fara að vera að fara í röð, og svo til að það er líka að fara að fylla í inn breytur eins biWidth og biSize. Og loks, er hvert pixla fulltrúa af þremur bæti. Sú fyrsta er sú upphæð sem blár í pixla, annar er the magn af grænu, og að lokum, the magn af rauðu, þar sem 0 er í raun ekki blár eða ekki grænn eða ekki rautt og þá er FF hámarks gildi. Þetta eru sextánskur gildi. Svo ef við höfum ff0000, þá svarar það til hámarks magn af bláum og þá ekki grænn og ekki rautt, svo þá sem myndi gefa okkur bláa pixla. Síðan ef við höfum öll FF er á borð, þá þýðir það að við höfum hvíta pixla. Þetta er eins konar andstæða við oftast þegar við segjum RGB. Það er í raun að fara BGR. Þannig að ef við skoðum í raun inn í dæmi um bitamyndina - Leyfðu mér að draga einn upp hér. Það er a lítill lítill. Ég zooming í, og við getum séð það Pixelated. Það lítur út eins og blokkir af lit. Þú ert hvít blokkir og þá rautt blokkir. Ef þú spilar í Microsoft Paint, til dæmis væri hægt að gera eitthvað svona því í rauninni bara að mála ákveðin ferninga í ákveðinni röð. Svo er það þetta þýðir að í punktamynd sem hér segir. Hér höfum við fyrstu hvítu punktar, að allir 6 eru er F og svo höfum við rautt dílar, auðkennd með 0000ff. Og svo sýnir röð af bytes sem við höfum hvernig bitamyndina er að fara að horfa. Svo það sem ég hef gert hér er bara skrifað út alla þá bæti og lituð í rauðu þannig að þú getur konar séð, ef þú squint smá, hvernig þess konar sýnir bros andlit. Leiðin sem punktamynd myndir vinna er ég Ímynda það í rauninni sem rist. Og svo sjálfgefið, hver röð rist þarf að vera margfeldi af 4 bæti. Ef við lítum á bitamyndina, þú ert að fylla út í hverju gildi. Til dæmis, þú might hafa a rautt hér, grænt hér, með bláum hér en þú þarft að ganga úr skugga um að myndin er fyllt með margfeldi af fjórum bæti. Svo ef ég vil myndina mína til að vera þrjár blokkir breiður, þá myndi ég að setja tómt gildi í síðasta til að gera það margfeldi af fjórum. Svo myndi ég bæta í eitthvað sem við köllum padding. Ég ætla bara að benda að með x. Nú segjum við viljum mynd sem er 7 punktar langur, til dæmis. Við höfum 1, 2, 3, 4, 5, 6, 7, og allt sem er fyllt með lit. Leiðin sem punktamynd myndir vinna er að við þurfum að 8. Núna höfum við 1, 2, 3, 4, 5, 6, 7. Við þurfum 8 rými fyrir bitamyndina að lesa rétt. Svo það sem við þurfum að gera er að bæta í bara smá padding til að tryggja að öll breidd eru samræmdu og að öll breidd eru margfeldi af 4. Og svo ég fram áður, padding sem x eða a hlykkjóttu línu, en í raun punktamynd myndir padding er auðkenndur með sextánskur 0. Svo það væri einn stafur, 0. Hvað gæti komið sér vel er xxd stjórn. Hvað það gerir er í raun sýnir þér, eins og svipuð því sem ég gerði áður með smiley þegar ég prenta í raun hvað hver litur væri á pixla og þá litur-dulmáli því, þegar þú keyrir xxd með eftirfarandi skipanir, þá mun raun prenta út hvaða litir eru fyrir þá punkta. Það sem þú þarft að gera er hérna ég benda, eins og-S 54 segir að ég ætla að byrja á 54 bæti því áður að muna ef við lítum til baka á kortið af bitmaps, það er allt í haus og svoleiðis. En það sem við raunverulega aðgát óður í er í raun punktar sem benda litinn. Svo með því að bæta í þeim fána,-s 54, þá erum við fær um að sjá lit gildi. Og ekki hafa áhyggjur óður í the flókið fánar og svoleiðis. Í setja vandamál sérstakur færðu leiðbeiningar um hvernig á að nota xxd að birta punkta. Svo ef þú sérð hér, lítur það svona eins og græna kassann, þetta lítill hlutur. Ég hef lit-dulmáli the 00ff00 sem í grundvallaratriðum að segja ekki blátt, fullt af grænu og ekki rautt. Þannig samsvarar það í grænt. Eins og þú sérð hér, sjáum við græna rétthyrningur. Þetta græna rétthyrningur er aðeins 3 pixlar á breidd, svo þá hvað við þurfum að gera að ganga úr skugga um að myndin er margfeldi af 4 breiður er að bæta í auka padding. Og svo þá er það hvernig þú sérð þessa 0s hér. Þetta verður í raun stafað af pset breytt stærð, fyrst og fremst að taka litlu punktamynd og stækka það um 4. Og svo það sem við sjáum er að í raun er þessi mynd 12 pixlar á breidd, en 12 er margfeldi af 4, og svo við í raun sé ekki neina 0s í lok vegna þess að við þurfum ekki að bæta einhverju því það er að fullu padded. Það skiptir ekki hafa allir fleiri herbergi. Allt í lagi. Einhverjar spurningar um padding? Allt í lagi. Cool. Eins og ég nefndi áður, eru bitmaps bara runa af bætum. Og svo er það sem við höfum í stað þess að þurfa að halda utan um nákvæmlega hvaða fjölda bæti samsvarar tilteknu frumefni, reyndar höfum við búið til strúktúr til að tákna það. Svo er það sem við höfum RGBTRIPLE strúktúr. Alltaf þegar þú ert með dæmi um RGB þrefaldur, því þetta er tegund skilgreina struct, þá er hægt að fá aðgang að rgbtBlue breytu, álíka grænt og Red breytur sem gefa til kynna hversu mikið blár, grænn og rauður, sömu röð, hefur þú. Svo ef við höfum bláa breytu sett til 0, græna setja í FF, sem er hæsta gildi sem þú getur haft, og síðan rauðu breyta stillt á 0, þá hvaða litur væri þessi tiltekna RGB þrefaldur tákna? >> [Nemandi] Green. Green. Einmitt. Það er að fara að vera gagnlegt að vita að þegar þú ert dæmi um RGB þrefaldur, þú getur í raun aðgang að magn af lit - blár, grænn og rauður - sérstaklega. Nú þegar við höfum talað um uppbyggingu þess, við skulum taka a líta á the BMP skrá. Þetta eru structs gert fyrir þig. Hér höfum við BITMAPFILEHEADER strúktúr. Sérstaka athygli vekur stærð. Seinna, höfum við upplýsa haus, sem hefur nokkra hluti sem eru áhugaverðar fyrir okkur, þ.e. stærð, breidd og hæð. Eins og við munum fara inn seinna, þegar þú lest inn á skrá, það les sjálfkrafa í því að við höfum sett til að vera sú sama. Svo biSize mun innihalda rétt bæti sem svara ekki raunverulegur stærð myndarinnar. Og svo hérna, loksins, eins og við höfum talað um, höfum við RGBTRIPLE typedef strúktúr. Við höfum rgbtBlue, grænn og rauður í tengslum við það. Frábært. Allt í lagi. Nú þegar við skiljum bitmaps smá, skilja að við höfum skrá haus og upplýsingar haus í tengslum við það og svo eftir það, við höfum áhugavert efni um litum, og þeir litir eru táknaðir með RGBTRIPLE structs, og þeir aftur á móti, hafa þrjú gildi í tengslum við bláa, græna og rauða. Svo nú getum við konar hugsa um batna aðeins. Því miður. Hugsaðu um Whodunit. Þegar við höfum vísbending skrá okkar, þá er það sem við viljum gera að lesa í það pixla með pixla og þá einhvern veginn breyta þessir punktar þannig að við getur framleiðsla það í læsileg sniði. Og svo að framleiðsla það, við erum að fara að skrifa pixla með pixla inn í verdict.bmp skrá. Það er góður af a einhver fjöldi til að gera. Við skiljum það. Svo er það sem við höfum gert við höfum í raun veitt þér með copy.c. Hvað copy.c gerir er bara gerir nákvæmlega afrit af tilteknu punktamynd skrá og framleiðsla það. Svo opnar þetta þegar skrá fyrir þig, les í pixla með pixla, og þá skrifar það inn í framleiðsla skrá. Við skulum taka a líta á það. Þetta er að tryggja rétta notkun, fá filenames hér. Hvað þetta gerir er að það setur inntak skrá til að vera það sem við höfum samþykkt í INFILE hér, sem er annar stjórn-lína rök okkar. Eftirlit til að tryggja að við getum opnað skrána. Eftirlit til að tryggja að við getum búið til nýja OUTFILE hér. Þá hvað þetta er hér, bara það í rauninni byrjar að lesa inn á punktamynd skrá frá upphafi. Í upphafi, eins og við vitum, inniheldur BITMAPFILEHEADER, og svo þeir röð af bitum verður beint fylla í BITMAPFILEHEADER. Svo það sem við höfum hér er að segja að BITMAPFILEHEADER bf - það er nýr breyta okkar BITMAPFILEHEADER gerð - við erum að fara að setja inn BF það sem við lesum úr í músina, sem er INFILE okkar. Hversu mikið lesið við? Við að lesa í hversu mörg bæti við þurfum að vera allt BITMAPFILEHEADER. Sama hátt, það er það sem við gerum fyrir the upplýsa haus. Þannig að við erum að halda áfram með skrá okkar í INFILE, og við erum að lesa þeim bita og bæti, og við erum að tengja þá beint í í þessum tilvikum í þeim breytum sem við erum að gera. Hér erum við bara að gera viss um að punktamynd er punktamynd. Nú höfum við OUTFILE, ekki satt? Svo eins og það stendur þegar við búið það, það er í raun tóm. Þannig að við verðum að í grundvallaratriðum að búa til nýja punktamynd frá grunni. Það sem við gerum er að við verðum að tryggja að við afrita á skrá haus og upplýsa haus rétt eins og INFILE hefur. Það sem við gerum er að við að skrifa - og muna að BF er breytilegt á BITMAPFILEHEADER tegund, svo það sem við gerum er að við nota bara þessi efni að skrifa í OUTFILE. Hér minnumst við ræddum um padding, hvernig það er mikilvægt að ganga úr skugga um að magn af punktar sem við höfum er margfeldi af 4. Þetta er mjög gagnlegt formúlu til að reikna út hversu mikið padding þú ert gefið breidd skránni. Ég vil þið að muna að í copy.c við höfum uppskrift fyrir útreikning padding. Allt í lagi? Svo allir að muna það. Frábært. Svo hvað copy.c gerir næst er það iterates yfir alla scanlines. Það fer í gegnum raðir fyrst og geymir hvert þrefaldur að það les og þá skrifar hann í OUTFILE. Svo hér erum við að lesa eina RGB þrefaldur í einu og þá setja það sama þrefaldur í OUTFILE. The erfiður hluti er að padding er ekki RGB þrefaldur, og þannig að við getum ekki bara lesa þessi padding magn af RGB triples. Það sem við verðum að gera er í raun bara að færa skrá stöðu vísir okkar, færa bendilinn okkar, til konar sleppa yfir alla padding þannig að við erum í næstu línu. Og svo það sem þetta gerir er að afrita sýnir þér hvernig þú might vilja til að bæta padding. Þannig að við höfum reiknað hversu mikið padding við þurfum, svo þýðir að við þurfum padding fjölda 0s. Hvað þetta gerir er að lykkja sem setur padding fjölda 0s í OUTFILE okkar. Og svo að lokum, nálægt þér bæði skrár. Þú lokar INFILE ásamt OUTFILE. Svo er það hvernig copy.c virkar, og það er að fara að vera mjög gagnlegt. Í stað þess bara að í raun beint að afrita og líma það eða bara horfa á hana og skrifa í hvað sem þú vilt, þú getur bara vilja til að framkvæma þessa skipun í flugstöðinni, CP copy.c whodunit.c, sem mun búa til nýja skrá, whodunit.c, sem inniheldur nákvæmlega sömu efni og afrit gerir. Svo það sem við getum gert er að nota það sem ramma sem liggja að byggja og breyta að skrá whodunit okkar. Þetta eru okkar til-DOS að gera fyrir Whodunit, en hvað copy.c gerir er í raun sér um mest af þeim fyrir okkur. Þannig er allt sem við þurfum að gera næst breyta punktar sem þarf að í raun og veru að gera skrá læsileg. Mundu að fyrir tiltekið pixla þriggja, þannig að tilteknu breytu af RGBTRIPLE tegund, er hægt að sjá blátt, grænt og rautt gildi. Það er að fara að koma sér vel því ef þú getur fengið aðgang að þeim, sem þýðir að þú getur einnig athugað þá, og það þýðir að þú getur breytt þeim. Svo þegar við fórum aftur til rauðu stækkunargler dæmi okkar, grundvallaratriðum, sem var vinna eins konar síu fyrir okkur. Svo er það sem við viljum við viljum að sía allar triples sem eru að koma inn Það eru til nokkrar mismunandi leiðir til að gera þetta. Í grundvallaratriðum, getur þú hefur hvað tegund af síu sem þú vilt. Kannski þú vilt breyta öllum rauðu díla eða kannski þú vilt breyta mismunandi lit pixla í mismunandi lit. Það er komið að þér. Mundu að þú getur athugað hvaða lit pixla er og þá er einnig hægt að breyta því sem þú ert að fara í gegnum. Allt í lagi. Svo er það Whodunit. Þegar þú keyrir Whodunit, munt þú vita hver sökudólgurinn af glæp var. Nú ætlum við að fara að búa. Við erum að fara til enn að takast á við bitmaps. Það sem við ætlum að gera er að við erum að fara að hafa inntak punktamynd og þá ætlum við að fara í fjölda og þá fá OUTFILE punktamynd þar sem það er í grundvallaratriðum INFILE okkar minnkaðar með n. Segja skrá minn var bara einn pixla stór. Þá ef n minn var 3, stigstærð með 3, svo ég myndi endurtaka að pixla n fjöldi af sinnum, svo 3 sinnum, og þá einnig skala hana niður 3 sinnum eins og heilbrigður. Svo þú sérð að ég er stigstærð það lóðrétt og lárétt. Og þá er hér dæmi. Ef þú hefur n = 2, þú sérð að fyrsta bláa punkta þar endurtekin tvisvar lárétt sem og tvisvar lóðrétt. Og þá heldur áfram, og svo þú hafa bein stigstærð af upprunalegu myndinni þinni af tveimur. Svo ef við vorum að smáatriðum sauðakóðanum fyrir þetta, viljum við að opna skrána. Og þá vita að ef við förum aftur hingað, við sjáum að breidd fyrir OUTFILE er að fara að vera öðruvísi en breidd fyrir INFILE. Hvað þýðir það? Það þýðir að upplýsingar í haus okkar er að fara að breytast. Og svo er það sem við munum vilja til að gera að uppfæra haus upplýsa, vita að þegar við lesum á skrá ef þú ert að starfa á copy.c ramma, við höfum nú þegar breytu sem gefur til kynna hvaða stærð er og svoleiðis. Svo þegar þú ert að, hvað þú might vilja til að gera er að breyta þeim tiltekna breytur. Mundu að ef þú hafa a struct, hvernig þú sjá breytur innan það. Þú notar punktur stjórnandi, ekki satt? Svo að nota það, þú veist að þú þarft að breyta haus upplýsingar. Svo hér er bara listi af raunverulegu þætti sem eru að fara að breyta í skránni þinni. The skrá stærð er að fara að breytast, á myndina, sem og breidd og hæð. Þá fara aftur í kortinu á bitmaps, líta á hvort það er the skrá haus eða upplýsingar haus sem inniheldur þær upplýsingar og breyta eftir þörfum. Aftur segja CP copy.c resize.c. Það þýðir að resize.c nú inniheldur allt sem innihélt inni afrit því afrit gefur okkur leið til að lesa á hverjum scanline pixla með pixla. Nema nú, í stað þess bara að breyta gildi eins og við gerðum í Whodunit, hvað við viljum gera er að við viljum að skrifa í mörgum punktar svo lengi sem N okkar er meiri en 1. Þá er það sem við viljum gera að við viljum að teygja það lárétt með n, og teygja það lóðrétt með n. Hvernig gætum við gert þetta? Segja n er 2 og þú hefur þetta gefið INFILE. Bendillinn er að fara að byrja á fyrsta, og hvað þú vilt gera ef n er 2, vilt þú að prenta á 2 af þeim. Svo þú prentað í 2 þeirra. Þá bendillinn er að fara að flytja í næstu pixla, sem er rauða, og það er að fara að prenta út 2 af þeim rauða sjálfur, auka við það á hvað það hefur gert áður. Þá fer bendillinn í næsta pixla og draga í 2 þeirra. Ef þú lítur aftur til copy.c ramma, hvað þetta gerir hér er það skapar nýtt eintak af RGB þrefaldur, nýtt breytu sem heitir þrefaldur. Og hér er það les inn í það, les það frá INFILE 1 RGBTRIPLE og geymir það inn af því þrefaldur breytu. Svo þú ert í raun að breyta hönd þessa tilteknu pixla. Þá er þegar þú skrifar, það sem þú might vilja til gera encase á fwrite yfirlýsingu í for lykkju að skrifa það inn í OUTFILE eins oft og þarf. Það er nógu einfalt. Bara í rauninni endurtaka skrifa ferli n fjöldi af sinnum að skala það lárétt. En þá verðum við að muna að padding okkar er að fara að breytast. Fyrr, segja fengum við eitthvað af lengd 3. Þá myndum við bara bæta við í hversu mikið padding? Bara eitt að gera það margfeldi af 4. En segjum að við erum stigstærð þetta tiltekna mynd af n = 2. Svo hversu margir blár pixlar myndum við hafa í lok? Við viljum hafa 6. 1, 2, 3, 4, 5, 6. Allt í lagi. 6 er ekki margfeldi af 4. Hvað er næsta margfeldi af 4? Það er að fara að vera 8. Þannig að við erum í raun að fara að hafa 2 stafi af padding þar. Hefur einhver muna ef við höfum formúlu til að reikna padding og hvar það gæti verið? [Inaudible nemandi svar] >> Já, copy.c. Hægri. Það er uppskrift í copy.c að reikna út hversu mikið padding þú ert gefið ákveðna breidd bitamyndina. Svo þá er að fara að vera gagnlegt þegar þú þarft að bæta í tiltekið magn af padding í raun að finna út hversu mikið padding þú þarft að bæta við. En einn minnismiði, þó, er að þú vilt vera viss um að þú sért að nota rétt stærð. Réttlátur vera varkár vegna þess að þú ert í rauninni að fara að takast á við tvö bitmap myndir. Þú vilt tryggja að þú ert að nota rétta. Þegar þú ert að reikna padding fyrir OUTFILE, þú vilja til nota breidd OUTFILE og ekki breidd og áður. Frábært. Það konar annast nær allt bitamyndina lárétt. En það sem við viljum gera er í raun að dreifa þessu lóðrétt eins og heilbrigður. Þetta er að fara til vera a lítill hluti trickier því þegar við höfum lokið við að afrita röð og skrifa í röðinni, bendillinn okkar er að fara að vera á enda. Þannig að ef við lesum aftur, þá er það bara að fara að lesa í næstu línu. Svo er það sem við viljum gera svona að finna einhverja leið til að afrita þær raðir aftur eða bara svona að taka þessi röð og endurskrifa hann aftur. Eins og ég benti svona til, það eru nokkrar leiðir til að gera þetta. Það sem þú gætir gert er eins og þú ert að fara í gegnum og lesa í gegnum tiltekna scanline og breyta því sem þörf krefur, svo konar geyma alla þá punkta fylki. Þá seinna þú veist að þú þarft að prenta út þessi fylki aftur, og svo þú getur bara notað þessi fylking að gera það. Önnur leið til að gera það er að þú gætir afrita niður eina röð, skilja að þú þarft að afrita það aftur, svo í raun færa bendilinn, og það er að fara að nota aðferðina fseek. Þú getur fært bendilinn alla leið aftur og svo endurtekið copy ferlið aftur. Svo ef stigstærð númerið okkar er n, þá hversu oft ættum við að fara til baka og umrita línu? >> [Nemandi] n - 1. >> Já, fullkominn. n - 1. Við höfum gert það einu sinni nú þegar, þannig að þá munum við vilja til að endurtaka fara aftur ferli n - 1 magn af sinnum. Allt í lagi. Svo þar hafið þið Resize virka. Nú getum við fengið að virkilega gaman hluti, uppáhalds pset minn, sem er batna. Í stað þess að bitmaps, í þetta sinn við erum að fást við JPEG. Við erum í raun ekki gefið skrá bara á JPEG, við erum gefið grundvallaratriðum hrár minni nafnspjald snið. Og svo eru þetta hluti af vöru og sorp gildi í upphafi, og þá byrjar það og það hefur fullt af JPEG skrár. Hins vegar erum við afhent kort þar sem við höfum eytt á myndir; raun, við höfum gleymt hvar myndir eru staðsett innan kortið. Svo verkefni okkar í Batna er að fara í gegnum þetta Card sniði og finna þær myndir aftur. Til allrar hamingju, uppbyggingu JPEG skrár og kort skrá er a hluti gagnlegt. Það örugglega gæti verið hluti trickier ef það væri ekki í þessari tilteknu sniði. Sérhver JPEG skrá hefst í raun með tvær mögulegar raðir, hér fyrir ofan. Í grundvallaratriðum, þegar þú ert með nýja JPEG skrá, það byrjar með annaðhvort röð ffd8 ffe0 eða hitt, ffd8 ffe1. Annað gagnlegt hlutur til vita er að JPEG eru geymd contiguously. Svo þegar einn JPEG skrá endar, hitt byrjar. Þannig að það er ekki hvers konar á milli gildi þar. Þegar þú högg the byrjun af JPEG, ef þú hefur verið að lesa JPEG, þú veist að þú hefur högg the lok fyrri og upphaf þess næsta. Til konar sjón þetta, gerði ég aðaldráttum. Annar hlutur óður í JPEG er að við getum lesið þá í röð af 512 bæti í einu, álíka við upphaf kortsins. Við þurfum ekki að skoða hvert einasta bæti því það myndi sjúga. Þannig að í stað, hvað við getum gert er í raun bara lesið í 512 bæti í einu og þá, í ​​stað þess að stöðva á milli þeirra á þessum litla sneiðar, við getum bara athuga upphafið af 512 bæti. Í meginatriðum, í þessari mynd, það sem þú sérð er í byrjun kortsins, þú hefur gildi sem eru í raun ekki máli við raunverulegan JPEG sjálfir. En það sem ég hef er stjarna að kynna einn af tveimur byrja röð fyrir JPEG. Svo þegar þú sérð stjörnu, þú veist að þú ert með JPEG skrá. Og þá á hverjum JPEG skrá er að fara til vera sumir margfeldi af 512 bæti en ekki endilega það sama marga. Leiðin sem þú veist að þú hefur högg annað JPEG er ef þú högg aðra stjörnu, annars byrjar runa af bætum. Þá er það sem þú ert hér þú ert rauða JPEG skrá heldur áfram þar til þú högg stjörnu, sem er auðkenndur með nýjan lit. Þú heldur áfram og þá högg aðra stjörnu, högg þú annað JPEG, þú heldur áfram alla leið til enda. Þú ert á síðustu myndinni hér bleika einn. Þú ferð á enda þar til þú högg the endir af eðli skrá. Þetta er að fara að vera mjög gagnlegt. Nokkrar helstu takeaways hér: Kortið skrá hjartarskinn ekki að byrja með JPEG, en einu sinni á JPEG byrjar, eru allar JPEG geymdar hlið við hlið hvort við annað. Sumir sauðakóðanum fyrir batna. Í fyrsta lagi erum við að fara að opna kort skrá okkar, og það er að fara að vera með skrá okkar I / O aðgerðir. Við ætlum að endurtaka eftirfarandi ferli fyrr en við höfum náð í lok skrárinnar. Við ætlum að lesa 512 bæti í einu. Og það sem ég sagði hér er að við erum að fara að geyma það í biðminni, Svo í rauninni að halda á þeim 512 bæti þar við vitum nákvæmlega hvað á að gera við þá. Þá er það sem við viljum gera að við viljum athuga hvort við höfum högg stjörnu eða ekki. Ef við höfum högg stjörnu, ef við höfum högg einn af byrjunarlaunum röð, þá vitum við að við höfum högg nýja JPEG skrá. Það sem við munum vilja til að gera er að við erum að fara að vilja til að búa til nýja skrá í pset4 skrá okkar að halda áfram að gera þá skrá. En einnig, ef við höfum þegar gert JPEG áður, þá viljum við enda þessi skrá og ýta því til pset4 möppu, þar sem við munum hafa að skrá geymd vegna þess að ef við gerum tilgreina ekki að við höfum lokið að JPEG skrá, þá munum við í rauninni hafa óákveðins upphæð. The JPEG mun aldrei enda. Þannig að við viljum ganga úr skugga um að þegar við erum að lesa inn á JPEG skrá og skrifa það, viljum við sérstaklega loka að til að opna næsta einn. Við munum vilja til að athuga nokkra hluti. Við viljum til að athuga hvort við erum í upphafi nýs JPEG með biðminni okkar og einnig ef við nú þegar fundið JPEG áður vegna þess að það mun breytast aðferð smávegis. Svo eftir að þú fara í gegnum alla leið og þú högg the endir af the skrá, þá er það sem þú þarft að gera sem þú vilt loka öllum skrám sem eru opnir núna. Það mun líklega vera síðasta JPEG skrá sem þú hefur, sem og kort skrá sem þú hefur verið að fást við. Síðasta hindrunin sem við þurfum að takast á við er hvernig á að í raun og veru gera JPEG skrá og hvernig til raunverulega ýta því í möppuna. The pset krefst þess að sérhver JPEG sem þú finnur að vera á eftirfarandi formi, þar sem þú hefur númerið. jpg. Talan, jafnvel ef það er 0, kalla okkur það 000.jpg. Alltaf þegar þú finna JPEG í forritinu, þú ert að fara að vilja til að nefna það í þeirri röð sem það er að finna. Hvað þýðir þetta? Við þurfum að konar halda utan um hversu marga við höfum fundið og hvaða númer hvers JPEG ætti að vera. Hér erum við að fara að taka kostur af the sprintf virka. Líkur á printf, sem bara svona ljósmynda gildi út í flugstöðinni, sprintf prentar skrá út í möppu. Og svo hvað þetta myndi gera ef ég hefði sprintf, titil, og þá band þar, það myndi prenta út 2.jpg. Að því gefnu að ég hef lokað minn skrá á réttan hátt, sem myndi innihalda skrána sem ég hafði verið að skrifa út. En eitt er að kóðinn sem ég hef hér ekki alveg uppfylla hvað pset krefst. The pset krefst þess að annað JPEG skráin ætti að heita 002 í staðinn fyrir bara 2. Svo þegar þú hefur prentað út nafn, þá kannski þú might vilja til að breyta tákn örlítið. Hefur einhver man hvernig við leyfa fyrir auka rými þegar við prenta eitthvað? Já. >> [Nemandi] Þú setur 3 milli prósent skilti og 2. >> Já, fullkominn. Þú munt setja 3 í þessu tilfelli vegna þess að við viljum pláss fyrir 3. % 3d myndi líklega gefa þér 002.jpg stað 2. Fyrsta rök í sprintf virka er í raun bleikju array, sem við vissum áður og strengi. Þeir vilja, svona meira eins og tímabundna geymslu, bara geyma hlýst band. Þú verður í raun ekki að takast á við þetta, en þú þarft að fela það. Vitandi að sérhver skrá nafn hefur fjölda, sem tekur upp þrjá stafi, og þá. jpg, hversu lengi ætti þetta array að vera? Kasta út númer. Hversu margir stafir í titli, í nafni? Svo er það 3 hashtags, tímabil, JPG. >> [Nemandi] 7. >> 7. Ekki alveg. Við erum að fara að vilja 8 vegna þess að við viljum leyfa fyrir null Terminator eins og heilbrigður. Að lokum, bara til að draga úr því ferli sem þú munt vera að gera að batna, þið hafið einhverjar upphafi upplýsingar. Þú halda áfram þar til þú finnur upphaf JPEG skrá, og það getur verið annaðhvort einn af tveimur byrja röð. Þú halda áfram að lesa. Sérhver rista hér táknar 512 bæti. Þú halda áfram að lesa, halda áfram að lesa þar til þú lendir annað byrjar röð. Þegar þú hefur það, að loka núverandi JPEG - í þessu tilfelli, það er rauða, svo þú vilt að enda það. Þú vilt sprintf nafni þess í pset4 möppunni, þá þú vilt að opna nýjan JPEG og þá halda áfram að lesa þangað til þú lendir í næst. Halda áfram að lesa, halda áfram að lesa, og svo að lokum, að lokum, þú ert að fara að ná í lok skrá, og svo þú þarft að loka síðasta JPEG sem þú varst að vinna með, sprintf að í pset4 mappa, og þá líta á allar myndirnar sem þú hefur fengið. Þessir myndir eru í raun myndir af CS50 starfsmenn, og svo er þetta þar sem gaman bónus hluti pset kemur í er að þú ert að keppa í hluta til að finna TFS í myndum og taka myndir með þeim til að sanna að þú hafir gert pset og svo þú getur séð hvaða starfsmenn eru á myndunum. Svo er að taka myndir við starfsfólk. Stundum þú þarft að elta þá niður. Sennilega sumir af þeim mun reyna að hlaupa í burtu frá þér. Þú taka myndir með þeim. Þetta er í gangi. Það er ekki vegna þegar pset er vegna. Frestur verður tilkynnt í sérstakur. Þá saman við lið þitt, hvort kafla tekur mest myndir með mest starfsmenn munu vinna nokkuð ógnvekjandi verðlaun. Það er góður af hvata til að fá pset4 þinn lokið eins fljótt og auðið er því þá er hægt að fá niður til starfseminnar veiða niður allar mismunandi CS50 starfsmanna. Það er ekki skylda, þó svo að þegar þú færð myndirnar, þá ertu búin með pset4. Og ég er búin með walkthrough 4, svo að þakka ykkur fyrir komuna. Gangi þér vel með réttar. [Lófaklapp] [CS50.TV]