[Powered by Google Translate] [Walkthrough - Problēma Set 4]
[Zamyla Chan - Hārvarda]
[Tas ir CS50. - CS50.TV]
Labi. Sveiki, visiem, un laipni uz 4 Walkthrough.
>> Šodien mūsu PSET ir kriminālistikas.
Kriminālistikas ir patiešām jautri PSET kas ietver nodarbojas ar bitkartes failus
atklāt, kas izdarījis noziegumu.
Tad mēs ejam, lai mainītu dažus bitkartes failus,
tad mēs esam arī gatavojas risināt ar patiesi jautru daļa sauc Atgūt,
kurā mēs būtībā pasniedza atmiņas karti
, kurā kāds ir nejauši svītrots visus savus failus,
un mēs lūdza piedzīt šos failus.
>> Bet vispirms, pirms mēs nokļūt PSET, es tiešām tikai gribu apsveikt visus.
Mēs esam par viduspunktā šo kursu.
Viktorīna 0 ir aiz mums, un mēs esam pie pset4, tāpēc būtībā, mēs esam pusceļā.
Mēs esam nogājuši garu ceļu, ja paskatās atpakaļ uz savu psets, pset0 un pset1,
tik apsveikt sevi par to,
un mēs esam gatavojas nokļūt daži patiešām fun stuff.
>> Tātad mūsu Toolbox par šo PSET, atkal, nevis rādīt sudo Yum-y atjauninājumu,
mēs esam spējīgi tikai palaist update50 ja jūs esat pie versijas 17,3 un virs no ierīces.
Tāpēc pārliecinieties, lai palaistu update50 - tas ir daudz vieglāk, dažiem mazāk rakstzīmes -
lai pārliecinātos, ka jūs esat pie jaunāko versiju ierīces.
Īpaši tas ir svarīgi, lai update50 kad mēs sāktu izmantot CS50 Check.
Tāpēc pārliecinieties, ka jūs darīt.
>> Par visu par šo PSET sadaļām,
mēs gribam būt darīšana ar failu ieejām un izejām, failu I / O
Mēs ejam, lai būtu iet pa daudz programmas, kas nodarbojas ar masīviem
norādot uz failiem un lietām, piemēram, ka,
tāpēc mēs vēlamies, lai pārliecinātos, ka mēs esam patiesi pazīstami un ērts
nodarbojas ar to, kā ieejas un izejas uz failu.
>> Izplatīšanas kodu šim PSET ir failu sauc copy.c,
un tas, ko mēs spēsim atrast būs ļoti noderīga, lai mums
jo mēs ejam, lai galu galā faktiski kopējot copy.c failu
un vienkārši mainīt to nedaudz, lai varētu sasniegt pirmos 2 daļas problēmu kopumu.
>> Un tā tad kā jau minēju iepriekš, mums ir darīšana ar bitkartes, kā arī JPEG.
Tik tiešām izprastu struktūru, kā šie faili tiek organizēti,
kā mēs varam patiesi tulkot 0s un 1s uz structs
un lietas, ko mēs faktiski var saprast un interpretēt un rediģēt,
kas būs ļoti svarīgi,
lai iet uz JPEG un bitkartes failus un izprast struktūru tiem.
>> Pset4, kā ierasts, sākas ar daļu no jautājumiem.
Tie, tiks galā ar failu I / O un saņemt jūs pieraduši, ka.
Tad daļa 1 ir Detektīvromāns, kurā jūs esat dota bitkartes failu
kas izskatās veida, piemēram sarkaniem punktiem visā.
Un tad būtībā tas, ko mēs gatavojamies darīt, ir veikt šo failu un vienkārši rediģēt to nedaudz
par versiju, ka mēs varam lasīt.
Būtībā, kad mēs apdare, mums būs pašu failu,
ja mums būs iespēja redzēt slēpto ziņojumu aizsegt ar visiem tiem sarkanajiem punktiem.
Tad maiņa ir programma, kas, ņemot vērā failu
un tad dots nosaukums failu, kas to rezultātus, un pēc tam piešķir numuru, kā arī,
faktiski mainīt šo bitmap šī veselam skaitlim.
Tad visbeidzot, mums ir Atgūt PSET.
Mums ir dota atmiņas karti un tad ir atgūt visas fotogrāfijas
kas ir nejauši svītrots,
bet, kā mēs mācīties, faktiski nav dzēsti un izņemti no lietas materiāliem;
Mēs tikko veida zaudēja kur viņi bija failā, bet mēs ejam, lai atgūtu to.
>> Lieliski. Tā iet uz failu I / O konkrēti, tie ir viss saraksts funkcijas, kas jums tiks izmantojat.
Jūs jau esat redzējuši mazliet pamatus fopen, fread un fwrite,
bet mēs ejam apskatīt tālāk daži failu I / O funkcijas, piemēram, fputc,
, kurā jūs vienkārši rakstīt vienu rakstzīmi laikā,
līdz fseek, kur jūs veida pārvietot failu stāvokļa indikatoru uz priekšu un atpakaļ,
un tad daži citi. Bet mēs iedziļināties ka mazliet vēlāk laikā PSET.
>> Tātad, pirmkārt, vienkārši nokļūt failu I / O pirms mēs iedziļināties PSET,
lai atvērtu failu, piemēram, to, kas jums jādara, ir faktiski noteikt rādītāju uz šo failu.
Tātad mums ir fails * rādītāju.
Šajā gadījumā, es esmu aicinot to jo rādītājs, jo tas būs mans infile.
Un tāpēc es esmu gatavojas izmantot funkciju fopen un tad no faila nosaukumu
un tad režīms, kurā es esmu būs darīšana ar failu.
Tātad tur ir "R" šajā gadījumā par lasīšanu, "W" ierakstīšanai, un tad "" par pievienojot.
Piemēram, ja jums ir darīšana ar INFILE
un visi jūs vēlaties darīt, ir lasīt bitiem un baitiem saglabātos tur,
tad jūs, iespējams, gatavojas vēlaties izmantot "r", kā savu režīmu.
Ja jūs vēlaties, lai faktiski rakstīt, veida veikt jaunu failu,
tad ko mēs gatavojamies darīt, ir, mēs esam gatavojas atvērt jaunu failu
un izmantot "w" režīmā rakstīšanai.
>> Tātad tad, kad jūs faktiski lasījums uz failiem, struktūra ir šāda.
Vispirms jums ir rādītāju uz struct kas saturēs baiti ka jūs lasāt.
Tāpēc, ka būs beigas atrašanās baiti ka jūs lasāt.
Jūs pēc tam dodas uz norādītu izmēru, piemēram būtībā cik daudz baitu
Jūsu programma ir lasīt uz failu, izmērs būtībā viens elements ir,
un tad jūs gatavojas noteikt, cik daudz elementi jūs vēlaties lasīt.
Un tad beidzot, jums ir jāzina, kur jūs lasāt no,
lai būs jūsu in rādītājs.
Es krāsu kodēta šiem, jo ​​fread ir arī ļoti līdzīga fwrite,
izņemot jūs vēlaties, lai pārliecinātos, ka jūs izmantojat pareizo secību,
pārliecinieties, ka jūs faktiski rakstiski vai lasīt no labās lietas.
>> Tātad, tad kā iepriekš, ja mums ir elementa lielumu, kā arī par lielu elementu skaitu,
tad mēs varam spēlēt aptuveni šeit mazliet.
Teikt man ir suns struct un tā tad es gribu lasīt divi suņi laikā.
Ko es varētu darīt, ir teikt lielums viena elementa būs lielumu viens suns
un es esmu gatavojas faktiski lasīt divus no tiem.
Alternatīvi, ko es varētu darīt, ir teikt, es esmu tikai gatavojas lasīt vienu elementu
un ka viens elements būs lielums divi suņi.
Tātad, tas ir analogs kā jūs varat veida spēlēt aptuveni ar izmēru un skaita
Atkarībā no tā, ko ir vairāk intuitīvi jums.
>> Labi. Tāpēc tagad mēs līdz rakstīšanas failus.
Ja jūs vēlaties rakstīt failu, pirmais arguments ir faktiski kur jūs lasāt no.
Tā ka būtībā tie dati, kas gatavojas rakstīt failā,
kas ir ārpus rādītājs beigās.
Tātad, ja jums ir darīšana ar PSET, pārliecinieties, ka Jums nav get sajaukt.
Varbūt ir definīcijas blakus.
Jūs varat pull definīcijas up rokasgrāmatā, uzrakstot vīrieti un tad fwrite, piemēram,
terminālā, vai arī jūs varat nodot atpakaļ šo slaidu
un pārliecinieties, ka jūs izmantojat pareizo vienu.
Tātad vēlreiz, lai fwrite, kad jums ir fails, kas jūs vēlaties rakstīt par,
kas būs pēdējais arguments un ka būs rādītājs uz šo failu.
Tātad, tad tas, kā mēs galā ar rakstisku varbūt vairākas bytes laikā,
bet ka vēlaties tikai rakstīt tikai vienu rakstzīmi.
Kā mēs redzēsim vēlāk šajā piemēram, tādās bitkartes mums nāksies izmantot to.
Tas ir, kad mēs varam izmantot fputc, būtībā tikai liekot vienu rakstzīmi laikā, CHR,
uz failu rādītājs, un tas ir mūsu kas rādītājs tur.
Lai tad, kad mēs cenšamies vai rakstīt failā,
fails sekotu, kur mēs esam.
Tātad, tas ir sava veida kursora, failu pozīcijas indikators.
Un tāpēc, ja mēs rakstīt vai lasīt atkal failā,
fails patiesībā atceras, kur tā ir,
un tā tas turpinās no kurienes kursors.
Tas var būt izdevīga, ja jūs vēlaties, lai, teiksim, lasot noteiktu summu, lai kaut ko darīt
un pēc tam lasīt šādā apmērā,
bet dažreiz mēs varētu vēlēties doties atpakaļ vai tiešām sākt no noteiktā atsauces vērtību.
Tātad tad fseek funkcija, ko tas ir ļauj mums, lai pārvietotu kursoru noteiktā failā
noteiktu skaitu baitu.
Un tad ko mums ir jādara, ir norādīt, kur atsauces vērtība ir.
Tātad, vai nu tas kustas uz priekšu vai atpakaļ, no kurienes kursors ir patlaban,
vai mēs varam norādīt, ka tas būtu tikai kustēties no sākuma failu
vai no beigām failu.
Un lai jūs varētu pāriet uz negatīvu vai pozitīvu vērtību līdz summai,
un kas būs sava veida pārvietotu kursoru nu uz priekšu vai atpakaļ.
>> Pirms mēs nokļūt citās psets, kādi jautājumi par failu I / O?
Labi. Kā mēs nokļūt vairāk piemēru, justies brīvi, lai apturētu mani jautājumiem.
>> Tātad detektīvromāns, jūs pasniedza bitkartes failu līdzīgs šim sarkanā, uz slaida,
un izskatās, ka tas - ķekars sarkaniem punktiem - un jums nav tiešām zināt, kas rakstīts.
Ja jūs šķielēt, jums var būt iespēja redzēt nelielu zilganu krāsu iekšpusē vidū.
Būtībā, tas ir, ja teksts tiek saglabāta.
Tur bija slepkavība, kas notika, un mums ir nepieciešams, lai uzzinātu, kas to darīja.
Lai to izdarītu, mums ir nepieciešams, lai veida pārveidot šo attēlu lasāmā formātā.
Ja jūs puiši kādreiz radušās, reizēm būtu maz komplekti
kur tu būtu ar palielināmo stiklu ar sarkanu filmu. Ikviens? Yeah.
Tātad jūs būtu roku kaut kas līdzīgs šim, jūs būtu ar palielināmo stiklu
ar sarkano plēvi pār to, jūs varētu nodot to pa attēlu,
un jūs varētu redzēt ziņu paslēptas tajā.
Mums nav palielināmais stikls ar sarkanu plēvi, tā vietā mēs spēsim veida radītu mūsu pašu
Šajā PSET.
Un tāpēc lietotājam būs ieejas detektīvromāns, tad pavediens. Bmp,
tā ka infile, kas ir sarkanais punkts ziņa,
un tad viņi saka verdict.bmp būs mūsu OUTFILE.
Tātad tas notiek, lai izveidotu jaunu bitkartes attēlu līdzīgs pavediens 1
izņemot lasāmā formātā, kur mēs varam redzēt slēpto ziņojumu.
>> Tā kā mēs gribam būt darīšana ar rediģēšanu un manipulējot bitkartes par kādu,
mēs spēsim veida nirt struktūrai šo bitkartes failus.
Mēs devāmies pa šo mazliet lekciju, bet pieņemsim apskatīt tos dažas vairāk.
Bitkartes būtībā tikai izkārtojums baitu
kur mēs esam norādījuši baiti nozīmē ko.
Tātad, šeit ir veids kā kartē no bitmap attēlu
sakot, ka tas sākas ar dažiem header failus, sākas ar kādu informāciju tur.
Jūs redzēsiet, ka aptuveni baitu numurs 14 lielums tiek norādīts no bitmap attēlu,
un tas turpinās.
Bet tad ko mēs esam patiesi ieinteresēti šeit sākas ap baitu skaitu 54.
Mums ir šīs RGB trīskāršojas.
Ko tas gatavojas darīt, ir jāiekļauj faktiskos pikseļi, krāsu vērtības.
Viss iepriekš, ka galvenē ir daži informāciju
atbilst attēla izmēru, no attēla platums, un augstums.
Kad mēs iedziļināties polsterējumu vēlāk, mēs redzēsim, kāpēc attēla izmēra
varētu būt atšķirīgs nekā platums vai augstums.
Tātad, tad, lai pārstāvētu šos - šie bitmap attēli ir sekvences baitu -
ko mēs varētu darīt, ir teikt labi, es esmu gatavojas atcerēties, ka pēc 14 indeksu,
tas ir, ja izmērs ir, piemēram, bet tas, ko mēs gatavojamies darīt, lai padarītu šo vieglāk
ir rezumēju to struct.
Un tāpēc mums ir divi structs izgatavoti mums, BITMAPFILEHEADER
un BITMAPINFOHEADER,
un tāpēc, ja mēs lasām uz šo failu, pēc noklusējuma tas būs dodas kārtībā,
un tāpēc, lai tas arī notiek, lai aizpildītu uz mainīgajiem kā biWidth un biSize.
Un tad beidzot, katrs pikselis pārstāv trīs baitiem.
Pirmais ir summa, zilā pikseļu, otrais ir summa zaļa,
un visbeidzot, sarkanā, kur 0 ir būtībā nav zils vai nav zaļā summa vai ne sarkans
un tad FF ir maksimālā vērtība.
Tie ir heksadecimālais vērtības.
Lai tad, ja mums ir FF0000, tad kas atbilst maksimālajai summai zila
un tad nav zaļa un ne sarkans, tā tad tas dotu mums zilu pikseli.
Tad, ja mums ir FF ir visā kuģa, tad tas nozīmē, ka mums ir baltā pikseļu.
Tas ir sava veida pretī parasti, kad mēs sakām RGB. Tas patiesībā notiek BGR.
>> Tātad, ja mēs faktiski izpētīt piemērs bitkartes attēlu - ļaujiet man pull vienu augšu šeit.
Tas nedaudz mazu.
Es esmu attālināt, un mēs varam redzēt tas pixelated. Izskatās bloki krāsu.
Jums ir baltas blokus un tad sarkans blokiem.
Ja tu spēlē Microsoft Paint, piemēram, jūs varētu darīt kaut ko līdzīgu, ka
ko būtībā tikai krāsošana dažas kvadrātus noteiktā secībā.
Tātad, tad ko tas nozīmē uz bitmap ir šāda.
Šeit mums ir pirmais baltais pikseļi, ka visi 6 ir F s, un tad mums ir sarkanas pikseļi,
norāda 0000FF.
Un tā baitu ka mums ir secība norāda, kā bitmap attēlu gatavojas izskatās.
Tātad, ko es esmu darījusi šeit ir tikai rakstīts visus šos bytes un tad iekrāsota sarkanā
lai jūs varētu veida redzēt, ja jūs šķielēt mazliet, cik šāda veida norāda smiley sejas.
>> Tā, ka bitmap attēlus darbs es iedomāties to būtībā kā režģī.
Un tā pēc noklusējuma, katrs no režģa rindā ir jābūt reizinājumam 4 baiti.
Ja mēs skatāmies bitmap attēlu, jūs aizpildot katrā vērtībā.
Piemēram, jūs varētu būt sarkans šeit, zaļā šeit, zils šeit,
bet jums ir pārliecināties, ka attēls tiek aizpildīts ar dalās četru baitu.
Tātad, ja es vēlos, lai mana attēlu, trīs bloki plata, tad es būtu likts tukša vērtība
Pēdējās vienas lai padarītu to dalās ar četri.
Tātad, tad es varētu pievienot kaut ko mēs esam aicinot polsterējumu.
Es esmu tikai gatavojas norādīt, ka ar x.
Tagad saka, ka mēs vēlamies attēlu, kas ir 7 pikseļi garš, piemēram.
Mums ir 1, 2, 3, 4, 5, 6, 7,
un visu, kas ir aizpildīts ar krāsu.
Tā, ka bitmap attēlus darbs ir, ka mums ir nepieciešams 8..
Tieši tagad mums ir 1, 2, 3, 4, 5, 6, 7.
Mums nepieciešams 8 atstarpes bitmap attēlu, lai lasītu pareizi.
Tātad, tad kāda mums ir jādara, ir pievienot tikai mazliet polsterējuma
lai pārliecinātos, ka visi platumi ir vienota
un ka visi platumi ir dalās ar 4.
Un tāpēc es iepriekš norādīju, polsterējumu kā x vai neskaidro līniju,
bet faktiskā bitmap attēlu polsterējums ir norādīta ar heksadecimālo 0.
Lai būtu viena rakstzīme, 0.
Kas varētu noderēt ir xxd komanda.
Kas tas ir faktiski parāda jums, tāpat kā līdzīgs tam, ko es darīju pirms ar smaidiņu
kad es patiešām iespiež, ko katra krāsa būtu par pikseli
un tad krāsu kodēta tā, kad jūs darbināt xxd ar šādām komandām,
tad tas būs tiešām izdrukāt kādi krāsas ir par tiem pikseļiem.
Kas jums ir jādara, ir vairāk nekā šeit es norādītu, tāpat 54-s
saka, ka es esmu gatavojas sākt ko 54 baits
jo pirms tam, jāatceras, ja mēs atskatāmies uz kartes no bitkartes,
ka viss galvenes informāciju un lietām, piemēram, ka.
Bet tas, ko mēs patiešām rūp, ir faktiskais skaits, kas norāda uz krāsu.
Tātad, pievienojot šajā karogu,-iem 54, tad mēs varam redzēt krāsu vērtības.
Un nav jāuztraucas par sarežģītu karogiem un lietām, piemēram, ka.
Jo problēma noteiktā spec, jums ir virzienos par to, kā izmantot xxd lai parādītu pikseļi.
Tātad, ja jūs redzēt šeit, tas veida izskatās zaļās kastes, šī mazā lieta.
Es esmu krāsu kodēta the 00ff00 kā būtībā saka nē Blue, zaļa daudz, un ne sarkano.
Tāpēc, ka atbilst zaļu.
Kā jūs redzat šeit, mēs redzam zaļu taisnstūri.
Šī zaļā taisnstūris ir tikai 3 pikseļu plats, lai pēc tam, kas mums ir jādara
lai pārliecinātos, ka attēls ir vairāku 4 plaša ir pievienot papildu polsterējumu.
Un tad tas, kā jūs redzēt šo 0s šeit.
Tas faktiski būs rezultāts jūsu Resize PSET,
būtībā, ņemot mazu bitkartes un tad paplašinot to ar 4.
Un tā, ko mēs redzam, ka patiesībā šis attēls ir 12 pikseļi plats, bet 12 ir dalās ar 4,
un tāpēc mēs faktiski neredzu 0s beigās, jo mums nav nepieciešams pievienot jebkuru
jo tas ir pilnībā polsterētas. Tas nav neviena vairāk vietas.
>> Labi. Kādi jautājumi par polsterējumu?
Labi. Atdzist.
>> Kā jau minēju iepriekš, bitkartes ir tikai secība baitu.
Un tā, kas mums ir, nevis nepieciešams, lai sekotu tieši kuri skaita baits
atbilst noteiktam elementu, mēs faktiski esam izveidojuši struct pārstāvēt to.
Tātad, kas mums ir RGBTRIPLE struktūrai.
Ikreiz, kad jums ir gadījums RGB triple,
jo tas ir veids definēt struct, tad jūs varat piekļūt rgbtBlue mainīgo,
Tāpat zaļā un sarkanā mainīgie, kas norāda, cik daudz zila, zaļa un sarkana,
attiecīgi, jums ir.
>> Tātad, ja mums ir zilo mainīgo uz 0, zaļā iestatīts uz FF,
kas ir maksimālā vērtība var būt, un tad sarkana mainīgais iestatīts uz 0,
tad kāda krāsa būtu tas īpaši RGB triple pārstāv? >> [Students] Zaļā.
Zaļa. Tieši tā.
Tas būs noderīgi zināt, ka, ja jums ir gadījums RGB triple,
Jūs faktiski var piekļūt krāsu daudzumu - zils, zaļš un sarkans - atsevišķi.
>> Tagad, ka mēs esam runājuši par struktūru, kas, pieņemsim apskatīt BMP failu.
Tie ir structs par jums.
Šeit mums ir BITMAPFILEHEADER struct.
Interese ir izmērs.
Vēlāk, mums ir informācija header, kas ir vēl dažas lietas, kas ir interesanti mums,
proti izmērs, platums, un augstums.
Kā mēs iedziļināties vēlāk, kad jūs lasīt uz failu,
tas automātiski skan, jo mēs esam noteikt kārtību, lai būtu tāds pats.
Tātad biSize būs tiesības baitus kas atbilst faktiskajām attēla izmēru.
Un tad šeit, visbeidzot, kā mēs esam runājuši par to, mums ir RGBTRIPLE typedef struktūrai.
Mums ir rgbtBlue, zaļš un sarkans saistīti ar to.
>> Lieliski. Labi.
Tagad, kad mēs saprotam bitkartes mazliet, saprotu, ka mums ir faila galvene
un informācija galvene saistīts ar to un tad pēc tam, mums ir daudz ko interesantu
no krāsām, un šīs krāsas pārstāv RGBTRIPLE structs,
un tie, savukārt, ir trīs vērtības, kas saistītas ar zilo, zaļo, un sarkanā krāsā.
>> Tāpēc tagad, mēs varam veida domā par Atgūt mazliet.
Žēl. Padomā par detektīvromāns.
Kad mums ir mūsu pavediens failu, tad ko mēs vēlamies darīt, ir lasīt to pixel by pixel
un tad kaut mainīt šos pikseļus, lai mēs varētu izvadīt to lasāmā formātā.
Un tāpēc, lai atveidotu to, mēs esam gatavojas rakstīt pixel by pixel iekļaušanu verdict.bmp failā.
Tas ir sava veida daudz darāmā. Mēs saprotam, ka.
Tātad, ko mēs esam darījuši, ir, mēs esam faktiski sniedz jums ar copy.c.
Kas copy.c dara, ir tikai padara precīzu kopiju no konkrētā bitkartes failu un pēc tam izvada to.
Tātad tas jau atvērts fails jums, skan pixel by pixel,
un tad raksta to savos izejas failu.
>> Pieņemsim to apskatīt to.
Šis ir nodrošināt pareizu lietošanu,
iegūt filenames šeit.
Kas tas ir tas nosaka ievades failu, lai tas, ko mēs esam pieņemts ar INFILE šeit,
kas ir mūsu otrais komandrindas arguments.
Pārbaudes, lai pārliecinātos, ka mēs varam atvērt failu.
Pārbaudes, lai pārliecinātos, ka mēs varam veikt jaunu OUTFILE šeit.
Tad ko tas dara šeit, tas tikai pamatā sāk lasīt uz bitkartes failu no sākuma.
Sākums, kā mēs zinām, satur BITMAPFILEHEADER,
un tāpēc šie biti sekvencēm būs tieši aizpildīt BITMAPFILEHEADER.
Tātad, ko mēs esam šeit ir saprotams, ka BITMAPFILEHEADER BF -
tas ir mūsu jaunais tipa mainīgais BITMAPFILEHEADER -
mēs spēsim likt iekšā bf ko mēs lasām no in rādītājs, kas ir mūsu infile.
Cik daudz mēs lasīt?
Mēs lasām, cik daudz baitu mums ietver pilnu BITMAPFILEHEADER.
Tāpat, ka tas, ko mēs darām par info galveni.
Tāpēc mēs turpinām pa mūsu faila INFILE,
un mēs esam lasījums šos bitus un baitus, un mēs tapām tos tieši
uz šiem mainīgajiem lielumiem, kas mēs nesam instancēs.
Šeit mēs esam tikai pārliecinoties, ka Bitkartes ir bitkarte.
>> Tagad mums ir OUTFILE, vai ne?
Tā kā tas nozīmē, kad mēs to izveidotu, tas ir būtībā tukša.
Tāpēc mums ir būtībā izveidot jaunu bitkarti no nulles.
Ko mēs darām, ir mums ir jāpārliecinās, ka mēs nokopēt faila galvene
un informācija galveni tāpat kā INFILE ir.
Ko mēs darām, ir mūsu rakstīt - un atcerēties, ka BF ir mainīgs
tipa BITMAPFILEHEADER, lai to, ko mēs darām, ir mēs tikai izmantot šo saturu
rakstīt uz outfile.
Lūk, atcerieties, ka mēs runājām par polsterējumu,
cik tas ir svarīgi, lai pārliecinātos, ka pikseļu, kas mums ir summa ir dalās ar 4.
Tas ir diezgan noderīgs formula, lai aprēķinātu, cik daudz polsterējuma esat
ņemot platums no jūsu failu.
Es gribu jūs guys atcerēties, ka copy.c mums ir formula, lai aprēķinātu polsterējumu.
Labi? Tāpēc ikviens atcerēties. Lieliski.
Tātad, tad kāda copy.c dara nākamais ir tas vairākkārt uzsvērts pār visu scanlines.
Tas iet cauri rindām vispirms un tad saglabā katru trīskāršu ka tā skan
un tad raksta to uz outfile.
Tātad, tad šeit mēs esam lasījums tikai viena RGB Triple laikā
un pēc tam liekot ka paši Triple uz outfile.
Kutelīgs daļa ir tas, ka polsterējums nav RGB triple,
un tā mēs varam ne tikai lasīt, ka polsterējums summa RGB trīskāršojas.
Kas mums ir jādara, ir faktiski tikai pārvietot mūsu failu stāvokļa indikatoru, pārvietot mūsu kursoru,
veidam izlaist visu polsterējumu, lai mēs esam pie nākamajā rindā.
Un tad ko tas dara, ir kopija parāda, kā jūs varētu vēlēties pievienot polsterējumu.
Tāpēc mēs esam aprēķināts, cik polsterējums mums vajag,
lai tas nozīmē, ka mums ir nepieciešams polsterējums skaitu 0S.
Kas tas ir par cilpu, kas liek polsterējums skaitu 0S mūsu outfile.
Un tad beidzot, aizveriet abus failus. Aizverot INFILE kā arī OUTFILE.
>> Tātad tas, kā copy.c darbi,
un kas būs diezgan noderīga.
Nevis tikai faktiski tieši iekopējot to
vai vienkārši skatoties uz to un rakstīt neatkarīgi vēlaties,
Jūs varētu vienkārši vēlaties izpildīt šo komandu terminālā,
cp copy.c whodunit.c, kas radīs jaunu failu, whodunit.c,
kas satur tieši tādu pašu saturu, kā kopiju dara.
Tātad tad ko mēs varam darīt, ir izmantot šo kā pamatu, uz kura būvēt un rediģēt
mūsu Detektīvromāns failu.
>> Tie ir mūsu to-dos darīt detektīvromāns, bet ko copy.c dara
ir faktiski rūpējas par lielāko daļu no tiem par mums.
Tāpēc viss, kas mums jādara tālāk, ir jāmaina pikseļus, kā nepieciešams
faktiski veikt failu lasāma.
Atcerieties, ka par konkrēto pikseli trīskāršu, tāpēc par konkrētu tipa mainīgais RGBTRIPLE,
Jūs varat piekļūt zilā, zaļā un sarkanā vērtības.
Tas notiek, lai noderēs, jo, ja jūs varat piekļūt tiem,
tas nozīmē, ka jūs varat arī pārbaudīt tos,
un tas nozīmē, ka jūs varat arī mainīt.
>> Tātad, kad mēs devāmies atpakaļ uz mūsu sarkanā palielināmā stikla, piemēram,
būtībā, ka rīkojās kā sava veida filtrs mums.
Tātad, ko mēs vēlamies darīt, ir, mēs vēlamies, lai filtrētu visus trīskāršojas, kas nāk iekšā
Ir vairāki dažādi veidi, kā to darīt.
Būtībā, jums var būt jebkāda veida filtru vēlaties.
Varbūt jūs vēlaties mainīt visas sarkanās pikseļus
vai varbūt jūs vēlaties mainīt atšķirīgu krāsu pikseļu uz citu krāsu.
Tas ir atkarīgs no jums.
Atcerieties, ka jūs varat pārbaudīt, kādi krāsu pikseļu
un tad jūs varat arī mainīt to, kā jūs iet cauri.
>> Labi. Tātad tas ir Detektīvromāns.
Kad jūs palaist detektīvromāns, jūs zināt, kas ir par nozieguma vaininieks bija.
>> Tagad mēs esam gatavojas doties uz Mainīt lielumu.
Mēs ejam, lai joprojām būtu darīšana ar bitkartes.
Ko mēs darīsim, ir mums nāksies ievades bitmap
un tad mēs spēsim iziet ar numuru un tad saņemt OUTFILE bitmap
ja tas būtībā mūsu infile samazināts ar n.
Saka mans fails bija tikai viens pikseļu liels.
Tad, ja mans n bija 3, zvīņošanās ar 3, tad es atkārtoju, ka lielums n reižu skaitu,
tā 3 reizes, un pēc tam arī mērogot, 3 reizes, kā arī.
Tātad jūs redzat, es esmu mērogošana to vertikāli, gan horizontāli.
>> Un tad šeit ir piemērs.
Ja jums ir n = 2, jūs redzēsiet, ka pirmā zilā pikseļu tur atkārto divas reizes
horizontāli, kā arī divas reizes vertikāli.
Un tad turpina, un tāpēc jums ir tieša mērogošanas savu sākotnējo attēlu ar divi.
>> Lai tad, ja mēs precīzi noteikt pseudocode par to, mēs vēlamies, lai atvērtu failu.
Un tad zinot, ka, ja mēs ejam atpakaļ šeit,
mēs redzam, ka par outfile platums būs atšķirīgs nekā platums par INFILE.
Ko tas nozīmē?
Tas nozīmē, ka mūsu galvenes informāciju gatavojas mainīt.
Un tā, ko mēs vēlamies darīt, ir atjaunināt header info,
zinot, ka tad, kad mēs lasīt failus, ja jūs darbojas uz copy.c regulējumu,
mums jau ir mainīgais, kas norāda kāda izmērs ir, un lietas, piemēram, ka.
Tātad, kad jums ir, ka, ko jūs varētu vēlēties darīt, ir mainīt šos īpašos mainīgos.
Atcerieties, ja jums ir struct, kā jūs varat piekļūt mainīgos šajā.
Jūs izmantot dot operatoram, vai ne?
Tātad, tad, izmantojot šo, jūs zināt, ka jums būs nepieciešams, lai mainītu galvenes info.
Tātad šeit ir tikai saraksts ar faktisko elementu, kas notiek, mainās failā.
Faila izmērs būs, mainās, attēlu, kā arī platums un augstums.
Tātad, tad dodas atpakaļ uz kartes no bitkartes,
apskatīt, vai tas ir faila galvene vai informācija galveni, kas satur šo informāciju
un tad mainīt pēc vajadzības.
Atkal, teiksim kp copy.c resize.c.
Tas nozīmē, ka resize.c tagad ir viss, kas ir ietverts iekšā kopiju
jo kopija sniedz mums veids, kā lasīt katram scanline pikseli pa pikselim.
Izņemot tagad, nevis tikai mainot vērtības, piemēram, mēs darījām detektīvromāns,
ko mēs vēlamies darīt, ir, mēs vēlamies rakstīt vairākos pikseļos
kamēr mūsu n ir lielāks par 1.
>> Tad ko mēs vēlamies darīt, ir, mēs vēlamies, lai stiept to horizontāli ar n,
kā arī stiept to vertikāli ar n.
Kā varētu mums darīt?
Teikt savu n ir 2 un jums ir šī dota INFILE.
Kursoru gatavojas sākt pie pirmā,
un ko jūs vēlaties darīt, ja n ir 2, jūs vēlaties drukāt 2 no tām.
Tātad jūs drukāt 2 no tām.
Tad jūsu kursors gatavojas pāriet uz nākamo pikseļu, kas ir sarkanā viens,
un tas notiek, lai izdrukātu 2 no tiem sarkanvīniem, pievienojot to uz ko tas ir darīts līdz šim.
Tad kursors pārvietosies uz nākamo pikseļu un izdarīt 2 no tām.
Ja paskatās atpakaļ uz copy.c sistēmā, ko tas dara tieši šeit
ir tas rada jaunu gadījumu RGB triple, jaunu mainīgo sauc triple.
Un šeit, kad tas skan uz to, tas skan no 1 INFILE RGBTRIPLE
un saglabā to iekšpusē šī triple mainīgs.
Tātad, tad jums tiešām ir mainīgs pārstāv šo konkrēto pikseli.
Tad, kad jūs rakstāt, ko jūs varētu vēlēties darīt, ir iesaiņot fwrite paziņojumu stājās uz cilpas
ka raksta to savā outfile tik reižu, cik nepieciešams.
Tas ir pavisam vienkārši.
Tikai pamatā atkārto rakstīšanas procesu n reizes numuru mērogam to horizontāli.
>> Bet tad mums ir jāatceras, ka mūsu polsterējums gatavojas mainīt.
Agrāk, teiksim, mums bija kaut par 3 garumā.
Tad mēs varētu vienkārši pievienot cik daudz polsterējums? Tikai viens vairāk, lai padarītu to dalās ar 4.
Bet saku mēs mērogošanas šo konkrēto attēlu, n = 2.
Tātad, tad cik zili pikseļi mums būtu beigās? Mums būtu 6.
1, 2, 3, 4, 5, 6. Labi.
6 nav dalās ar 4. Kas tuvākajam gada 4? Tas būs 8.
Tāpēc mēs esam patiešām nāksies 2 rakstzīmes polsterējumu tur.
>> Vai kāds atceras, ja mums ir formula, lai aprēķinātu polsterējumu
un ja tas varētu būt?
[Dzirdams studentu reaģēšanas] >> Jā, copy.c. Tiesības.
Ir arī copy.c formulu, lai aprēķinātu, cik daudz polsterējuma esat
dod īpašu platumu bitkartes attēlu.
Tātad, tad tas būs noderīgi, ja jums ir nepieciešams pievienot noteiktu daudzumu polsterējumu
reāli izrēķināt cik daudz polsterējums nepieciešams pievienot.
Bet viena piezīme, lai gan, ir tas, ka jūs vēlaties, lai pārliecinātos, ka jūs izmantojat pareizo izmēru.
Tikai jābūt uzmanīgiem, jo ​​jūs būtībā būs darīšana ar divām bitmap attēlu.
Jūs vēlaties pārliecināties, ka jūs izmantojat pareizo vienu.
Kad esat Aprēķinot polsterējums par outfile, jūs vēlaties izmantot platumu outfile
un nevis platums iepriekšējā.
>> Lieliski. Šāda veida rūpējas stiepjas veselu bitkartes attēlu horizontāli.
Bet tas, ko mēs vēlamies darīt, ir faktiski stiept to vertikāli, kā arī.
Tas būs mazliet trickier, jo, kad mēs esam pabeiguši kopēšanu rindu
un rakstot šīs rindas, mūsu kursors būs beigās.
Tātad, ja mēs lasām vēlreiz, tad tas ir tikai gatavojas lasīt uz nākamo rindiņu.
Tātad, ko mēs vēlamies darīt, ir veida atrast kādu veidu, kopējot tos rindas atkal
vai vienkārši veida pieņemtu šo rindu un tad pārrakstot to vēlreiz.
Kā es veida pieminēja, ir vairāki dažādi veidi, kā to darīt.
Ko jūs varētu darīt, ir, kā jūs iet cauri, un iepazīšanās ar īpašu scanline
un mainot to, kā nepieciešams, tad veida veikala visus šos masīva pikseļi.
Tad vēlāk par jums zina, ka jums ir nepieciešams izdrukāt ka masīvu atkal,
un lai jūs varat izmantot šo masīvu darīt.
Vēl viens veids, kā to izdarīt, ir, jūs varētu kopēt uz leju vienu rindu,
saprotu, ka jums ir nepieciešams, lai kopētu, ka atkal tik tiešām pārvietot kursoru,
un kas notiek, lai būt, izmantojot metodi fseek.
Jūs varētu pārvietot jūsu kursors visu ceļu atpakaļ un tad atkārtojiet kopēšanas procesu vēlreiz.
>> Tātad, ja mūsu mērogošana skaits ir n, tad cik reizes mums ir jāiet atpakaļ
un pārrakstīt līniju? >> [Students] n - 1. >> Jā, perfekta. n - 1.
Mēs esam darījuši jau vienreiz, tāpēc tad mēs vēlamies atkārtot atgriežās procesu
n - 1 summa reizes.
Labi. Tātad jums ir jūsu resize funkciju.
>> Tagad mēs varam nokļūt patiesi jautru daļa, mana mīļākā PSET, kas ir atgūt.
Vietā bitkartes, šoreiz mums ir darīšana ar JPEG.
Mēs esam patiešām nav dota failu tieši no JPEG,
mēs esam dota būtībā raw atmiņas kartes formātu.
Un tāpēc tas ir mazliet info un atkritumu vērtībām sākumā,
un tad tas sākas un tā ir ķekars JPEG failus.
Tomēr mēs esam pasniedza kartīti, kur mēs esam svītrots fotogrāfijas;
būtībā, mēs esam aizmirsuši, kur fotogrāfijas ir atrodas uz kartes.
Tātad, tad mūsu uzdevums Atgūt ir iet caur šo apliecību formātā
un atrast tās bildes vēlreiz.
>> Par laimi, no JPEG failus un kartes failu struktūra ir nedaudz noderīga.
Tas noteikti varētu būt mazliet trickier, ja tā nav šajā konkrētajā formātā.
Katru JPEG fails patiesībā sākas ar diviem iespējamiem sekvences, kas minēts iepriekš.
Būtībā, ja jums ir jauna JPEG failu,
tas sākas ar vai nu secīgi ffd8 ffe0 vai otrs, ffd8 ffe1.
Vēl viena noderīga lieta zināt, ka JPEG tiek uzglabāti contiguously.
Tātad, ja viens JPEG fails beidzas, otrs sākas.
Tāpēc tur vairs nav in-starp vērtībām tur veida.
Tiklīdz jūs hit sākums JPEG, ja jūs esat jau lasījis JPEG,
Jūs zināt, ka esat sasniedzis beigas iepriekšējo un nākamo sākumu.
>> Veidam iztēloties šo, es shematisks.
Vēl viens par JPEG lieta ir tā, ka mēs varam lasīt tos sekvences no 512 baitu laikā,
Tāpat ar sākuma kartes.
Mums nav nepieciešams pārbaudīt katru baitu, jo tas būtu sūkāt.
Tā vietā, ko mēs varam darīt, ir faktiski tikai lasīt 512 bytes laikā
un tad, nevis pārbaudīt starp tiem šajās tiny maz šķēles,
mēs varam tikai pārbaudīt sākumā 512 baitiem.
Būtībā šajā attēlā, ko jūs redzat, ir sākumā uz kartes,
Jums ir vērtības, kas nav īsti atbilstoši faktiskajām JPEG sevi.
Bet tad ko man ir zvaigzne norādīt vienu no diviem starta secības JPEG.
Tātad, ja jūs redzat kādu zvaigzni, jūs zināt, ka jums ir JPEG failu.
Un tad katru JPEG fails būs daži dalās ar 512 baitiem
bet ne vienmēr tās pašas kompleksās.
Veidā, ka jūs zināt, ka jūs esat hit citu JPEG ir, ja jūs hit citu zvaigzni,
cits sākuma secība baitu.
Tad ko jūs šeit ir jums sarkano JPEG failu turpina, līdz jūs hit zvaigzne,
kas ir norādīta ar jaunu krāsu.
Jūs turpināt un tad jūs hit citu zvaigzni, jūs hit citu JPEG,
Jūs turpināt visu ceļu līdz beigām.
Tu esi pēdējā attēlā šeit, rozā vienu.
Tu iet uz beigām, līdz jūs hit beigām failu raksturs.
Tas būs patiesi noderīga.
>> Daži galvenie takeaways šeit:
Kartes failu nesākas ar JPEG,
bet tad, kad JPEG sākas, visi JPEG tiek glabāti līdzās viens otram.
>> Daži pseudocode par Atgūt.
Pirmkārt, mēs esam gatavojas atvērt mūsu kartes failu,
un kas notiek, lai, izmantojot mūsu failu I / O funkcijas.
Mēs ejam, lai atkārtot šādu procesu, kamēr mēs esam sasnieguši failu.
Mēs ejam, lai izlasītu 512 baiti laikā.
Un ko es teicu šeit ir, mēs esam gatavojas glabāt to buferi,
tāpēc būtībā turēt uz tiem 512 baitiem, kamēr mēs zinām, tieši to, ko darīt ar tiem.
Tad ko mēs vēlamies darīt, ir, mēs vēlamies, lai pārbaudītu, vai mēs esam hit zvaigzni vai ne.
Ja mēs esam hit zvaigzni, ja mēs esam hit viens no starta secību,
tad mēs zinām, ka mēs esam hit jaunu JPEG failu.
Ko mēs vēlamies darīt, ir, mēs esam gatavojas vēlaties, lai izveidotu jaunu failu mūsu pset4 direktorijā
turpināt veikt šo failu.
Bet arī, ja mēs jau esam sasnieguši JPEG pirms,
tad mēs vēlamies, lai izbeigtu šo failu un push to pset4 mapi,
ja mums būs, ka fails glabājas, jo, ja mums nav jānorāda, ka mēs esam beidzās, ka JPEG failu,
tad mēs būtībā ir nenoteikta summa. Ar JPEG nekad nebeigsies.
Tāpēc mēs vēlamies, lai pārliecinātos, ka tad, kad mēs esam lasīt, lai JPEG failā, un rakstot, ka,
Mēs vēlamies īpaši tuvu, ka, lai atvērtu nākamo.
Mēs vēlamies, lai pārbaudītu vairākas lietas.
Mēs vēlamies, lai pārbaudītu, vai mēs esam sākumā jaunu JPEG ar mūsu buferi
un arī tad, ja mēs jau esam atraduši JPEG pirms
jo tas mainīs savu procesu nedaudz.
Tātad, tad kad jūs iet cauri visiem ceļu un jūs hit beigām failu,
tad ko jūs vēlaties darīt, ir, jūs vēlaties aizvērt visus failus, kas pašlaik ir atvērti.
Tas, iespējams, būs pēdējais JPEG fails, ka jums ir,
kā arī kartotēkas, ka jūs esat nodarbojas ar.
>> Pēdējais šķērslis, kas mums ir jārisina, ir, kā faktiski padarīt JPEG failu
un kā patiesībā push to uz mapi.
The PSET nosaka, ka katram JPEG, ka jūs atradīsiet ir šādā formātā,
kur jums ir numurs. jpg.
Numuru, pat ja tas ir 0, mēs to saucam 000.jpg.
Ikreiz, kad jūs atradīsiet JPEG savu programmu,
jūs gatavojas to nosaukt tādā secībā, ka tas ir atrasts.
Ko tas nozīmē?
Mums ir nepieciešams, lai veida izsekot, cik daudz mēs esam noskaidrojuši
un kāda ir katras JPEG skaitam jābūt.
Šeit mēs ejam, lai izmantotu sprintf funkcijas.
Līdzīgs ar printf, kas tikai veida izdrukas vērtība ārā terminālā,
sprintf izdrukā failu ārā mapi.
Un tā, ko tas varētu darīt, ja man bija sprintf, īpašumtiesības, un tad virkne tur,
tas izdrukāt 2.jpg.
Pieņemot, ka es esmu slēgts savu failus pareizi,
kas satur failu, kas man bija izrakstīšanas.
Bet viena lieta ir tā, ka kods, kas man ir šeit
nav gluži atbilst kāda PSET prasa.
The PSET paredz, ka otrā JPEG faila nosaukumam jābūt 002 nevis 2 tikai.
Tātad, ja jūs izdrukāt vārdu, tad varbūt jūs varētu vēlēties mainīt vietturi nedaudz.
>> Vai kāds atceras, kā mēs varētu papildus telpām, kad mēs drukāt kaut ko?
Yeah. >> [Students] Jūs ievietot 3 starp procentu zīmi un 2. >> Jā, perfekta.
Jūs ievietot 3 šajā gadījumā, jo mēs vēlamies telpu 3.
% 3d būtu iespējams, jums 002.jpg nevis 2.
Pirmais arguments vērā sprintf funkciju faktiski char masīvs,
ko mēs agrāk zinājām, kā stīgas.
Tie būs, sava veida vairāk kā pagaidu glabāšanā, tikai glabāt rezultējošo virkni.
Jums nav īsti nodarbojas ar šo, bet jums ir nepieciešams iekļaut to.
>> Zinot, ka katrs faila nosaukums ir numurs, kas aizņem trīs rakstzīmes,
un tad jpg,. cik ilgi būtu tas masīvs būt?
Izsviest numuru. Cik rakstzīmes nosaukumā, nosaukuma?
Tātad tur ir 3 hashtags, periods, jpg. >> [Students] 7. >> 7. Ne gluži.
Mēs esam gatavojas vēlaties 8, jo mēs vēlamies, lai būtu iespējams null terminatoru kā arī.
>> Visbeidzot, tikai izņemt process, kas jums būs darīt, lai atgūtu,
Jums ir kāda sākuma informāciju.
Jūs turpināt, līdz jūs atradīsiet sākums JPEG failā,
un kas var būt vai nu viens no diviem starta secību.
Jūs turēt uz lasījumā. Katru slīpsvītra šeit pārstāv 512 baiti.
Jums vajadzētu turēt uz lasījumā, turēt uz lasījumā, līdz jūs sastopaties citu sākuma secība.
Kad jums ir, ka jūs galu pašreizējo JPEG - šajā gadījumā, tas ir sarkans viens,
lai jūs vēlaties, lai izbeigtu to.
Jūs vēlaties, lai sprintf nosaukumu ka jūsu pset4 mapi,
tad jūs vēlaties, lai atvērtu jaunu JPEG un tad turēt uz lasījumā
līdz jūs sastopaties nākamo.
Turēt uz lasījumā, turēt uz lasījumā,
un tad beidzot, beidzot, jūs gatavojas sasniegt beigām failu,
un lai jūs vēlaties, lai aizvērtu pēdējo JPEG ka tu strādā ar,
sprintf kas savā pset4 mapē, un pēc tam apskatīt visus attēlus, kas tu būsi.
Šie attēli ir faktiski bildes CS50 darbinieki,
un tā tas ir, ja bonuss jautri daļa no PSET nāk
ir tas, ka jums ir konkurējoši jūsu sadaļās, lai atrastu TFS tajās attēlos
un veikt bildes ar viņiem, lai pierādītu, ka jūs esat darījuši PSET
un lai jūs varētu redzēt, kas darbinieki ir bildes.
Tā, tad jums veikt bildes ar darbiniekiem. Dažreiz jums ir pakaļdzīšanās tos.
Iespējams, daži no viņiem mēģinās palaist prom no jums.
Fotografējot ar viņiem.
Tas turpinās. Tas nav saistīts kad PSET ir jāmaksā.
Termiņš tiks paziņots spec.
Tad kopā ar savu sadaļu, izvēloties sadaļā aizņem visvairāk bildes
ar lielāko darbinieku iegūs diezgan laba balvu.
Tas ir sava veida stimuls, lai saņemtu savu pset4 beidza pēc iespējas ātrāk
jo tad jūs varat saņemt uz leju, lai biznesā
nomedīšanas visiem dažāda CS50 darbiniekiem.
Tas nav obligāti, lai gan, tāpēc, kad jums iegūt attēlus,
tad jums ir pabeidzis ar pset4.
>> Un es esmu beidzis ar 4 Walkthrough, tāpēc paldies visiem par ierašanos.
Good luck ar kriminālistikas. [Aplausi]
[CS50.TV]