[Powered by Google Translate] [Walkthrough - Problem Set 4]
[Zamyla Chan - Sveučilište Harvard]
[Ovo je CS50. - CS50.TV]
U redu. Pozdrav, svima, i dobrodošli na Walkthrough 4.
>> Danas naš pset je forenzika.
Forenzika je stvarno zabavno pset koji uključuje bave bitmap datoteke
otkriti tko je počinio zločin.
Onda ćemo promijeniti veličinu neke bitmap datoteke,
onda mi također idemo baviti stvarno zabavan dio naziva Obnova,
u kojem smo u osnovi se predao memorijsku karticu
u kojima je netko slučajno izbrisao sve svoje datoteke,
i mi smo pitali da se oporavim one datoteke.
>> Ali prvo, prije nego što smo dobili u pset, ja stvarno samo želim čestitati svima.
Mi smo o tome na sredini ovog tečaja.
Kviz 0 je iza nas, a mi smo na pset4, tako da u suštini, mi smo na pola puta.
Došli smo dug put, ako se osvrnem na svoje psets, pset0 i pset1,
tako da se o tome čestitam,
i da ćemo dobiti u neke stvarno zabavan stvari.
>> Tako je naša kutija za ovaj pset, opet, umjesto trčanje sudo yum-y ažuriranje,
mi smo u stanju izvoditi samo update50 ako ste na verziji 17,3 i iznad od aparata.
Dakle, budite sigurni da pokrenete update50 - to je puno lakše, nekoliko manje znakova -
kako bi bili sigurni da ste na najnoviju verziju uređaja.
Posebno je važno da update50 kada smo počeli koristiti CS50 provjeru.
Tako bi bili sigurni da ćete to učiniti.
>> Za sve dijelove za ovaj pset,
idemo se bave datoteka ulaza i izlaza, podnijeti I / O.
Mi ćemo se ide preko puno programa koji se bave polja
ukazujući na datoteke i stvari kao što je to,
pa želimo biti sigurni da smo stvarno upoznati
bave kako ulaz i izlaz u datotekama.
>> U distribuciji koda za ovaj pset je datoteka zove copy.c,
i to je ono što ćemo naći će se biti jako korisno za nas
jer ćemo završiti zapravo kopiranje copy.c datoteku
i to samo mijenjajući nešto biti u mogućnosti kako bi se postigla prvi dva dijela problema setu.
>> I tako onda kao što sam spomenuo prije, mi smo se bave bitmape kao i JPEG.
Pa stvarno razumijevanje strukture kako ta slika se organiziraju,
kako smo stvarno može prevesti 0s i 1s u tvorevina
i stvari koje mi zapravo može razumjeti i interpretirati i urediti,
da će biti jako važno,
tako ide u JPEG i bitmap datoteke i razumijevanje strukture onih.
>> Pset4, kao i obično, počinje s dijela pitanja.
Oni će se baviti datoteku I / O i dobili ste navikli na to.
Tada dio 1 je detektivski roman, u kojem si dao bitmap datoteku
da izgleda vrsta kao crvene točkice po cijelom tijelu.
I onda u osnovi ono što ćemo učiniti je iskoristiti ovu datoteku i samo ga urediti blago
u verziji da možemo čitati.
U suštini, kad smo završili, imat ćemo istu datoteku,
osim da ćemo biti u mogućnosti vidjeti skrivene poruke skrivene sve one crvene točkice.
Zatim Resize je program koji, s obzirom na datoteku
i onda dati ime datoteke koja izlazi i onda dati broj, kao i,
zapravo će veličinu bitmap da taj integer vrijednost.
Zatim, na kraju, imamo oporaviti pset.
Mi smo dati memorijsku karticu, a zatim su se oporaviti sve fotografije
koji su slučajno izbrisani,
ali, kao što ćemo naučiti, zapravo ne briše i ukloniti iz datoteke;
samo mi nekako izgubili gdje su u spisu, ali idemo da se oporavi da.
>> Izvrsno. Tako će se u datoteci / I konkretno, to su cijeli popis funkcija koje ćete koristiti.
Već ste vidjeli malo osnove fopen, fread i fwrite,
ali ćemo gledati dalje u nekom datoteku I / O funkcije kao što su fputc,
u kojem ste samo napisati jedan lik u isto vrijeme,
da fseek, gdje ste vrsta premjestiti pokazivač datoteke poziciji naprijed i nazad,
i onda neki drugi. Ali mi ćemo proći u malo kasnije tijekom pset.
>> Tako je prvi, samo da se u datoteci / I prije nego što idemo u pset,
otvoriti datoteku, na primjer, ono što morate učiniti je zapravo postaviti pokazivač na tu datoteku.
Dakle, imamo pokazivač FILE *.
U ovom slučaju, zovem ga u pokazivač jer to će biti moj INFILE.
I tako ću koristiti funkcije fopen i zatim naziv datoteke
i onda je način na koji ću se bave datoteku.
Dakle, tu je "r" u ovom slučaju za čitanje, "w" za pisanje, a zatim "" za dodavanjem.
Na primjer, kada ste se bave s INFILE
a sve što želite učiniti je čitati bitova i bajtova pohranjene tamo,
onda ste vjerojatno idući u želite koristiti "R" kao svoj način.
Kada želite da se zapravo pisati, vrsta napraviti novu datoteku,
onda ono što ćemo napraviti je da ćemo otvoriti novu datoteku
i koristiti "W" mod za pisanje.
>> Dakle, kada ste zapravo čitanje u datotekama, struktura je kako slijedi.
Prvo su pokazivač na struct koji će sadržavati bajtova da ste čitanja.
Tako da će to biti kraj lokacija bajtova da ste čitanja.
Tada ćemo ukazati na veličinu, sviđa osnovi koliko bajtova
vaš program mora pročitati u spisu, veličina osnovi jedan element je,
i onda ćeš odrediti koliko elementi želite pročitati.
I onda na kraju, morate znati gdje ste čitajući iz,
tako da će to biti vaš u pokazivač.
Ja bojama ove jer fread je također vrlo sličan fwrite,
osim želite da biste bili sigurni da koristite pravi poredak,
pobrinite se da ste zapravo pisanja ili čitanja iz desnog datoteku.
>> Dakle, kao i prije, ako imamo veličinu elementa, kao i broj elemenata,
onda možemo igrati ovdje malo.
Recimo ja imam psa struct i tako onda želim da pročitate dva psa u isto vrijeme.
Što sam mogao učiniti je reći je veličina jednog elementa će biti veličine jednog psa
a ja ću da se zapravo čitanje dvije od njih.
Alternativno, ono što sam mogao učiniti je reći da sam samo ću pročitati jedan element
i da je jedan element će biti veličine dva psa.
Tako da je analogno tome možete vrsta poigrati s veličinom i brojem
ovisno o tome što je više intuitivan za vas.
>> U redu. Dakle, sada smo dobili na pisanje datoteka.
Kada želite napisati datoteku, prvi argument je zapravo gdje ste čitajući iz.
Tako da je u osnovi podataka koje ćete pisati u datoteku,
koji je izvan pokazivač na kraju.
Dakle, kada ste se bave s pset, pobrinite se da ne zbune.
Možda imaju definicije rame uz rame.
Možete povući definicije u priručniku upisivanjem čovjeka i onda fwrite, na primjer,
u terminalu, ili možete uputiti natrag na ovaj slajd
i pobrinite se da koristite pravi jedan.
Pa opet, za fwrite, kada imate datoteku koju želite pisati u,
to će biti posljednji argument i da će biti pokazivač na tu datoteku.
Dakle to je kako se nositi s pisanjem možda nekoliko bajtova u isto vrijeme,
ali recimo da želite samo napisati u samo jednom karaktera.
Kao što ćemo kasnije vidjeti, u ovom primjeru, u bitmape ćemo morati koristiti.
To je kada možemo koristiti fputc, bitno samo stavljajući jedan lik u isto vrijeme, Chr,
u file pointer, i to je naš iz pokazivač tamo.
Pa onda kad smo tražiti ili pisati u datoteku,
datoteka praćenje gdje smo.
Dakle, to je neka vrsta pokazivača, indikator datoteka položaj.
I tako svaki put kad smo napisati ili pročitati opet u datoteku,
file zapravo sjeća gdje je,
i tako se nastavlja od mjesta gdje je kursor.
To može biti korisno kada želite, recimo, pročitajte u određenom iznosu nešto učiniti
a zatim pročitati u sljedećem iznosu,
ali ponekad mi htjeti vratiti ili zapravo početi od određene referentne vrijednosti.
Pa onda fseek funkcija, što je to ipak nam omogućuje pomicanje kursora u određenoj datoteci
određeni broj bajtova.
A onda ono što mi moramo napraviti je odrediti gdje je referentna vrijednost.
Dakle, ili se kreće naprijed ili nazad odakle kursor trenutno je,
ili možemo navesti da je to samo treba premjestiti u od početka datoteke
ili od kraja datoteke.
I tako možete proći s negativnim ili pozitivnim vrijednostima na iznos,
i da će vrsta pomicanje kursora ili naprijed ili natrag.
>> Prije nego što smo dobili u drugim psets, bilo kakva pitanja o datoteci I / O?
Ok. Kao što smo dobili u više primjera, slobodno me zaustaviti na pitanja.
>> Tako je u detektivski roman, ti si predao bitmap datoteku sličan ovom crvenom jedan na slajdu,
i to izgleda ovako - hrpa crvene točkice - i stvarno ne znam što je napisano.
Ako škiljenje, možda ćete biti u mogućnosti vidjeti blagi plavkasto boje unutar sredini.
U osnovi, to je gdje je tekst pohranjen.
Tu je ubojstvo koje se dogodilo, a mi moramo saznati tko je to učinio.
Da bi to postigli, moramo nekako pretvoriti ovu sliku u čitljivom obliku.
Ako vi ikada susreo ovo, ponekad bi bilo malo setove
gdje bi povećalo sa crvenim filma. Svatko? Da.
Tako da će biti rukom nešto kao što je ovaj, te će imati povećalo
s crvenom filma preko njega, što bi ga stavio preko slike,
i ti bi bio u mogućnosti vidjeti poruke skrivene u njemu.
Mi nemamo povećalo s crvenim filma, pa umjesto da ćemo nekako stvoriti naš vlastiti
u ovom pset.
I tako je korisnik će ulaznog detektivski roman, tada trag,. Bmp,
tako da je INFILE, da je crvena točka poruka,
i onda oni govore verdict.bmp će biti naša outfile.
Dakle, to će stvoriti novu bitmap sliku sličan trag jednom
osim u čitljivom obliku u kojem možemo vidjeti skrivenu poruku.
>> Budući da ćemo se baviti uređivanjem i manipulira bitmape neke vrste,
idemo vrste ronjenja u u strukturi tih bitmap datoteke.
Išli smo preko tih malo u predavanju, ali pogledajmo u njih nešto više.
Bitmape su u suštini samo raspored bajtova
gdje smo naveli koji bajtova znači ono.
Dakle, ovdje je vrsta kao što su karte za bitmap slike
rekavši da se počne s nekim header datoteka, počinje s nekim informacijama u tamo.
Možete vidjeti da je oko byte broj 14 veličina je naznačeno u bitmap slike,
i nastavlja se.
No, onda ono što mi stvarno zanima ovdje počinje oko byte broj 54.
Imamo ove RGB trojke.
Što to će učiniti je sadrže stvarne piksela, boja vrijednosti.
Sve iznad toga u zaglavlju je neke informacije
odgovara veličini slike, širine slike, a visina.
Kad idemo u padding kasnije, vidjet ćemo zašto je veličina slike
može biti drugačiji od širine ili visine.
Pa onda za zastupanje te - ove bitmap slike su nizovi bitova -
ono što smo mogli učiniti je reći ok, ja ću se sjetiti da je na indeksu 14,
to je gdje je veličina, na primjer, ali umjesto što ćemo učiniti kako bi to lakše
je to utjelovljuje u struct.
I tako imamo dva tvorevina napravio za nas, BITMAPFILEHEADER
i BITMAPINFOHEADER,
i tako svaki put kad čitamo u toj datoteci, po defaultu to će biti idući u redu,
pa bi to također će ispuniti u varijablama kao što biWidth i biSize.
I onda na kraju, svaki piksel predstavlja tri bajtova.
Prvi je iznos od plave u pikselima, drugi je iznos od zelene,
i na kraju, u iznosu od crvene, gdje je 0 suštini nema plave ili zelene ili ne ne crvena
a zatim ff je najveća vrijednost.
To su heksadecimalni vrijednosti.
Dakle, ako imamo FF0000, onda to odgovara maksimalnom iznosu od plave
i onda nema zelene i ne crveni, pa onda da će nam dati plavi piksel.
Tada, ako imamo FF-a u cijeloj ploči, onda to znači da ćemo imati bijeli piksel.
To je vrsta nasuprot obično kada kažemo RGB. To se zapravo događa BGR.
>> Dakle, ako smo zapravo gledati u primjeru bitmap slike - neka me jednom podići ovdje.
To je malo mali.
Ja sam zooming in i možemo vidjeti da je pixelated. Izgleda blokovima boje.
Imate bijele blokove i zatim crveni blokova.
Ako igrate u Microsoft Paint, na primjer, možete napraviti nešto takvo
po osnovi samo slikarstvo određene kvadrata u određenom redoslijedu.
Pa što onda to znači da se u bitmap je kako slijedi.
Ovdje imamo prvi bijele piksele, da su svi 6 su f-a, a onda ćemo imati crvene piksela,
naznačeno 0000ff.
I tako je slijed bajtova koje imamo ukazuje kako je skenirana slika će izgledati.
Dakle, ono što sam učinio ovdje samo se piše sve one bajtova, a zatim obojen u crveno
tako da možete vidjeti vrste, ako žmirenje malo, kako to vrsta pokazuje smješko.
>> Način na koji bitmap slike rad Zamislio sam je u osnovi kao mrežu.
I tako po defaultu, svaki red rešetke mora biti višekratnik od 4 bajta.
Ako gledamo na bitmap slike, ti si ispunjavanja svaku vrijednost.
Na primjer, možda ćete morati crvena ovdje, a zeleno ovdje, plavom ovdje,
ali imate kako biste bili sigurni da je slika ispunjen s višestruko četiri bajta.
Dakle, ako želim da moje slike biti tri bloka širine, onda bih morati staviti praznu vrijednost
u posljednjem jednom da bi ga višekratnik četiri.
Pa onda bih dodati u nečemu što smo zovete padding.
Samo ću navesti da s x..
Sada kažu želimo sliku koja je sedam piksela dugo, za primjer.
Imamo 1, 2, 3, 4, 5, 6, 7,
i svi koji se popunjava s bojom.
Način na koji bitmap slike rade je da trebamo 8..
Trenutno imamo 1, 2, 3, 4, 5, 6, 7.
Trebamo 8 prostore za bitmap slike za čitanje ispravno.
Pa što onda moramo učiniti je dodati u samo malo padding
kako bi bili sigurni da su svi širinama su uniformu
i da su svi od širine su više od 4.
I tako sam prethodno navedeno, padding kao x ili squiggly linije,
ali u stvarnim bitmap slika padding je naznačeno heksadecimalnom 0.
Dakle, da bi se jedan lik, 0.
Što bi moglo doći u ruci je xxd naredba.
Što je to zapravo pokazuje, kao što slično što sam učinio prije sa smajli
kada sam zapravo ispisuje ono što svaka boja će biti za pikselu
i onda ga bojama, kada pokrenete xxd sa sljedećim naredbama,
onda će zapravo isprintati što su boje za one piksela.
Što morate učiniti je ovamo sam navesti, poput-S 54
kaže da ću početi na 54. bajtu
jer prije toga, sjetite se, ako se osvrnemo na karti od bitmape,
to je sve informacije u zaglavlju i stvari kao što je to.
Ali ono što mi je stvarno stalo je stvarni piksela koji ukazuju na boju.
Dakle, dodavanjem u tom zastavom,-a 54, onda smo u mogućnosti vidjeti vrijednosti boja.
I ne brinite o kompliciranim zastave i tome slično.
U spec. problema skup, morat ćete upute o tome kako koristiti xxd za prikaz piksela.
Dakle, ako ste vidjeli ovdje, to nekako izgleda kao zeleni okvir, ova mala stvar.
Ja sam bojama the 00ff00 kao osnovi govoreći nema plave, puno zelenila, a ne crveni.
Tako da odgovara zeleno.
Kao što ste vidjeli ovdje, vidimo zeleni pravokutnik.
Ovaj zeleni pravokutnik je samo 3 piksela, pa onda ono što mi moramo učiniti
kako bi bili sigurni da je fotografija višekratnik 4 širine je dodati u dodatnom podstavom.
I tako onda je to kako ste vidjeli ove 0S ovdje.
To će zapravo biti posljedica vašeg Resize pset,
bitno uzimanje male bitmapa, a zatim su ga povećali po četiri.
I tako ono što smo vidjeli je da je zapravo ova slika 12 piksela, ali 12 je višekratnik 4,
i tako mi zapravo ne vidim nikakve 0S na kraju jer mi ne treba dodati bilo
jer potpuno podstavljena. To ne imati bilo više prostora.
>> Ok. Sva pitanja o padding?
Ok. Cool.
>> Kao što sam spomenuo prije, bitmape su samo slijed bajtova.
I tako ono što imamo je, umjesto da trebaju pratiti točno koji broj byte
odgovara određenom elementu, mi zapravo su stvorili struct predstavljati to.
Dakle, ono što imamo je RGBTRIPLE struct.
Kad god imate instancu RGB triple,
jer je to vrsta definirati struct, onda možete pristupiti rgbtBlue varijablu,
Slično Zeleni i Crveni varijable, koji će ukazati koliko plava, zelena i crvena,
odnosno, imate.
>> Dakle, ako imamo plavu varijablu skup na 0, zelena postavljeno na ff,
koja je najveća vrijednost koju možete imati, a zatim crveni varijabla postavljena na 0,
onda ono što boje bi ovaj RGB trostruki predstavljaju? >> [Student] Zelena.
Zelena. Točno.
To će biti korisno da znaju da kad god imate instancu RGB triple,
zapravo možete pristupiti količinu boje - plava, zelena i crvena - odvojeno.
>> Sada kada smo razgovarali o strukturi da, ajmo se pogledati BMP datoteke.
To su tvorevina napravio za vas.
Ovdje imamo BITMAPFILEHEADER struct.
Od interesa je veličina.
Kasnije, imamo informacija zaglavlje, koji ima još nekoliko stvari koje su zanimljive za nas,
naime veličina, širina, i visina.
Kao što ćemo ići u kasnije, kada ste pročitali u spisu,
automatski čita u jer smo postavili redoslijed biti isti.
Tako biSize će sadržavati pravo bajtova koje odgovaraju stvarnoj veličini slike.
I onda ovdje, na kraju, kao što smo razgovarali o tome, imamo RGBTRIPLE typedef struct.
Imamo rgbtBlue, zelena i crvena povezane s njom.
>> Izvrsno. Ok.
Sada kada razumijemo bitmape malo, razumijem da imamo datoteka zaglavlja
i info zaglavlje povezana s njom, a onda nakon toga, imamo zanimljive stvari
od boja, i one boje predstavljaju RGBTRIPLE tvorevina,
a oni, pak, imaju tri vrijednosti povezane s plave, zelene i crvene.
>> Tako sada, možemo vrsta razmišljam o Oporavak malo.
Oprostite. Razmislite o detektivski roman.
Kada imamo trag datoteku, onda ono što želimo učiniti je čitati u njega piksel po piksel
i onda nekako promijeniti te piksele, tako da ga možemo čuti u čitljivom obliku.
I tako to izlaz, idemo pisati piksel po piksel u verdict.bmp datoteku.
To je vrsta puno učiniti. Svjesni smo toga.
Dakle, ono što smo učinili je da smo zapravo sam vam pružiti copy.c.
Što copy.c ipak samo čini točnu kopiju određenog bitmap datoteku, a zatim ga šalje.
Dakle, ovo je već otvara datoteku za vas, čita u pikselima po pikselu,
i onda ga piše u u izlaznu datoteku.
>> Idemo pogledati to.
Ovo je osigurati pravilno korištenje,
uzimajući datoteka ovdje.
Što to znači je to postavlja ulaznu datoteku da bude ono što smo prošli u u INFILE ovdje,
koji je naš drugi naredbenog retka argument.
Provjere kako bi bili sigurni da možemo otvoriti datoteku.
Provjere kako bi bili sigurni da možemo napraviti novi outfile ovdje.
Onda što to radi ovdje, to je samo u osnovi počinje čitanje na bitmap datoteku od početka.
Početak, kao što znamo, sadrži BITMAPFILEHEADER,
i tako ti nizovi bitova izravno će ispuniti BITMAPFILEHEADER.
Dakle, ono što imamo ovdje govori da BITMAPFILEHEADER BF -
to je naša nova varijabla tipa BITMAPFILEHEADER -
idemo staviti unutra BF ono što čitamo iz u pokazivač, koji je naš INFILE.
Koliko čitamo?
Čitamo u koliko bajtova trebamo sadrže cijeli BITMAPFILEHEADER.
Isto tako, to je ono što mi radimo za info zaglavlju.
Dakle, mi smo i dalje uz našu datoteku u INFILE,
i mi smo čitanje tih bitova i bajtova, a mi smo ih uključivanjem izravno u
u tim slučajevima varijabli koje smo izradu.
Ovdje smo samo pazeći da bitmapa je bitmapa.
>> Sada imamo outfile, zar ne?
Dakle, kao što stoji kad smo ga stvorili, to je bitno prazna.
Tako smo u osnovi stvoriti novi bitmapa od nule.
Ono što mi radimo je moramo biti sigurni da smo kopirati u datoteku zaglavlja
i info zaglavlje baš kao INFILE ima.
Ono što mi radimo je pišemo - i sjetite se da bf je varijabla
tipa BITMAPFILEHEADER, tako da ono što radimo je da smo samo koristiti taj sadržaj
pisati u outfile.
Evo, sjetite se što smo razgovarali o padding,
koliko je važno kako bi bili sigurni da je iznos piksela koji imamo je višekratnik 4.
To je prilično korisna formula za izračunati koliko padding imate
dao širina datoteci.
Želim ti dečki imati na umu da u copy.c imamo formulu za izračunavanje padding.
Ok? Dakle, svi zapamtiti. Izvrsno.
Pa što onda ne copy.c sljedeći je to ponovi nad svim scanlines.
To ide kroz retke, a zatim pohranjuje svaki trostruko da se čita
, a zatim ga piše u outfile.
Dakle ovdje smo čitati samo jedan RGB triple na vrijeme
a zatim stavljanjem tog istog triple u outfile.
Lukav dio je da padding nije RGB trostruki,
i tako ne možemo pročitati da je padding količinu RGB trojki.
Ono što mi moramo učiniti je zapravo samo premjestiti naš indikator položaja datoteke, premjestiti naše pokazivač,
na vrste preskočiti sve padding, tako da smo na sljedeći redak.
I što onda to radi je kopija vam pokazuje kako možda želite dodati padding.
Tako smo izračunati koliko padding trebamo,
pa to znači da moramo padding broj 0S.
Što to znači je za petlje da stavlja obloge broj 0S u našoj outfile.
I onda napokon, zatvorite obje datoteke. Možete zatvoriti INFILE kao i outfile.
>> Dakle, to je kako copy.c djela,
i da će to biti prilično korisna.
Umjesto da samo zapravo izravno kopirati i zalijepiti
ili samo gleda na to i piše u što god želite,
možda samo žele izvršiti ovu naredbu u terminalu,
k.č. copy.c whodunit.c, koji će stvoriti novu datoteku, whodunit.c,
koja sadrži isti sadržaj kao kopija radi.
Dakle ono što možemo učiniti je koristiti kao okvir na kojem će se graditi i uređivati
za naš detektivski roman datoteku.
>> To su naša za dos učiniti za detektivski roman, ali ono što čini copy.c
zapravo brine većina od njih za nas.
Dakle, sve što trebate učiniti je promijeniti piksela po potrebi
zapravo bi datoteka čitati.
Ne zaboravite da za određenu piksela triple, tako da za određenu varijablu tipa RGBTRIPLE,
možete pristupiti plava, zelena i crvena vrijednosti.
To će doći u ruci, jer ako im možete pristupiti,
to znači da možete ih provjeriti,
a to znači da možete ih promijeniti.
>> Dakle, kada smo otišli natrag do našeg crvenog povećalom, primjerice,
u osnovi, da je djelovao kao svojevrstan filter za nas.
Dakle, ono što želim učiniti je da želimo filtrirati sve trojke koje dolaze u.
Postoji nekoliko različitih načina da to učinite.
Uglavnom, možete imati što god vrsta filtera želite.
Možda želite promijeniti sve crvene piksela
ili možda želite promijeniti različite boje piksel drugoj boji.
To je do vas.
Ne zaboravite da možete provjeriti što boja piksel je
a onda možete ga promijeniti kao idete kroz.
>> Ok. Dakle, to je detektivski roman.
Nakon što pokrenete detektivski roman, znat ćete tko je krivac za zločin bio.
>> Sada ćemo ići na veličinu.
Mi ćemo i dalje se bave bitmape.
Što ćemo učiniti je da ćemo imati ulazne bitmapa
i onda ćemo proći u velikom broju, a zatim dobiti outfile bitmapa
gdje je to u osnovi naša INFILE umanjiti n.
Recimo moj datoteka je samo jedan piksel velika.
Onda ako je moj n je 3, skaliranje po tri, onda bih ponoviti taj piksel n broj puta,
tako tri puta, a zatim ga i umanjiti tri puta kao dobro.
Pa vidiš ja ga skaliranje okomito i vodoravno.
>> I onda evo primjera.
Ako imate n = 2, vidjet ćete da je prvi plavi piksel postoji ponavlja dva puta
horizontalno, kao i dva puta vertikalno.
I onda da se nastavlja dalje, i tako ćete imati izravan skaliranje svoje originalne slike po dvije.
>> Dakle, ako smo bili detaljno pseudocode za to, želimo otvoriti datoteku.
I onda znajući da ako se vratimo ovdje,
vidimo da širina za outfile će biti drugačiji od širine za INFILE.
Što to znači?
To znači da naša informacije u zaglavlju će se promijeniti.
I tako ono što ćete želite učiniti je ažurirati header informacije,
znajući da kad čitamo u spisima ako djeluju na copy.c okvira,
već imamo varijablu koja označava ono što je veličina i slične stvari.
Dakle, nakon što su to, ono što možda želite učiniti je promijeniti te određene varijable.
Zapamtite, ako imate struct, kako ste pristupili varijabli unutar toga.
Možete koristiti dot operator, zar ne?
Pa onda pomoću toga, znate da ćete morati promijeniti header informacije.
Dakle, ovdje je samo popis stvarnih elemenata koje će se promjene u datoteci.
Veličina datoteke će se mijenjati, slike, kao i širinu i visinu.
Pa onda ide natrag na karti od bitmape,
pogledati da li je datoteka zaglavlja ili info zaglavlje koje sadrži tu informaciju
i onda promijeniti prema potrebi.
Opet, kažu k.č. copy.c resize.c.
To znači da resize.c sada sadrži sve što je sadržano u kopiji
jer kopija daje nam način čitanja u svakom scanline piksela po pikselu.
Osim sada, umjesto da samo promjenom vrijednosti kao što smo učinili u detektivski roman,
ono što želim učiniti je da želimo pisati u više piksela
dok naša je n veći od 1.
>> Onda ono što želimo učiniti je želimo ga se protežu vodoravno n,
kao i protežu okomito n.
Kako bismo mogli to učiniti?
Recimo vaš n 2 i imate ovaj dao INFILE.
Vaš kursor će početi u prvoj,
i ono što želite učiniti ako je n 2, želite ispisivati ​​u dvije od njih.
Dakle, ispis u dvije od njih.
Tada vaš kursor će se premjestiti na sljedeću piksela, što je crveni,
i to će ispisati dvije od tih one crvene, to dodavanjem na ono što je učinio prije.
Zatim pokazivač će se pomaknuti na sljedeći piksel i nacrtati u dvije od njih.
Ako pogledate natrag u copy.c okvira, što to radi ovdje
se stvara novu instancu RGB triple, nova promjenjiva zove triple.
I ovdje kad se čita u nju, ona čita iz INFILE 1 RGBTRIPLE
i pohranjuje unutar tog trostrukog varijable.
Pa onda vi zapravo imate varijablu koja predstavlja taj određeni piksel.
Onda kada pišete, što možda želite učiniti je okružuju fwrite izjavi u za petlje
da ga piše u svoj outfile onoliko puta koliko je potrebno.
To je jednostavna.
Samo u osnovi ponoviti proces pisanja n broj puta da ga ljestvici horizontalno.
>> Ali onda se moramo sjetiti da je naš padding će se promijeniti.
Prije toga, reći da smo imali nešto duljine tri.
Tada smo upravo bi dodati u koliko padding? Samo još jedan kako bi ga višekratnik 4.
No, reći da smo skaliranje ovu posebnu sliku n = 2.
Dakle koliko plave piksela bi smo na kraju? Želimo imati šest.
1, 2, 3, 4, 5, 6. U redu.
6 nije više od 4. Što je najbliži višekratnik 4? To će biti osam.
Dakle, mi zapravo će imati dva znakove padding tamo.
>> Se bilo tko sjetiti ako imamo formulu za izračun padding
i gdje bi moglo biti?
[Nečujno učenik odgovor] >> Da, copy.c. Točno.
Tu je formula u copy.c izračunati koliko padding imate
dao određenu širinu bitmap slike.
Dakle to će biti korisno kada trebate dodati u određenom iznosu od padding
zapravo shvatiti koliko padding trebate dodati.
Ali jedna napomena, ipak, je da želite da biste bili sigurni da ste korištenjem pravu veličinu.
Samo budite oprezni jer ste u osnovi ćeš se bave dva bitmap slike.
Vi želite da biste bili sigurni da ste koristeći pravo jedan.
Kada ste izračuna padding za outfile, želite koristiti širinu outfile
a ne širina prethodnog.
>> Izvrsno. Takav brine istezanje cijeli bitmap sliku vodoravno.
No, ono što želimo učiniti je zapravo ga se protežu okomito kao dobro.
To će biti malo složenije jer kada smo završili kopiranje red
i pisanje taj redak, naš pokazivač će biti na kraju.
Dakle, ako smo ponovno čitati, onda je to samo ide na čitanje u sljedeći redak.
Dakle, ono što želimo učiniti je vrsta pronaći neki način kopiranja one retke ponovno
ili samo vrsta uzimanje taj redak, a zatim ga prepisati opet.
Kao što sam nekako aludirala, postoji nekoliko različitih načina da to učinite.
Što možete učiniti je kao da idete kroz čitanje i kroz određeni scanline
i to mijenja koliko je potrebno, a zatim vrsta trgovine sve one piksela u polju.
Onda kasnije znate da ćete trebati isprintati taj niz opet,
i tako možete jednostavno koristiti taj niz to učiniti.
Drugi način da to učinite je da bi mogao kopirati dolje jedan redak,
Razumijem da morate kopirati da opet, tako da zapravo premjestiti vaš kursor,
i da će se koristiti metodu fseek.
Ti bi mogao premjestiti vaš kursor skroz natrag i ponovite kopiranje proces ponovno.
>> Dakle, ako naš skaliranje broj je n, onda koliko puta bi se moramo vratiti
i prepisati liniju? >> [Student] n - 1. >> Da, savršena. n - 1.
Mi smo to učinili već jednom, pa onda ćemo htjeti ponoviti ide natrag proces
n - 1 količinu vremena.
Ok. Dakle, tamo imate svoju funkciju veličinu.
>> Sada možemo doći do stvarno zabavan dio, moja omiljena pset, koji je oporaviti.
Umjesto bitmape, ovaj put smo se bave JPEG.
Mi zapravo ne daje sliku samo za JPEG,
mi dao osnovi sirovi format memorijskih kartica.
I tako to sadrži malo info i smeće vrijednosti u početku,
i onda počinje i ima hrpa JPEG datoteka.
Međutim, mi smo predao karticu gdje smo izbrisani fotografije;
suštini, mi smo zaboravili gdje su fotografije koje se nalazi unutar kartice.
Dakle naš zadatak u Obnova je proći kroz ovaj kartice formatu
i naći one slike opet.
>> Srećom, struktura JPEG datoteka i kartica Datoteka je malo pomogla.
To definitivno mogao biti malo složenije ako to nisu bili u ovom konkretnom obliku.
Svaki JPEG datoteka zapravo počinje s dva moguća slijeda, gore navedenih.
Uglavnom, kad god imate novu JPEG datoteku,
počinje s obje nizu ffd8 ffe0 ili onaj drugi, ffd8 ffe1.
Još jedna korisna stvar je znati da su JPEG pohranjeni contiguously.
Dakle, kad jednom JPEG datoteka završava, a druga počinje jedan.
Dakle, ne postoji bilo kakav-u između vrijednosti tamo.
Nakon što pogodak početak JPEG, ako ste već čitajući JPEG,
znate da ste pogoditi kraj prethodne i početak sljedećeg jedan.
>> Za vrste vizualizirati to, napravio sam shemu.
Još jedna stvar o JPEG je da ih možemo pročitati u sekvenci 512 bajtova na vrijeme,
slično s početkom kartice.
Mi ne treba provjeru svakog pojedinog bajta jer bi to sisati.
Dakle, umjesto toga, ono što možemo učiniti je zapravo samo čitati u 512 bajtova na vrijeme
i onda, umjesto da provjere između onih u tim sitnim malim komadima,
možemo samo provjeriti početka 512 bajtova.
U suštini, u toj slici, ono što vidite je u početku kartice,
imate vrijednosti koje zapravo nisu relevantni za aktualne JPEG samih.
Ali onda ono što imam je zvijezda ukazuju na jednu od dvije početne sekvence za JPEG.
Dakle, kad vidite zvijezdu, znate da imate JPEG datoteku.
I onda svaki JPEG datoteka će biti neki višekratnik od 512 bajtova
ali ne nužno isti višekratnik.
Način da znate da ste pogodio još JPEG je ako udariti drugu zvijezdu,
drugi pokretanje slijed bajtova.
Onda ono što imate ovdje je imate datoteku crveni JPEG trajnu dok ne pogoditi zvijezdu,
koji je označen novom bojom.
Možete nastaviti i onda udariti drugu zvijezdu, hit još JPEG,
i dalje sve do kraja.
Vi ste na posljednjoj slici ovdje, ružičasta jedan.
Možete ići do kraja dok ne pogoditi kraj datoteke karaktera.
To će biti jako korisno.
>> Prije nekoliko glavnih Zaključci ovdje:
File kartica ne početi s JPEG,
ali jednom JPEG počinje, sve JPEG pohranjeni su uz bok jedan drugome.
>> Neki pseudocode za oporavak.
Prvo, mi ćemo otvoriti naše kartice datoteku,
i da će se koristiti našu sliku I / O funkcije.
Mi ćemo ponoviti sljedeće proces dok smo došli do kraja datoteke.
Idemo čitati 512 bajtova na vrijeme.
A ono što sam rekao ovdje je da ćemo ga pohraniti u međuspremnik,
pa u osnovi držati na onim 512 bajtova dok ne znamo točno što učiniti s njima.
Onda ono što želimo učiniti je da želimo provjeriti da li smo pogodak zvijezdu ili ne.
Ako smo pogodak zvijezdu, ako smo pogodak jedan od početnih sekvenci,
onda znamo da smo hit novu JPEG datoteku.
Ono što ćete želite učiniti je da ćemo želite stvoriti novu datoteku u našem pset4 imeniku
nastaviti izradu tu datoteku.
No, isto tako, ako smo već napravili JPEG prije,
onda želimo završiti tu datoteku i gurnuti ga na pset4 mapu,
gdje ćemo imati da datoteke pohranjene jer ako mi ne navedete da ste završili smo tu JPEG datoteku,
onda smo u osnovi će imati neodređen iznos. U JPEG nikada neće završiti.
Dakle, želimo biti sigurni da kada smo čitati u JPEG datoteku i piše kako je,
želimo posebno zatvoriti da bi se otvoriti sljedeći.
Mi ćemo želite provjeriti nekoliko stvari.
Mi želimo provjeriti da li smo na početku novog JPEG s našim tampon
i ako smo već našli JPEG prije
jer to će promijeniti svoj proces blago.
Dakle nakon što ste proći kroz sve način i pogodio kraj datoteke,
što onda ćete želite učiniti je da ćete želite zatvoriti sve datoteke koje su trenutno otvorena.
To će vjerojatno biti zadnja JPEG datoteka koje imate,
kao i kartice datoteke koje ste se bave.
>> Posljednji prepreka da se moramo pozabaviti je kako zapravo napraviti JPEG datoteku
i kako zapravo ga gurnuti na mapi.
The pset zahtijeva da svaki JPEG da vam se u sljedećem formatu,
gdje imate broj. jpg.
Broj, čak i ako je 0, mi to zovemo 000.jpg.
Kad god vam je JPEG u svom programu,
idete da želite da ga imenuju u cilju da se nalazimo.
Što to znači?
Moramo vrste pratiti koliko smo našli
i što broj svakog JPEG bi trebao biti.
Ovdje ćemo iskoristiti u sprintf funkciji.
Slično printf, koji je upravo vrsta otisaka vrijednost van u terminalu,
sprintf ispisuje datoteku van u mapu.
I tako što će to učiniti ako sam imao sprintf, naslov, a zatim niz tamo,
to bi isprintati 2.jpg.
Uz pretpostavku da sam zatvorio svoje datoteke ispravno,
koji će sadržavati datoteku da sam bio pisanje van.
No, jedna stvar je da kod koji imam ovdje
ne sasvim zadovoljava ono pset zahtijeva.
The pset zahtijeva da drugi JPEG datoteka treba biti imenovana 002 umjesto samo dvije.
Dakle, kada ste ispisali ime, onda možda možda želite promijeniti rezervirano blago.
>> Se bilo tko sjetiti kako smo omogućiti dodatne prostore kada smo ispisali nešto?
Da. >> [Student] Ti staviti tri posto između znaka i dva. >> Da, savršena.
Vi ćete staviti tri u ovom slučaju, jer želimo prostor za tri.
% 3d vjerojatno će vam dati 002.jpg umjesto dva.
Prvi argument u funkciji sprintf je zapravo char array,
koje smo ranije poznavali kao žice.
Oni volja, vrsta više kao privremeno skladištenje, samo pohraniti rezultanta niz.
Vi stvarno ne će se baviti s tim, ali morate ga uključiti.
>> Znajući da je svaki naziv datoteke ima broj, koji traje do tri znaka,
i onda. jpg, koliko dugo treba ovo polje biti?
Izbacite broj. Koliko znakova u naslovu, u ime?
Dakle, tu je tri hashtags, razdoblje, jpg. >> [Student] 7. >> 7. Nije baš.
Mi ćemo htjeti 8 jer želimo omogućiti null terminator kao dobro.
>> Konačno, samo izvući proces koji ćete biti događaj za oporavak,
imate neki početak informacije.
Vi se nastaviti sve dok vam početak JPEG datoteku,
i da može biti ili jedan od dva počevši sekvenci.
Možete držati na čitanje. Svaki udarac ovdje predstavlja 512 bajtova.
Možete zadržati na čitanju, držati na čitanje sve dok se susretnete drugu početnu sekvencu.
Nakon što su to, na kraju tekućeg JPEG - u ovom slučaju, to je crveni,
tako da želite završiti to.
Želite sprintf ime koje u svoj pset4 mapu,
onda želite otvoriti novu JPEG i onda držati na čitanje
dok naiđete sljedeći.
Imajte na čitanje, držati na čitanje,
i onda na kraju, na kraju, ti ćeš do kraja datoteke,
i tako ćete želite zatvoriti posljednji JPEG da ste radili s,
sprintf da u svoj pset4 mapu, a zatim pogledate sve slike koje ste stečen.
Te slike su zapravo slike CS50 osoblja,
pa to je gdje je dio bonus zabavno od pset dolazi u
je da se natječu u odjeljcima pronaći TFS u slikama
i fotografirati se s njima dokazati da ste učinili pset
i tako možete vidjeti koji su članovi osoblja su na slikama.
Pa onda se slika s osobljem. Ponekad ćete morati da ih potjerati dolje.
Vjerojatno neki od njih će pokušati pobjeći od vas.
Možete slikati s njima.
To je u tijeku. To nije zbog kada pset je zbog.
Rok će biti objavljen u spec..
Tada zajedno sa svojim poglavlju, ovisno o tome što dio traje najviše slika
s najviše članova osoblja će pobijediti prilično strašan nagradu.
To je vrsta poticaja da biste dobili vaše pset4 završio što je brže moguće
jer tada možete dobiti na posao
lov dolje sve različite CS50 članova osoblja.
To nije obavezno, ipak, tako da nakon što ste dobili slike,
onda ste gotovi s pset4.
>> I ja sam završio s četiri prohod, pa hvala vam svima što ste došli.
Sretno s forenzika. [Pljesak]
[CS50.TV]