[Powered by Google Translate] [Návod - Problém Set 4] [Zamyla Chan - Harvard University] [To je CS50. - CS50.TV] Dobrá. Ahoj, všetci, a vitajte na Walkthrough 4. Dnes je naša Pset je forenznú. Forenznú je naozaj zábavná Pset, ktorý zahŕňa rokovania s bitmapové súbory zistiť, kto spáchal zločin. Potom budeme veľkosť nejaké bitmapové súbory, potom sme tiež bude zaoberať naozaj zábavné časti zvanej Recover, , V ktorom sú si v podstate podal pamäťové karty v ktorom niekto omylom zmazali všetky svoje súbory, a my sme vyzvaní k vymáhaniu týchto súborov. Ale najprv, ako sa dostaneme do PSet, ja naozaj chcem pogratulovať všetkým. Sme asi v strede tohto kurzu. Kvíz 0 je za nami, a my sme na pset4, takže v podstate, sme na polceste. Prešli sme dlhú cestu, keď sa pozriete späť na zoznam psets, pset0 a pset1, tak zablahoželať sami o tom, a budeme sa dostať do nejakej naozaj zábavné veci. Takže naše toolbox pre tento PSet, opäť, namiesto toho, sudo yum-y update, sme schopní len spustiť update50, ak ste na verziu 17.3 a vyšší spotrebiča. Takže je potrebné spustiť update50 - je to oveľa jednoduchšie, niekoľko menej znakov - Uistite sa, že ste na najnovšiu verziu spotrebiča. Predovšetkým je dôležité, aby update50, keď začneme používať CS50 kontrolu. Takže sa uistite, že ste to urobil. Pre všetky časti pre tento Pset, budeme sa zaoberať súborov vstupy a výstupy, súbor I / O. Budeme ísť cez mnoho programov, ktoré sa zaoberajú poli smerujúce k súborom a podobné veci, ktoré, tak chceme, aby sa ubezpečil, že sme naozaj známe a pohodlné rokovania s tým, ako sa vstupom a výstupom do súborov. V distribučnej kódu pre tento PSet je súbor s názvom copy.c, a to je to, čo budeme nájsť ich bude naozaj užitočné pre nás pretože budeme skončiť skutočne kopírovanie copy.c súbor a len meniť mierne, aby mohli dosiahnuť prvých 2 časti problému sady. A potom sa, ako som sa zmienil vyššie, máme čo do činenia s bitmapami, rovnako ako súbory JPEG. Takže naozaj pochopenie štruktúry, ako sú organizované tieto súbory, Ako môžeme naozaj preložiť 0s a 1s do structs a veci, ktoré môžeme skutočne pochopiť a interpretovať a upravovať, to bude naozaj dôležité, takže ísť do JPEG a bitmapové súbory a pochopenie štruktúry z nich. Pset4, ako obyčajne, začína časť otázok. Tí sa budú zaoberať so súborom I / O a vám zvyknutí na to. Potom časť 1 je detektívka, v ktorej budete rovnako bitmapový súbor , Ktorá vyzerá trochu ako červené bodky po celom tele. A potom v podstate to, čo budeme robiť, je vziať tento súbor a stačí upraviť ľahko na verziu, že môžeme čítať. V podstate, keď sme dokončiť, budeme mať rovnaký súbor, okrem budeme môcť vidieť skrytú správu skryté všetkými tými červenými bodkami. Potom Resize je program, ktorý, vzhľadom súbor a potom daný názov súboru, ktorý výstupy a potom im pridelené číslo, rovnako, bude skutočne zmenšiť tento bitmapu týmto celočíselnú hodnotu. Potom konečne, máme obnoviť PSet. Dostávame pamäťovú kartu a potom obnoviť všetky fotografie , Ktoré boli omylom odstránené, ale, ako sa dozvieme, nebude odstránený a zo súboru odstránené; sme tak nejako stratila, kde boli v súbore, ale budeme obnoviť to. Great. Takže keď do súboru I / O konkrétne sa jedná o celý zoznam funkcií, ktoré budete používať. Ste už videli trochu základy fopen, fread, fwrite a, ale budeme sa pozrieť ďalej do nejakého súboru I / O funkcie, ako je fputc, , V ktorom stačí napísať jeden znak v čase, na fseek, kde tak nejako presunúť súbor ukazovateľ polohy vpred a vzad, a potom niektorí iní. Ale pôjdeme do toho trochu neskôr PSet. Takže prvé, len aby sa dostali do súboru I / O ako pôjdeme do PSet, na otvorenie súboru, napríklad, čo musíte urobiť, je skutočne nastavený ukazovateľ k tomuto súboru. Takže máme FILE * ukazovateľ. V tomto prípade, volám, že ukazovátko, pretože to je bude môj infile. A tak budem používať funkcie fopen a potom názov súboru a potom režim, v ktorom budem sa zaoberať so súborom. Takže tam je "r" v tomto prípade pre čítanie, "w" pre písanie, a potom "" pre pridávanie. Napríklad, keď máte čo do činenia s vstupni_soubor a všetko, čo chcete urobiť, je prečítať bitov a bajtov uložené tam, potom ste pravdepodobne bude chcieť použiť "r" ako režim. Ak chcete skutočne písať, druh vytvoriť nový súbor, potom to, čo budeme robiť, je budeme otvorení nového súboru a použite tlačidlo "w" režime pre písanie. Takže, keď ste vlastne čítanie do súborov, štruktúra je nasledujúca. Najprv sa patrí ukazovateľ na struct, ktorý bude obsahovať bajtov, ktoré čítate. Takže to bude koniec umiestnenie bajtov, ktoré čítate. Tie potom bude zobrazovať iba veľkosť, rád v podstate koľko bajtov váš program pre čítanie do súboru, veľkosť v podstate je jeden prvok, a potom budete určiť, koľko prvkov si chcete prečítať. A potom konečne, musíte vedieť, kde ste čítanie z, takže to bude tvoj v ukazovateľ. Aj farebne odlíšené, pretože podľa fread je tiež veľmi podobné fwrite, okrem chcete, aby sa ubezpečil, že používate správne poradie, uistite sa, že ste skutočne zápisu a čítania z pravej súboru. Takže, ako pred, či máme na veľkosť prvku, rovnako ako počet prvkov, potom môžeme hrať tu trochu. Povedzme, že mám psa, struct, a tak som si prečítať dva psy naraz. To, čo som mohol urobiť, je povedať, že veľkosť jedného prvku bude veľkosť jedného DOG a budem skutočne čítať dva z nich. Prípadne, čo som mohol urobiť, je povedať, že som len tak čítať jeden prvok a že jedným z prvkov bude veľkosť dvoch psov. Tak to je podobné, ako môžete trochu pohrať s veľkosťou a počtom v závislosti na tom, čo je viac intuitívne pre vás. Dobrá. Takže teraz sa dostávame k písaniu súborov. Ak chcete napísať súbor, prvý argument je vlastne kam čítanie z Takže to je v podstate dáta, ktoré budete písať do súboru, ktorý je mimo ukazovateľ na konci. Takže keď máte čo do činenia s PSet, uistite sa, že sa zmiasť. Možno majú definícií bok po boku. Môžete vytiahnuť definície v príručke zadaním muža a potom fwrite, napríklad, v termináli, alebo sa môžete obrátiť späť k tomuto snímke a uistite sa, že používate správny. Takže znova, pre fwrite, keď máte súbor, ktorý chcete zapísať do, že to bude posledný argument a že to bude ukazovateľ do tohto súboru. Takže to, ako konáme s písaním snáď niekoľko bajtov v čase, ale že chcete stačí napísať len v jednom znaku. Ako uvidíme neskôr v tomto príklade, v bitmapy budeme musieť použiť. To je, keď môžeme použiť fputc, v podstate len uvedenie jeden znak v čase, chr, do súboru ukazovateľ, a to je naša sa ukazovateľ tam. Takže vždy, keď sa snažíme, alebo písať v súbore, súbor je sledovanie, kde sme. Takže je to druh kurzora, súbor ukazovateľ polohy. A tak keď sme písať alebo čítať znova do súboru, súbor skutočne pamätá, kde je to, a tak to pokračuje od miesta, kde je kurzor. To môže byť výhodné, keď chcete, povedzme, prečítajte si v určitom množstve, aby niečo urobiť a potom si v nasledujúcej výške, ale niekedy by sme mohli chcieť vrátiť, alebo skutočne začať od určitého referenčnej hodnoty. Takže funkcia fseek, čo robí, je nám umožňuje pohybovať kurzorom v určitom súbore určitý počet bajtov. A potom to, čo musíme urobiť, je určiť, kde referenčná hodnota je. Takže buď sa pohybuje dopredu alebo dozadu od miesta, kde kurzor je v súčasnej dobe, alebo sa môže určiť, že by mal len pohybovať od začiatku súboru alebo od konca súboru. A tak si môžete prejsť v záporných alebo kladných hodnôt na sumu, a že sa bude trochu pohybovať kurzorom buď dopredu alebo dozadu. Než sme sa dostali do ďalších psets, akékoľvek otázky týkajúce sa súboru I / O? Dobre. Ako sme sa dostali do ďalšej príklady, neváhajte ma zastaviť na otázky. Takže v detektívka, ste podal bitmapový súbor podobný tomuto červeným na snímke, a vyzerá to, že to - banda červených bodiek - a naozaj neviem, čo je napísané. Ak škúlenie, môžete byť schopní vidieť mierny modrastú farbu vnútri uprostred. V podstate, že je miesto, kde je uložený text. Tam bola vražda, čo sa stalo, a my musíme zistiť, kto to urobil. Aby k tomu, že, musíme trochu previesť tento obraz do čitateľného formátu. Ak ste sa niekedy stretli tento, niekedy tam bude malé súpravy kde budete mať lupu s červeným filmom. Každý, kto? Jo. Takže by ste sa pravou rukou niečo také, mali by ste mať lupu s červeným filmu nad ním, by ste dať to cez obraz, a mali by ste byť schopní vidieť správy skryté v ňom. Nemáme zväčšovacie sklo s červeným filmom, a tak namiesto toho budeme druh vytvoriť vlastné v tomto PSet. A tak užívateľ bude vstupné detektívka, potom stopa,. Bmp, tak to je infile, že je red dot správa, a potom hovoria verdict.bmp bude náš outfile. Takže to bude vytvoriť nový bitmapový obraz podobný vodítko jeden s výnimkou v čitateľnom formáte, kde môžeme vidieť skrytú správu. Vzhľadom k tomu, že budeme rokovať s editáciu a manipuláciu s rastre nejakého druhu, budeme druhu ponoru v do štruktúry týchto bitmapové súbory. Išli sme cez tieto trochou v prednáške, ale poďme sa pozrieť do nich niečo viac. Rastre sú v podstate len usporiadanie bajtov kde sme určiť, ktorá bytov povedať, čo. Takže tu je niečo ako mapa bitmapového obrazu hovorí, že to začína u niektorých hlavičkových súborov, začína nejaké informácie v tam. Môžete vidieť, že asi na byte čísla 14 je veľkosť uvedená na bitmapového obrazu, a to pokračuje ďalej. Ale potom to, čo sme naozaj zaujíma je tu začína okolo bytového číslo 54. Máme tieto RGB trojčíslie. Čo to urobí, je obsahujú skutočné pixely, farebné hodnoty. Všetko vyššie, že v hlavičke je nejaké informácie zodpovedajúcej veľkosti obrazu, šírkou obrazu, a výšky. Keď ideme do polstrovaním neskôr, uvidíme, prečo je veľkosť obrazu sa môže líšiť od šírky alebo výšky. Takže potom predstavujú tieto - tieto bitmapové obrázky sú sekvencie bajtov - čo by sme mohli urobiť, je povedať áno, budem si pamätať, že v indexe 14, že ak je veľkosť, napríklad, ale to, čo budeme robiť, aby to jednoduchšie je zapouzdřit do struct. A tak máme dve structs vyrobené pre nás, BITMAPFILEHEADER a BITMAPINFOHEADER, a tak vždy, keď sme si do tohto súboru, v predvolenom nastavení to bude ísť v poriadku, a tak, aby to tiež bude vypĺňať do premenných, ako je biWidth a biSize. A potom konečne, je každý pixel reprezentovaný tromi bajty. Prvá z nich je množstvo modrej pixelu, druhý je množstvo zelene, a konečne, množstvo červenej, kde 0 znamená v podstate žiadne modrá alebo zelená ani žiadny červený a potom ff je maximálna hodnota. Jedná sa o hexadecimálne hodnoty. Takže ak máme FF0000, potom to zodpovedá maximálnej výške modré a potom už zelené a nie červený, tak potom by to bolo nám Blue Pixel. Potom ak máme FF je po celej doske, potom to znamená, že máme biely pixel. To je druh naproti zvyčajne, keď povieme, RGB. Je to vlastne deje BGR. Takže ak sa skutočne pozrieť do príklade bitmapového obrazu - dovoľte mi, aby som vytiahnuť jeden až sem. Je to trochu malé. Som priblíženie, a my môžeme vidieť to pixelated. Vyzerá to, že bloky farby. Máte biele bloky a potom červené bloky. Ak budete hrať v programe Maľovanie, napríklad, mohol by ste urobiť niečo také by v podstate len maľovať niektoré štvorca v určitom poradí. Tak čo to znamená v bitmape je nasledovné. Tu máme prvý biele pixely, ktoré všetky 6 sú f je, a potom máme červené pixely, indikovaný 0000FF. A tak postupnosť bajtov, ktoré máme uvedené, ako bitmapový obraz bude vyzerať. Takže to, čo som tu urobil je práve napísal všetky tie bajty a potom farbená v červenej takže môžete trochu vidieť, keď šprtom trochu, ako tento druh označuje smajlíky. Spôsobom, že bitmapový obrázkov práce je, že som si ho asi predstavovali v podstate ako mriežku. A tak v predvolenom nastavení, každý riadok mriežky musí byť násobkom 4 bytov. Ak sa pozrieme na bitmapový obraz, budete vyplňovať každej hodnote. Napríklad, môžete mať červenú tu, zelenú tu, modrá tu, ale musíte sa uistiť, že obraz je vyplnená násobok štyroch bajtov. Takže keď chcem svoj obraz na tri bloky široký, potom by som musel dať prázdnu hodnotu v poslednom, aby bolo násobkom štyroch. Tak potom by som pridať do niečoho, čo sme volajúceho polstrovanie. Idem len ukázať, že tam s x. Teraz hovoria, že chcú obraz, ktorý je 7 pixelov dlho, napríklad. Máme 1, 2, 3, 4, 5, 6, 7, a to všetko sa vyplní farbou. Spôsobom, že bitmapové obrázky fungovať, je, že musíme 8.. Práve teraz máme 1, 2, 3, 4, 5, 6, 7. Potrebujeme 8 priestory pre bitmapového obrazu čítať správne. Takže to, čo musíme urobiť, je pridať len trochu vypchávky Uistite sa, že všetky šírky sú jednotné a že všetky šírky sú násobkom 4.. A tak som už skôr uviedla, poduška ako X alebo zakrútený linky, ale v skutočných bitmapových obrázkov je padding indikovaný hexadecimálnom 0. Tak, že by bol jeden znak, 0. Čo sa môže hodiť, je xxd príkaz. Čo to urobí, je v skutočnosti ukazuje, radi podobný tomu, čo som robil predtým, než sa na smajlík keď som v skutočnosti vytlačí, čo každá farba by pre pixel a potom farebne, tak pri spustení xxd s nasledujúcimi príkazmi, potom to bude skutočne vytlačiť, aké farby sú pre tých pixelov. Čo musíte urobiť, je tu mám označiť, ako-S 54 hovorí, že budem začínať 54. bajtu pretože pred tým, si spomenúť, či sa pozrieme späť na mapu bitmapy, to je všetko, informácie v hlavičke a podobné veci. Ale to, čo sme naozaj záleží, je skutočné obrazové body, ktoré označujú farbu. Takže tým, že do tej vlajky,-s 54, potom sme schopní vidieť farebné hodnoty. A nebojte sa o zložité vlajok a podobné veci. V spec problému nastavené, budete mať pokyny, ako používať xxd na zobrazenie pixelov. Takže ak uvidíte tu, celkom to vyzerá ako zelené pole, tento malý vec. Ja som farebne kódované 00ff00 ako v podstate hovorí, žiadnu modrú, veľa zelene, a nie červený. Tak, že zodpovedá zelené. Ako vidíte tu, vidíme zelený obdĺžnik. Tento zelený obdĺžnik je len 3 pixelov široký, takže potom to, čo musíme urobiť, Uistite sa, že obraz je násobkom 4 široký, je pridať v extra polstrovanie. A potom sa to, ako vidíte tieto 0s tu. To bude skutočne výsledok vášho Resize PSet, v podstate brať malú bitmapu a potom rozšírenie ju 4. A tak to, čo vidíme, je, že v skutočnosti tento obrázok 12 pixelov široký, ale 12 je násobkom 4, a tak sme vlastne nevidím žiadny 0s na konci, pretože sme nemusí pridávať žiadne pretože je to úplne vypolstrovaná. To nemá žiadne väčší priestor. Dobre. Máte otázky k čalúnenie? Dobre. Cool. Ako som už spomenul skôr, bitmapy sú len sled bajtov. A tak to, čo máme, je miesto museli sledovať presne, aké množstvo byte odpovedá na konkrétny prvok, sme vlastne vytvorili struct reprezentovať, že. Takže to, čo máme, je RGBTRIPLE struct. Kedykoľvek máte inštanciu RGB trojicu, pretože to je typ definovať struct, potom môžete pristúpiť k rgbtBlue premenné, Podobne Zelené a červené premenné, ktoré bude uvádzať, koľko modrá, zelená a červená, respektíve, máte. Takže ak máme modrú premenná nastavená na hodnotu 0, zelená nastavená na FF, čo je maximálna hodnota, ktorú môže mať, a potom červená premenná nastavená na hodnotu 0, potom akú farbu by to najmä RGB triple predstavujú? >> [Študent] Green. Green. Presne tak. Je to bude užitočné vedieť, že kedykoľvek budete mať inštanciu RGB trojicu, môžete skutočne prístup k množstvu farby - modrá, zelená, červená a - zvlášť. Teraz, keď sme hovorili o štruktúre, ktorá, poďme sa pozrieť na BMP súboru. Jedná sa o structs vyrobené pre vás. Tu máme BITMAPFILEHEADER struct. Zaujímavá je veľkosť. Neskôr, máme informačné hlavičku, ktorá má niekoľko ďalších vecí, ktoré sú pre nás zaujímavý, totiž veľkosť, šírka a výška. Ako pôjdeme do neskôr, keď budete čítať do súboru, automaticky načíta, pretože sme nastavili poradí bude rovnaké. Takže biSize bude obsahovať správne bajtov, ktoré zodpovedajú skutočnej veľkosti obrázku. A potom je tu, konečne, ako sme hovorili o tom, máme RGBTRIPLE typedef struct. Máme rgbtBlue, zelenej a červenej s ním spojené. Great. Dobre. Teraz, keď sme pochopili rastrové obrázky trochu, pochopiť, že máme hlavičku súboru a info hlavička s ním spojené, a potom po tom, máme zaujímavé veci, z farieb, a tieto farby sú zastúpené RGBTRIPLE structs, a tie zase majú tri hodnoty spojené k modrej, zelenej a červenej. Takže teraz, môžeme trochu premýšľať o tom, Recover trochu. Prepáčte. Premýšľajte o tom, detektívka. Keď máme stopa súbor, potom to, čo chceme urobiť, je prečítať v nej pixel po pixeli a potom nejako zmeniť tie pixely, takže môžeme výstupu do čitateľného formátu. A tak do výstupu, budeme písať pixel po pixeli do verdict.bmp súboru. To je trochu moc čo robiť. Uvedomujeme si, že. Takže to, čo sme urobili je, že sme skutočne poskytované vám copy.c. Čo copy.c robí, je len urobí presnú kópiu daného rastrového súboru a potom výstup do. Tak to už otvára súbor pre vás, číta v pixel po pixeli, a zapíše ho do do výstupného súboru. Poďme sa na to pozrieť. Toto je zabezpečiť riadne využitie, ako k súborom tu. Čo to však je, že nastaví vstupný súbor bude to, čo sme prešiel v v vstupni_soubor tu, čo je náš druhý argument príkazového riadku. Kontroly sa uistiť, že môžeme otvoriť súbor. Skontroluje, či môžeme vytvoriť nový outfile tu. Tak čo to robí tu, to jednoducho v podstate začne čítať do bitmapy od začiatku. Začiatok, ako vieme, obsahuje BITMAPFILEHEADER, a tak tieto sekvencie bitov sa priamo vyplniť BITMAPFILEHEADER. Takže to, čo tu máme, je hovoriť, že BITMAPFILEHEADER BF - to je naša nová premenná typu BITMAPFILEHEADER - budeme dať dovnútra bf, čo čítame z ukazovátko, čo je naša infile. Ako veľmi sme si? Čítame v koľko bytov budeme musieť obsahovať celú BITMAPFILEHEADER. Podobne, to je to, čo robíme pre info hlavičky. Takže sme ďalej po našom súbore v soubor_se_hrou a my čítate tieto bity a bajty, a my sme zapojenie je priamo v do týchto inštancií premenných, ktoré robíme. Tu sme len uistiť, že je bitmapa rastrový obrázok. Teraz máme outfile, že jo? Tak, ako to stojí, keď sme ju vytvoriť, je to v podstate prázdne. Takže máme v podstate vytvoriť nový rastrový obrázok od začiatku. Čo robíme je, že sme sa uistiť, že sme skopírujte do hlavičky súboru a info hlavičku rovnako ako vstupni_soubor má. Čo máme urobiť, je budeme písať - a pamätajte, že bf je premenná typu BITMAPFILEHEADER, takže to, čo robíme, je, že sme jednoducho použiť tento obsah zapísať do outfile. Tu, si, sme hovorili o polstrovaním, ako je to dôležité, aby sa ubezpečil, že množstvo pixelov, ktoré máme, je násobkom 4. To je celkom užitočné vzorec pre výpočet, koľko padding máte vzhľadom šírka súboru. Chcem ste si uvedomiť, že v copy.c máme vzorec pre výpočet odsadenie. Dobre? Takže každý si to pamätať. Great. Tak čo copy.c robí ďalej, je to iteruje cez všetky scanlines. To prejde riadky a potom uloží každý triple, že to číta a zapíše ho do outfile. Takže tu čítate len jeden RGB Triple v čase a potom uvedenie, že rovnaké Triple do outfile. V chúlostivé časti je, že výplň nie je RGB triple, a tak môžeme nielen čítať, že padding množstvo trojíc RGB. Čo musíme urobiť, je v skutočnosti len presunúť naša súbor ukazovateľ polohy, presunúť naše kurzor, na druhu preskočiť všetky polstrovanie, takže sme na ďalšom riadku. A potom, čo to robí, je kópia ukazuje, ako budete chcieť pridať výplň. Takže sme vypočíta, koľko padding potrebujeme, tak to znamená, že musíme čalúnenie počet 0s. Čo to však je pre sláčiky, ktorá kladie čalúnenie počet 0s do nášho outfile. A potom konečne, zatvorte oba súbory. Zatvorte soubor_se_hrou rovnako ako outfile. Tak to je, ako funguje copy.c, a že to bude celkom užitočné. Namiesto toho len skutočne priamo skopírovať a vložiť alebo len pri pohľade na neho a zadaním, čo chcete, môžete len chcete vykonať tento príkaz v termináli, cp copy.c whodunit.c, ktorá vytvorí nový súbor, whodunit.c, , Ktorý obsahuje presne rovnaký obsah ako kópie robí. Takže to, čo môžeme urobiť, je použiť ako rámec, na ktorom je možné budovať a upravovať pre naše detektívka súboru. To sú naše to-dos urobiť pre detektívka, ale to, čo robí copy.c je vlastne stará o väčšinu z nich pre nás. Takže všetko, čo treba robiť, je zmeniť pixely podľa potreby skutočne, aby sa súbor čitateľný. Si uvedomiť, že pre daný obrazový bod trojitým, tak pre danú premenné typu RGBTRIPLE, môžete pristupovať k modrej, zelenej a červenej hodnoty. To bude hodiť, pretože ak k nim máte prístup, to znamená, že môžete tiež skontrolovať, a to znamená, že môžete tiež zmeniť. Takže keď sme sa vrátili do nášho červeného napríklad lupy, v podstate, že sa správal ako akýsi filter pre nás. Takže to, čo chceme urobiť, je chceme filtrovať všetky trojíc, ktoré sú prichádzať Existuje niekoľko rôznych spôsobov, ako to urobiť. V podstate, môžete mať bez ohľadu na typ filtra chcete. Možno budete chcieť zmeniť všetky červené pixely alebo možno budete chcieť zmeniť iný farebný pixel na inú farbu. To záleží na vás. Nezabudnite, že môžete zistiť, akú farbu pixel je a potom môžete tiež zmeniť, ako si prechádzaš. Dobre. Tak to je detektívka. Po spustení detektívka, budete vedieť, kto vinníkom zločinu bol. Teraz sme ísť na Zmeniť veľkosť. Budeme ešte rokovať s rastrovými obrázkami. Čo budeme robiť, ich budeme mať vstupné bitmapu a potom budeme odovzdávať v rade a potom dostanete outfile bitmapu kde to je v podstate náš infile zmenšený n. Povedz môj súbor bol len jeden pixel veľký. Potom, ak má n bol 3, odstupňovaním po 3, potom by som zopakovať, že pixel n koľkokrát, tak 3 krát, a potom tiež meradlo ho 3 krát rovnako. Tak vidíte som merítka vertikálne i horizontálne. A potom je tu príklad. Ak máte n = 2, zistíte, že prvý modrý pixel tam opakovať dvakrát horizontálne aj vertikálne dvakrát. A potom, že pokračuje, a tak budete mať priamy meradlo pôvodného obrazu pomocou dvoch. Takže keby sme detail na pseudokód pre to, chceme súbor otvoriť. A potom s vedomím, že ak sa vrátime sem, vidíme, že šírka pre outfile bude iný, než je šírka pre vstupni_soubor. Čo to znamená? To znamená, že naše informácie v hlavičke sa zmení. A tak to, čo budeme chcieť urobiť, je aktualizovať záhlavie informácie, s vedomím, že keď čítame v spisoch, ak pracujete na copy.c rámca, už máme premennú, ktorá označuje to, čo je veľkosť a podobné veci. Takže až budete mať to, čo budete chcieť urobiť, je zmeniť tieto konkrétne premenné. Pamätajte, že ak máte struct, ako pristupovať k premennej v rámci ktorej. Pomocou operátora bodka, nie? Takže použitie, viete, že budete musieť zmeniť hlavičku info. Tak tu je to len zoznam skutočných prvkov, ktoré majú v úmysle sa mení v súbore. Veľkosť súboru sa bude meniť, obraz, rovnako ako šírku a výšku. Takže potom ísť späť na mapu bitmapy, pozrite sa na to, či je to súbor hlavičke alebo info hlavičku, ktorý obsahuje tieto informácie a potom sa zmeniť podľa potreby. Opäť platí, že hovoria, cp copy.c resize.c. To znamená, že resize.c teraz obsahuje všetko, čo je obsiahnuté v kópii pretože kópie umožňuje nám spôsob čítania v každej scanline pixel po pixeli. Okrem teraz, namiesto toho, aby len zmenou hodnôt, ako sme to urobili v detektívka, to, čo chceme urobiť, je chceme písať vo viac pixelov tak dlho, ako náš n je vyšší ako 1. Potom to, čo chceme urobiť, je chceme natiahnuť ho vodorovne n, rovnako ako natiahnuť zvisle n. Ako môžeme urobiť? Povedzme, že váš n je 2, a máte tento daný soubor_se_hrou. Váš kurzor sa chystá začať v prvej, a to, čo chcete robiť, keď n je 2, ak chcete tlačiť v 2 z nich. Takže tlače v 2 z nich. Potom kurzor sa bude pohybovať na ďalší pixel, čo je červený, a bude to vytlačiť 2 týchto červených, pripojí ho na to, čo sa stalo predtým. Potom kurzor sa presunie na ďalší pixel a kresliť 2 z nich. Keď sa pozriete späť na copy.c rámca, čo to robí tu je to vytvorí novú inštanciu RGB trojicu, nové premenné názvom triple. A tu, keď to číta do nej, číta z infile 1 RGBTRIPLE a uloží ho v tejto trojité premennej. Takže potom máte skutočne premennú predstavujúce konkrétne pixel. Potom, keď píšete, čo budete chcieť urobiť, je uzavrite fwrite vyhlásenie do slučky for , Ktorý píše do svojho outfile toľkokrát, koľkokrát je potrebné. To je dosť jednoduché. Stačí v podstate zopakovať písaní proces n koľkokrát škálovať vodorovne. Ale potom musíme mať na pamäti, že naša padding sa zmení. Skôr, povedať, že sme mali niečo o dĺžke 3. Potom by sme len pridať v tom, ako moc padding? Len jeden viac, aby sa to násobkom 4. Ale povedať, že sme škálovanie tento konkrétny snímok n = 2. Takže, koľko modrých pixelov budeme mať na konci? Budeme mať 6. 1, 2, 3, 4, 5, 6. Dobrá. 6 nie je násobkom 4. Aký je najbližší násobok 4? To bude mať 8. Takže sme vlastne bude mať 2 znaky polstrovaním tam. Pamätá si niekto, ak máme vzorec pre výpočet odsadenie a kde by to mohlo byť? [Nepočuteľné Študent odpoveď] >> Jo, copy.c. Právo. Tam je vzorec v copy.c spočítať, koľko padding máte daný konkrétny šírku bitmapového obrazu. Takže, čo sa deje, že je užitočné, ak potrebujete pridať v určitom množstve polstrovanie skutočne zistiť, koľko padding budete musieť pridať. Ale jedna poznámka, však je, že chcete, aby sa ubezpečil, že používate správnu veľkosť. Len si dajte pozor, pretože ste v podstate bude zaoberať dvoma bitmapových obrázkov. Chcete, aby sa ubezpečil, že používate ten správny. Keď ste výpočtu odsadenie pre outfile, ktorý chcete použiť celú šírku outfile a nie šírka predchádzajúce. Great. Tento druh sa stará o preťahovanie a celú bitmapový obraz horizontálne. Ale to, čo chceme urobiť, je skutočne natiahnuť zvisle rovnako. To bude trochu zložitejšie, pretože keď sme dokončení kopírovania riadok a písanie, že riadok, naše kurzor bude na konci. Takže keď sme znovu čítať, potom je to len prečítam do ďalšieho riadku. Takže to, čo chceme urobiť, je druh nájsť nejaký spôsob, ako kopírovať tie riadky znovu alebo tak nejako, aby taký riadok a potom prepísať znova. Ako som tak trochu spomenul, existuje niekoľko rôznych spôsobov, ako to urobiť. Čo môžete urobiť, je, ako si teraz prechádzaš a čítanie cez konkrétne scanline a mení ho podľa potreby, potom druh obchodu všetkých týchto bodov v matici. Neskôr na vás viem, že budete musieť vytlačiť, že pole znovu, a tak stačí použiť túto maticu urobiť. Ďalším spôsobom, ako to urobiť, je môžete skopírovať dole o jeden riadok, pochopiť, že musíte skopírovať to znova, takže vlastne pohybujte kurzorom, a že sa bude používať metódu fseek. Dalo by sa pohybovať kurzor celú cestu späť a opakujte proces kopírovania znova. Takže ak naše meradlo číslo n, potom koľkokrát budeme musieť vrátiť a prepísať riadok? >> [Študent] n - 1. >> Jo, perfektné. n - 1. Dokázali sme to už raz, takže potom budeme chcieť zopakovať Going Back proces n - 1 množstvo časov. Dobre. Tak tu máte resize funkcie. Teraz sa dostaneme k naozaj zábavné časti, môj obľúbený PSet, ktorý je obnoviť. Miesto bitmapy, tentoraz máme čo do činenia s JPEG. My vlastne nie, rovnako súbor len pre JPEG, sme rovnako v podstate surové pamäťové karty formátu. A tak to obsahuje trochu info a odpadky hodnôt na začiatku, a potom to začne a má veľa súborov JPEG. Avšak, to sme odovzdali kartu, kde sme odstránili fotografie; podstate, sme zabudli, kde sú fotografie umiestnené v karte. Takže našou úlohou v Recover je prejsť týmto karty formátu a nájsť tie fotky znovu. Našťastie, štruktúra súborov JPEG a kartotéka je trochu užitočná. Rozhodne by bolo trochu zložitejšie, keby to nebolo v tomto konkrétnom formáte. Každý súbor JPEG skutočne začína s dvoma možnými sekvenciami, ktoré sú uvedené vyššie. V podstate, keď máte nový súbor JPEG, začína buď sekvencie ffd8 ffe0 alebo druhý, ffd8 ffe1. Ďalšie užitočné vec je vedieť, je, že JPEG sú uložené súvisle. Takže vždy, keď jeden súbor JPEG končí, druhý začína. Takže tam nie je žiadny druh in-medzi hodnotami tam. Akonáhle narazí na začiatok JPEG, ak ste už čítanie JPEG, viete, že ste narazila na koniec predchádzajúceho a začiatkom toho budúceho. Ak chcete druhu si to predstaviť, som schému. Ďalšia vec, o JPEG je, že môžeme čítať v sekvenciách 512 bajtov v čase, podobne sa začiatkom karty. Nepotrebujeme byť kontroly jednotlivých bajt, pretože by to za prd. Takže namiesto toho, čo môžeme urobiť, je v skutočnosti len čítať 512 bajtov v čase, a potom, namiesto kontroly medzi tie, v týchto malinké plátky, môžeme len skontrolovať na začiatku 512 bajtov. V podstate v obrázku, čo vidíte, je na začiatku karty, budete mať hodnoty, ktoré sú v skutočnosti relevantné pre skutočné JPEG samotných. Ale potom to, čo mám, je hviezda uviesť jednu z dvoch východiskových sekvencií vo formáte JPEG. Takže zakaždým, keď uvidíte hviezdu, viete, že máte súbor JPEG. A potom každý súbor JPEG sa bude nejaký násobok 512 bajtov ale nie nevyhnutne rovnaký násobok. Spôsobom, že viete, že ste hit iný formát JPEG je, ak ste hit inú hviezdu, ďalšie predvolené postupnosť bajtov. Potom to, čo ste tu, je, že máte červené JPEG pokračujúce kým nenarazíte na hviezdu, ktorý je označený na novú farbu. Môžete pokračovať a potom stlačíte inú hviezdu, narazíš ďalšie JPEG, budete pokračovať celú cestu až do konca. Ste na poslednom obrázku tu, ružový. Idete do konca, kým nenarazíte na koniec súborového charakteru. To bude naozaj užitočné. Niekoľko hlavných takeaways tu: Karta Súbor nezačína s JPEG, ale akonáhle JPEG začne, sú všetky JPEGu uložené vedľa seba navzájom. Niektorí pseudokód pre obnovenie. Po prvé, budeme otvoriť naše karty súbor, a že to bude pomocou nášho súboru I / O funkcie. Budeme opakovať nasledujúci postup, kým sme došli na koniec súboru. Budeme čítať 512 bajtov naraz. A to, čo som povedal, je tu budeme ukladať do vyrovnávacej pamäte, tak v podstate drží na tých 512 bajtov, kým nebudeme presne vedieť, čo s nimi majú robiť. Potom to, čo chceme urobiť, je chceme zistiť, či sme hit hviezdu alebo nie. Ak sme hit hviezdu, ak sme hit jeden z východiskových sekvencií, potom vieme, že sme hit nový súbor JPEG. To, čo budete chcieť urobiť, je budeme chcieť vytvoriť nový súbor v našom pset4 adresári pokračovať v tvorbe tohto súboru. Ale tiež, keď sme už urobili JPEG skôr, potom chceme ukončiť tento súbor a zatlačte ho do pset4 zložky, kde budeme mať tento súbor uložiť, pretože ak nebudeme špecifikovať, že sme skončil tento súbor JPEG, potom budeme mať de facto neurčitý čiastku. Tieto JPEG nikdy neskončí. Takže chceme, aby sa ubezpečil, že keď sme čítanie do súboru JPEG a písomne, Ak chceme výslovne uzavrieť, že pre otvorenie ďalšej. Budeme chcieť, aby skontrolovať niekoľko vecí. Chceme zistiť, či sme na začiatku nového formátu JPEG s našej pamäti a tiež ak sme už našli JPEG do preto, že sa bude meniť proces mierne. Takže potom, čo ste prejsť celú cestu a narazí na koniec súboru, potom to, čo budete chcieť urobiť, je, že budete chcieť uzavrieť všetky súbory, ktoré sú v súčasnej dobe otvoriť. To bude pravdepodobne posledný JPEG súbor, ktorý máte, rovnako ako karty súbor, ktorý ste sa zaoberáme. Posledný prekážkou, ktorá sa musíme vysporiadať, je, ako vlastne urobiť súboru JPEG a ako sa vlastne tlačiť do priečinka. Pset vyžaduje, aby každá JPEG že nájsť byť v nasledujúcom formáte, kde máte číslo. jpg. Číslo, aj keď je to 0, hovoríme, že 000.jpg. Kedykoľvek nájdete JPEG v programe, budete chcieť pomenovať ju v poradí, že je to bolo. Čo to znamená? Musíme druhu sledovať, koľko sme našli a čo číslo každého JPEG by mal byť. Tu budeme využiť sprintf funkcie. Podobne ako printf, ktorý len tak výtlačkov hodnota von do terminálu, sprintf vytlačí súbor von do priečinka. A tak, čo to bude robiť, či som mal sprintf, titul, a potom retazec, to by vytlačiť 2.jpg. Za predpokladu, že som zavrel moje súbory správne, ktoré bude obsahovať súbor, ktorý som bol pri zápise. Ale jedna vec je, že kód, ktorý mám tu nie je úplne uspokojiť čo Pset vyžaduje. The Pset vyžaduje, aby druhý JPEG súbor by mal byť menovaný 002 namiesto toho len 2. Takže, keď vytlačiť názov, potom možno budete chcieť zmeniť zástupný symbol mierne. Pamätá si niekto, ako sme umožňujú prebytkov medzier, keď sme vytlačiť niečo? Jo. >> [Študent] Dal si 3 medzi znakom percenta a 2. >> Jo, perfektné. Budete dať 3 v tomto prípade, pretože chceme, aby priestor pre 3. % 3d by pravdepodobne vám 002.jpg miesto 2. Prvý argument do funkcie sprintf je vlastne char pole, ktoré sme predtým poznali ako reťazce. Tí vôle, trochu viac ako dočasné úložisko, stačí uložiť výsledný reťazec. Budete naozaj bude zaoberať, ale je potrebné ho zahrnúť. S vedomím, že každý názov súboru má číslo, ktoré trvá až tri znaky, a potom. jpg, by ako dlho to pole bude? Vyhodiť číslo. Koľko znakov v nadpise, v názve? Takže tam je 3 hashtags, obdobie, jpg. >> [Študent] 7. 7 >>. Nie tak celkom. Budeme chcieť 8, pretože chceme, aby bolo možné null zakončenie rovnako. Konečne, len vytiahnuť proces, ktorý budete robiť pre obnovenie, máte nejaké počiatočné informácie. Môžete pokračovať, kým nenájdete začiatok súboru JPEG, a že môže byť buď jeden z dvoch východiskových sekvencií. Stále na čítanie. Každý lomítko tu predstavuje 512 bajtov. Nechajte si na čítanie, majte na čítanie, kým sa stretnete s inou štartové poradie. Akonáhle budete mať to, že ste chcete ukončiť aktuálnu JPEG - v tomto prípade, je to červené, takže chcete ukončiť to. Ak chcete sprintf názov, ktorý do vášho pset4 zložky, potom chcete otvoriť novú JPEG a potom sa držať na čítanie kým sa stretnete s ďalšou. Majte na čítanie, majte na čítanie, a potom konečne, nakoniec, budete k dosiahnutiu konca súboru, a tak sa budete chcieť uzavrieť posledný JPEG, že ste pracoval s, sprintf, že do pset4 zložky, a potom sa pozrite na všetky obrázky, ktoré ste dostali. Tieto fotografie sú vlastne obrazy CS50 zamestnancov, a tak to je miesto, kde bonus zábavné časť PSet príde je to, že ste v súťaži vo svojich oddieloch nájsť TFS v obrazoch a fotiť sa s nimi dokázať, že ste urobili PSet a tak môžete vidieť, ktoré zamestnanci sú na obrázkoch. Takže potom si fotiť so zamestnancami. Niekedy budete musieť naháňať je. Pravdepodobne niektorí z nich sa pokúsi utiecť od teba. Môžete zhotovovať snímky s nimi. To prebieha. Nie je to z dôvodu, kedy Pset splatná. Termín bude oznámený v špec. Potom spoločne s vašou sekcie, podľa toho, čo oddiel sa najviac fotografie s najvyšším počtom zamestnancov vyhrá docela úžasné cenu. To je druh motivácie, aby si vaše pset4 skončil tak rýchlo, ako je to možné pretože potom sa môžete pustiť do práce stopovať všetkých rôznych CS50 zamestnancov. To nie je povinné, aj keď, takže akonáhle sa dostanete na obrázky, potom ste hotoví s pset4. A ja som skončil s Walkthrough 4, takže ďakujem všetkým za účasť. Veľa šťastia s Forenzná. [Potlesk] [CS50.TV]