[Powered by Google Translate] [Solisyon - Set Pwoblèm 4] [Zamyla Chan - Inivèsite Harvard] [Sa a se CS50. - CS50.TV] Tout dwa. Hello, tout moun, epi byenveni nan solisyon 4. Jodi a pset nou an, se Medsin legal. Medsin legal se yon pset reyèlman amizan ki enplike nan fè fas ak dosye bitmap yo dekouvri ki komèt yon krim. Lè sa a, nou pral Rdimansyone kèk dosye bitmap, Lè sa a, n ap tou ale nan fè fas ak yon pati yo rele Reprann reyèlman plezi, nan ki n ap fondamantalman lage yon kat memwa nan ki yon moun te aksidantèlman efase tout dosye yo, epitou n ap mande yo geri moun dosye. Men, an premye, anvan nou jwenn nan pset a, mwen reyèlman jis vle felisite tout moun. Nou se sou a pwen milye a nan kou sa a. Kwiz 0 se dèyè nou, epi nou ap nan pset4, se konsa esansyèlman, nou 're a a demi. Nou te vini yon fason lontan si w gade tounen nan psets ou a, pset0 ak pset1, Se konsa felisite tèt ou sou sa, e nou pral jwenn nan kèk bagay reyèlman amizan. Se konsa, bwat zouti pou nou an pou sa a pset, ankò, olye pou yo kouri sudo Yum-y update, nou ap kapab jis kouri update50 si ou se nan vèsyon 17.3 ak pi wo a nan aparèy la. Se konsa, asire w ke ou kouri update50 - li nan yon pi fasil anpil, yon kèk mwens karaktè - asire w ke ou se nan vèsyon an dènye nan aparèy la. Espesyalman li enpòtan yo update50 lè nou kòmanse lè l sèvi avèk CS50 chèk la. Se konsa, asire w ke ou fè sa. Pou tout nan seksyon yo ki pou sa a pset, nou ap pral fè fas ak entrain dosye ak sorti, ranpli I / O. Nou ap pral ale sou yon anpil nan pwogram ki fè fas ak ranje lonje dwèt nan dosye ak bagay sa yo tankou sa, pou nou vle asire ke nou ap reyèlman abitye epi alèz ki gen rapò ak ki jan yo opinyon ak pwodiksyon nan dosye. Nan kòd la distribisyon pou sa a pset se yon dosye rele copy.c, ak sa a, se sa nou ap ale nan jwenn a pwal vrèman itil ak nou paske nou ap ale nan fini aktyèlman kopye dosye a copy.c ak jis chanje li yon ti kras pou kapab reyalize premye 2 pati pyès sa yo nan mete nan pwoblèm. Se konsa, Lè sa a, kòm mwen mansyone anvan, nou ap fè fas ak bitmap kòm byen ke JPEGs. Se konsa, reyèlman konprann estrikti a nan ki jan sa yo dosye yo òganize, ki jan nou ka vrèman tradui 0s la ak 1S nan strukt ak bagay sa yo ke nou ka aktyèlman konprann ak entèprete ak edit, ki pral vrèman enpòtan, se konsa pral antre nan JPEG ak dosye bitmap ak konprann estrikti nan moun sa yo. Pset4, kòm dabitid, kòmanse ak yon seksyon nan kesyon yo. Moun sa yo ki pral fè fas avèk dosye mwen / O epi pou yo jwenn ou abitye ak sa. Lè sa a, pati 1 se Whodunit, nan ki w ap bay yon dosye bitmap ki sanble kalite tankou pwen wouj tout lòt peyi sou. Lè sa a, fondamantalman sa nou pral fè se pran sa a ranpli ak jis edite li yon ti kras nan yon vèsyon ke nou ka li a. Esansyèlman, yon fwa nou fini, n ap gen dosye a menm, eksepte nou pral kapab wè mesaj la kache kache nan tout moun sa yo pwen wouj. Lè sa a, rdimansyonman se yon pwogram ki, yo bay yon dosye ak Lè sa a, bay non an nan dosye a ke li sorti ak Lè sa a, bay yon nimewo kòm byen, pral aktyèlman Rdimansyone ki bitmap nan ki valè antye ki pè. Lè sa a, anfen, nou gen pset la geri. Nou ap bay yon kat memwa ak Lè sa a, gen refè tout nan foto yo ki te aksidantèlman efase, men, jan nou pral aprann, pa aktyèlman efase ak retire yo nan dosye a; nou jis kalite pèdi kote yo te gen nan dosye a, men nou ap ale nan refè sa. Great. Se konsa, ale nan dosye mwen / O espesyalman, sa yo, se yon lis antye nan fonksyon ki ou pral lè l sèvi avèk. Ou te deja wè yon ti jan Basics yo nan fopen, frèd, ak fwrite, men nou ap ale nan gade pi plis nan kèk dosye Mwen / fonksyon O tankou fputc, nan ki ou jis ekri yon karaktè nan yon moman, fik, kote ou kalite deplase endikatè ki pozisyon dosye anvwa ak bak, ak Lè sa a, kèk lòt moun. Men, nou pral ale nan ki yon ti jan pita pandan pset la. Se konsa, premye, jis jwenn nan dosye mwen / O anvan nou ale nan pset a, yo louvri yon dosye, pou egzanp, ki sa ou dwe fè se aktyèlman mete yon konsèy ak sa yo ki dosye. Se konsa, nou gen yon konsèy * DOSYE. Nan ka sa a, m ap rele li yon nan konsèy paske ki nan pral fè infile m 'yo. Se konsa, mwen pral sèvi ak fopen an fonksyon ak Lè sa a, non an nan dosye a ak Lè sa a, mòd la nan ki mwen pral yo dwe fè fas ak dosye a. Se konsa, gen nan "r" nan ka sa a pou lekti, "W" pou ekri, ak Lè sa a, "yon" pou ajou. Pou egzanp, lè w ap fè fas ak yon infile ak tout sa ou vle fè se li Bits yo ak bytes ki estoke a, Lè sa a, w ap pwobableman pral vle itilize "r" kòm mòd ou a. Lè ou vle aktyèlman ekri, kalite fè yon dosye nouvo, Lè sa a, sa n ap pral fè se nou pral louvri dosye a nouvo epi sèvi ak "W" mòd la pou ekri. Se konsa, Lè sa a, lè w ap aktyèlman lekti nan dosye yo, estrikti a se jan sa a. Premye ou gen ladan yo konsèy la struct la ki pral genyen ladan bytes yo ke ou ap li. Se konsa, ki k ap pase yo dwe ki kote nan fen bytes yo ke ou ap li. Lè sa a, w ap ale nan endike gwosè a, renmen fondamantalman konbyen bytes pwogram ou a gen li nan nan dosye a, gwosè a fondamantalman yon sèl eleman se, ak Lè sa a, w ap ale nan presize konbyen eleman ou vle li. Lè sa a, finalman, ou gen konnen ki kote w ap li nan men, pou ke k ap pase yo dwe konsèy nan ou. Mwen koulè-kode sa yo paske frèd tou se trè menm jan ak fwrite, eksepte ou vle asire w ke ou sèvi ak lòd ki dwat, asire w ke ou ap aktyèlman ekri nan oswa li nan dosye a dwat. Se konsa, Lè sa a, tankou anvan, si nou gen gwosè a nan eleman a kòm byen ke nimewo a nan eleman, Lè sa a, nou ka jwe nan isit la yon ti jan. Di Mwen gen yon struct DOG ak sa Lè sa a, mwen vle li de chen nan yon tan. Ki sa mwen te kapab fè se di gwosè a nan yon sèl eleman a pwal gwosè a nan yon sèl DOG ak mwen pral aktyèlman li de nan disip yo. Altènativman, sa m 'te ka fè se di mwen jis pral li yon sèl eleman e sa se yonn eleman a pwal gwosè a nan de chen. Se konsa, sa a, se analoji ki jan ou kapab kalite nan jwe otou ak gwosè ak nimewo depann sou sa ki an plis entwisyon ba ou. Tout dwa. Se konsa, kounye a nou jwenn nan dosye alekri. Lè ou vle ekri yon dosye li an, agiman an premye se aktyèlman ki kote ou ap li nan. Se konsa, sa a, se fondamantalman done sa yo ke ou yo ale nan ekri nan dosye a, ki se konsèy la soti nan fen an. Se konsa, lè w ap fè fas ak pset a, asire w ke ou pa resevwa konfonn. Petèt gen bò a definisyon pa bò. Ou ka rale definisyon ki moute nan manyèl la lè ou tape gason ak Lè sa a, fwrite, pou egzanp, nan tèminal la, oswa ou ka al gade tounen nan sa a glise ak asire w ke w ap itilize youn nan dwa. Se konsa, ankò, pou fwrite, lè ou gen yon dosye ke ou vle ekri nan, ki k ap pase yo dwe agiman an dènye e ki nan ale nan yon konsèy ak sa yo ki dosye. Se konsa, Lè sa a, lè sa a jan nou fè fas ak ekri petèt bytes plizyè nan yon moman, men di ou vle jis ekri nan jis yon karaktè sèl. Kòm nou pral wè pita nan egzanp sa a, nan Bitmap sa yo nou pral gen yo sèvi ak sa. Sa a lè nou ka sèvi ak fputc, ki esansyèlman jis mete yon karaktè nan yon moman, kr, nan konsèy la dosye, e ke a konsèy soti nou an la. Se konsa, Lè sa a, chak fwa nou chèche oswa ekri yo nan yon dosye li an, dosye a se kenbe tras nan kote nou ye. Se konsa, li nan yon sòt de kurseur, endikatè ki pozisyon dosye-a. Se konsa, chak fwa nou ekri oswa li ankò nan yon dosye, dosye a aktyèlman sonje ki kote li ye, ak sa li kontinye soti nan kote kurseur a se. Sa a kapab benefisye lè ou vle, di, li nan yon sèten kantite fè yon bagay ak Lè sa a, li nan kantite lajan ki anba la a, men pafwa nou ta ka vle ale tounen oswa aktyèlman kòmanse soti nan yon valè referans a sèten. Se konsa, Lè sa a, fonksyon an fik, ki sa li fè se pèmèt nou pou avanse pou pi kurseur la nan yon dosye sèten yon sèten kantite bytes. Lè sa a, ki sa nou dwe fè se presize kote valè a referans se. Se konsa, swa l ap deplase pou pi devan oswa dèyè soti nan kote kurseur a kounye a se, oubyen nou ka presize ke li ta dwe jis deplase nan depi nan konmansman an nan dosye a oswa nan fen a nan dosye a. Se konsa, nou ka pase nan valè negatif oswa pozitif nan kantite lajan, ak ki pral kalite deplase kurseur la swa anvwa oswa fè bak. Anvan nou jwenn nan psets lòt yo, nenpòt kesyon sou dosye mwen / O? Oke. Kòm nou jwenn nan plis egzanp, santi yo lib yo sispann m 'pou kesyon yo. Se konsa, nan Whodunit, w ap lage yon dosye bitmap menm jan ak yon sèl sa a wouj sou glise la, e li sanble tankou sa a - yon pakèt moun sou pwen wouj - epi ou pa vrèman konnen ki sa a ekri. Si ou louch, ou ka kapab wè yon ti tay koulè ble andedan mitan yo. Esansyèlman, ki nan ki kote tèks la ki estoke. Te gen yon touye moun sa ki te rive yo, epi nou bezwen konnen ki moun ki fè l '. Nan lòd fè sa, nou bezwen kalite konvèti imaj sa a nan yon fòma ki lizib. Si ou nèg janm rankontre sa a, pafwa ta gen twous ti kras ki kote ou ta gen yon loup ak yon fim wouj. Nenpòt moun ki? Yeah. Se konsa, ou ta dwe men yon bagay tankou sa a, ou ta gen yon loup avèk fim nan wouj sou li, ou ta mete l 'sou imaj la, Se ou ki ta kapab wè mesaj la kache ladan l '. Nou pa gen yon loup ak fim wouj, Se konsa, olye nou ap ale nan kalite kreye pwòp nou an nan sa a pset. Se konsa, itilizatè a ki pral whodunit D ', lè sa a endikasyon nan,. BMP, pou ki nan infile a, ki nan mesaj la dot wouj, ak Lè sa a, yo ap di verdict.bmp a pwal outfile nou an. Se konsa, li pral kreye yon imaj bitmap nouvo menm jan ak apèsi nan youn eksepte nan yon fòma ki lizib kote nou ka wè mesaj la kache. Depi nou ap pral fè fas ak koreksyon ak manipile bitmap nan kèk sòt, nou pwal kalite plonje nan nan estrikti a nan sa yo dosye bitmap. Nou te ale sou sa yo yon ti jan nan konferans, men kite a gade nan yo kèk plis. Bitmap yo ap esansyèlman jis yon aranjman nan bytes kote nou te espesifye ki bytes vle di ki sa. Se konsa, isit la se kalite tankou yon kat jeyografik nan imaj la bitmap ki di ke li kòmanse ak kèk dosye header, kòmanse ak kèk enfòmasyon an la. Ou wè ke nan sou nimewo multiple 14 se gwosè a endike nan imaj la bitmap, epi li kontinye nan. Men, Lè sa a, sa n ap reyèlman enterese nan isit la se kòmanse otou nimewo multiple 54. Nou gen sa yo tripl rgb. Ki sa sa a pral fè se genyen ladan piksèl yo reyèl, valè yo koulè. Tout anwo a ki nan header a se kèk enfòmasyon ki koresponn a gwosè a nan imaj la, lajè a nan imaj la, epi wotè a. Lè nou ale nan kouvèti pita sou, nou pral wè poukisa gwosè a nan imaj la ta ka diferan pase lajè li an oswa wotè a. Se konsa, Lè sa a, ki reprezante sa yo - imaj sa yo bitmap yo se sekans nan bytes - kisa nou te ka fè se di oke, mwen pral sonje ke nan endèks 14, ke se la li gwosè a se, pou egzanp, men olye sa n ap pral fè pou fè sa-a pi fasil se ankapsulasyon l 'nan yon struct. Se konsa, nou gen de strukt te fè pou nou, yon BITMAPFILEHEADER ak yon BITMAPINFOHEADER, e konsa chak fwa nou li nan ak sa yo ki ranpli, pa default li pral yo dwe ale nan lòd, ak sa yo nan lòd li nan tou ale nan ranpli nan nan varyab tankou biWidth ak biSize. Lè sa a, finalman, se chak pixel reprezante nan twa bytes. Premye a se kantite lajan ble nan pixel a, dezyèm lan se kantite lajan vèt, epi finalman, kantite a wouj, kote 0 se esansyèlman pa gen okenn vèt ble oswa ki pa gen oswa pa gen wouj ak Lè sa a, ff se valè maksimòm nan. Sa yo se valè ekzadesimal. Se konsa, Lè sa a, si nou gen ff0000, lè sa a ki koresponn ak kantite maksimòm ble ak Lè sa a, pa gen okenn vèt ak pa gen okenn wouj, se konsa Lè sa a, ki ta ka ba nou yon pixel ble. Lè sa a, si nou gen tout ff a atravè Komisyon Konsèy la, lè sa a ki vle di ke nou gen yon pixel blan. Sa a se kalite opoze tipikman lè nou di rgb. Li nan aktyèlman pral BGR. Se konsa, si nou aktyèlman gade nan yon egzanp sou yon imaj bitmap - kite m 'rale yon kanpe, isit la. Li se yon ti ti kras. Mwen zoum nan, epi nou ka wè li nan piselize. Li sanble ke blòk an koulè. Ou gen blòk blan ak Lè sa a, blòk wouj. Si ou jwe nan penti Microsoft, pou egzanp, ou te kapab fè yon bagay tankou sa pa bazikman jis pentire kare sèten nan yon lòd espesifik. Se konsa, Lè sa a, sa ki tradui sa a nan nan bitmap a se jan sa a. Isit la nou gen premye piksèl blan, ke tout 6 se nan f, ak Lè sa a, nou gen piksèl wouj, endike nan 0000ff. Se konsa, sekans nan bytes ke nou gen montre kouman imaj la bitmap ki pral gade. Se konsa, sa m 'te fè isit la se jis ekri soti tout moun sa yo bytes ak Lè sa a, ki gen koulè nan wouj lan pou ke ou ka kalite wè, si ou louch yon ti jan, ki jan ki kalite endike yon figi Smiley. Fason la ki bitmap imaj travay se mwen anvizaje li fondamantalman kòm yon griy. Se konsa, pa default, chak ranje nan griy la gen yo dwe yon miltip nan 4 bytes. Si nou gade nan yon imaj bitmap, w ap ranpli nan tout valè. Pou egzanp, ou ta ka gen yon wouj isit la, yon vèt isit la, yon ble isit la, , men ou dwe asire w ke se imaj la plen nan ak yon miltip nan kat bytes. Se konsa, si mwen vle imaj mwen an twa blòk lajè, Lè sa a, mwen ta gen yo mete yon valè vid nan yon sèl ki sot pase a fè li yon miltip nan kat. Se konsa, Lè sa a, mwen ta ajoute nan yon bagay ki nou ap rele pwotèj. Mwen jis ale nan endike ke gen ak yon x. Koulye a, di nou vle yon imaj ki se 7 piksèl long, pou egzanp. Nou gen 1, 2, 3, 4, 5, 6, 7, ak nan tout sa se plen nan ak koulè. Fason la ki imaj bitmap travay se ke nou bezwen yon 8yèm ane. Kounye a, nou gen 1, 2, 3, 4, 5, 6, 7. Nou bezwen 8 espas pou imaj la bitmap li kòrèkteman. Se konsa, Lè sa a, ki sa nou dwe fè se ajoute nan jis yon ti jan nan kouvèti asire w ke tout larjer yo se inifòm ak ke tout larjer yo se yon miltip nan 4. Se poutèt sa mwen te deja endike, kouvèti kòm yon x oubyen yon squiggly liy, men nan imaj yo reyèl bitmap se kouvèti ki endike pa yon 0 ekzadesimal. Se konsa, ki ta ka yon karaktè yon sèl, 0. Ki sa ki ta ka vini an sou la men se yo lòd, ki xxd. Ki sa li fè se aktyèlman montre ou, tankou menm jan ak sa m 'te fè anvan ak Smiley a lè mwen aktyèlman soti enprime ki sa chak koulè ta dwe pou pixel nan ak Lè sa a, koulè-kode li, lè ou kouri xxd ak kòmandman sa yo, Lè sa a, li pral aktyèlman enprime konnen ki sa ki koulè yo yo se pou sa yo piksèl. Ki sa ou dwe fè se sou isit la mwen endike, tankou yo a-54 di ke mwen pral kòmanse nan multiple nan 54th paske anvan sa, sonje si nou gade tounen nan kat jeyografik la nan Bitmap yo, ki nan tout sa header enfòmasyon an ak bagay sa yo tankou sa. Men, sa ki nou reyèlman sousye de se piksèl yo reyèl ki endike koulè a. Se konsa, pa ajoute nan ki drapo,-yo 54, Lè sa a, nou ap kapab wè valè yo koulè. Ak pa enkyete sou drapo yo konplike ak bagay sa yo tankou sa. Nan espèk nan seri pwoblèm, ou pral gen esplikasyon ki ekri sou kouman yo sèvi ak xxd yo montre piksèl yo. Se konsa, si ou wè la a, li kalite sanble yon bwat vèt, bagay sa a piti. Mwen te koulè-kode 00ff00 an kòm fondamantalman an dizan pa gen okenn ble, yon anpil nan vèt, ak pa gen okenn wouj. Se konsa, ki koresponn ak vèt. Kòm ou wè la a, nou wè yon rektang vèt. Sa a rektang vèt se sèlman 3 piksèl lajè, se konsa Lè sa a, ki sa nou dwe fè asire w ke imaj la se yon miltip nan 4 lajè se ajoute nan kouvèti siplemantè. Se konsa, Lè sa a, lè sa a jan ou wè sa yo 0s isit la. Sa a pral aktyèlman ap rezilta nan pset rdimansyonman ou a, esansyèlman pran bitmap la ti ak Lè sa a, agrandisan li pa 4. Se konsa, sa nou wè se ki aktyèlman imaj sa a se 12 piksèl lajè, men 12 se yon miltip nan 4, epi pou nou aktyèlman pa wè okenn 0s nan fen a paske nou pa bezwen ajoute nenpòt ki paske li nan konplètman Matlasye. Li pa gen okenn plis chanm. Oke. Nenpòt kesyon sou kouvèti? Oke. Fre. Kòm mwen mansyone anvan, bitmap yo yo se jis yon sekans nan bytes. Se konsa, sa nou genyen se olye pou yo ki bezwen nan kenbe tras nan egzakteman nimewo ki nan multiple koresponn ak yon eleman espesifik, nou aktyèlman te kreye yon struct ki reprezante sa. Se konsa, sa nou gen la se yon struct RGBTRIPLE. Chak fwa ou genyen yon egzanp nan yon rgb trip, paske sa a se yon kalite defini struct, lè sa a ou kapab gen aksè varyab la rgbtBlue, Menm jan an vèt ak wouj varyab yo, ki pral endike konbyen ble, vèt, ak wouj, respektivman, ou genyen. Se konsa, si nou gen ansanm lan varyab ble a 0, seri a vèt ff, ki se valè a maksimòm ou ka gen, ak Lè sa a, varyab la wouj mete 0, Lè sa a, sa ki koulè ta sa a an patikilye rgb trip reprezante? >> [Elèv la] Vèt. Vèt. Egzakteman. Li k ap pase a ap itil konnen ke chak fwa ou genyen yon egzanp nan yon rgb trip, ou ka aktyèlman jwenn aksè kantite lajan an nan koulè - ble, vèt, ak wouj - separeman. Kounye a ke nou te pale sou estrikti nan de sa, kite a pran yon gade nan dosye a BMP. Sa yo se strukt te fè pou ou. Isit la nou gen yon struct BITMAPFILEHEADER. Nan enterè a se gwosè a. Pita sou, nou gen header nan info, ki te gen yon tijan plis bagay sa yo ki enteresan ak nou, savwa gwosè a, lajè a, epi wotè a. Kòm nou pral antre nan pita, lè ou li nan nan dosye a, li otomatikman li nan paske nou te mete lòd la yo dwe menm bagay la. Se konsa, biSize a pral gen bytes yo dwa ki koresponn ak gwosè aktyèl la nan imaj la. Lè sa a, isit la, alafen, kòm nou te pale sou, nou gen RGBTRIPLE struct a tipedèf. Nou gen yon rgbtBlue, vèt, ak Wouj asosye ak li. Great. Oke. Kounye a ke nou konprann bitmap yon ti jan, konprann ke nou gen yon header dosye ak yon header info asosye ak li ak Lè sa a, apre sa, nou gen bagay la enteresan de koulè yo, ak moun ki koulè yo reprezante nan strukt RGBTRIPLE, ak moun ki, nan vire, gen twa valè asosye nan ble a, vèt la, ak wouj la. Se konsa, koulye a, nou kapab kalite panse osijè de Reprann yon ti jan. Sorry. Reflechi sou Whodunit. Lè nou gen dosye endis nou an, Lè sa a, ki sa nou vle fè se li nan li pixel pa pixel ak Lè sa a, yon jan kanmenm chanje sa yo piksèl pou nou ka Sòti l 'nan yon fòma ki lizib. Se konsa, Sòti li, nou ap ale nan ekri pixel pa pixel nan dosye a verdict.bmp. Sa a kalite yon anpil fè. Nou reyalize sa. Se konsa, sa nou te fè se nou te aktyèlman bay ou avèk copy.c. Ki sa ki fè sa ki copy.c se jis fè yon kopi egzak la yon dosye bitmap bay ak Lè sa a, sorti li. Se konsa, sa a deja louvri dosye a pou ou, li nan pixel pa pixel, ak Lè sa a, ekri li nan nan yon dosye pwodiksyon. Se pou nou pran yon gade nan sa. Sa a se asire ke bon izaj, ap resevwa non yo isit la. Ki sa sa fè se li kouche dosye a D 'yo dwe ki sa nou te pase nan an infile a isit la, ki se dezyèm nou lòd-liy agiman. Tchyeke a asire w ke nou ka louvri dosye a. Tchyeke asire ou ke nou kapab fè yon outfile nouvo isit la. Lè sa a, ki sa sa a fè isit la, li jis fondamantalman kòmanse lekti nan dosye a bitmap depi nan konmansman an. Kòmansman an, kòm nou konnen, gen BITMAPFILEHEADER a, ak sa moun ki sekans nan Bits pral dirèkteman ranpli nan BITMAPFILEHEADER la. Se konsa, sa nou gen isit la se ki di ke bf BITMAPFILEHEADER - ki nan varyab nouvo nou an BITMAPFILEHEADER kalite - nou pwal mete anndan bf ki sa nou li nan nan konsèy, ki se infile nou an. Ki kantite nou li? Nou li nan konbyen bytes nou bezwen genyen BITMAPFILEHEADER a tout antye. Menm jan tou, sa a, se sa nou fè pou header nan info. Se konsa, nou ap kontinye ansanm dosye nou yo nan infile a, epi nou ap li sa yo Bits ak bytes, epi nou ap rakorde yo dirèkteman nan nan ka sa yo nan varyab sa yo ke nou ap fè. Isit la nou jis ap fè si ke bitmap la se yon bitmap. Koulye a, nou gen yon outfile, dwa? Se konsa, kòm li vle di lè nou kreye li, li nan esansyèlman vid. Se konsa, nou gen fondamantalman kreye yon bitmap nouvo soti nan grafouyen. Ki sa nou fè se nou gen a asire w ke nou kopye nan header nan dosye ak header nan info jis tankou infile a gen. Ki sa nou fè se nou ekri - epi sonje ke bf se varyab la nan BITMAPFILEHEADER kalite, se konsa sa nou fè se nou jis itilize ke kontni yo ekri nan outfile la. Isit la, sonje nou te pale de kouvèti, ki jan li enpòtan a asire w ke kantite lajan an nan piksèl ke nou gen se yon miltip nan 4. Sa a se yon fòmil trè itil nan kalkile konbyen kouvèti ou genyen bay lajè a nan dosye ou. Mwen vle ou nèg sonje ke nan copy.c nou gen yon fòmil pou kalkile pwotèj. Oke? Se konsa, tout moun sonje ke. Great. Se konsa, Lè sa a, ki sa copy.c fè pwochen se li iterates sou tout nan scanlines yo. Li ale nan ranje yo premye ak Lè sa a, estoke chak trip ke li li ak Lè sa a, ekri l 'nan outfile la. Se konsa, Lè sa a, isit la nou ap li yon sèl rgb trip nan yon moman ak Lè sa a, mete ke trip menm nan outfile la. Pati a difisil se ke kouvèti la se pa yon trip rgb, epi pou nou pa ka jis li sa kantite lajan kouvèti nan rgb tripl. Ki sa nou dwe fè se aktyèlman jis deplase endikatè dosye pozisyon nou, deplase kurseur nou an, kalite sote sou tout kouvèti a pou ke nou se nan ranje a kap vini an. Lè sa a, ki sa sa a fè, se kopi montre w kouman ou ta ka vle ajoute kouvèti a. Se konsa, nou te kalkile konbyen kouvèti nou bezwen, Se konsa sa vle di ke nou bezwen nimewo kouvèti a 0s. Ki sa sa fè sa ki se yon pou riban ki mete nimewo kouvèti a 0s nan outfile nou an. Lè sa a, finalman, ou fèmen tou de dosye. Ou fèmen infile a kòm byen ke outfile la. Se konsa, lè sa a jan copy.c travay, e ke k ap pase yo dwe trè itil. Olye pou yo jis aktyèlman dirèkteman w kopye e kole li oswa jis gade nan li epi li sezisman nan tou sa ou vle, ou ta ka jis vle egzekite lòd sa a nan tèminal la, cp copy.c whodunit.c, ki pral kreye yon dosye nouvo, whodunit.c, ki gen kontni an egzak menm jan ak kopi fè. Se konsa, Lè sa a, ki sa nou ka fè se sèvi ak sa kòm yon kad sou ki pou konstwi e pou edite pou dosye whodunit nou an. Sa yo se nou a-dos pou fè pou Whodunit, men ki sa copy.c fè sa ki se aktyèlman pran swen de pi fò nan yo pou nou. Se konsa, tout sa nou bezwen yo dwe fè pwochen se chanje piksèl yo jan sa nesesè aktyèlman fè dosye a lizib. Sonje ke pou yon pixel bay trip, se konsa pou yon varyab bay nan RGBTRIPLE kalite, ou kapab gen aksè ble, valè yo vèt, ak wouj. Sa a pral vini an sou la men paske si ou kapab jwenn aksè nan yo, ki vle di ou ka tcheke tou yo, ak ki vle di ke ou ka tou chanje yo. Se konsa, lè nou te ale tounen nan egzanp nou an wouj agrandisman vè, , fondamantalman, ki te aji kòm yon sòt de filtre pou nou. Se konsa, sa nou vle fè se nou vle filtre tout tripl yo ke yo ap vini pous Gen plizyè fason diferan nan fè sa. Fondamantalman, ou ka gen tou sa di ki kalite filtre ou vle. Petèt ou ta vle chanje tout piksèl wouj oswa petèt ou vle chanje yon pixel koulè diferan nan yon koulè diferan. Sa a moute nan ou. Sonje ke ou ka tcheke ki sa koulè pixel a se ak Lè sa a, ou ka tou chanje li kòm w ap ale atravè tout. Oke. Se konsa, sa a, se Whodunit. Yon fwa ou kouri Whodunit, ou pral konnen ki moun ki koupab la nan krim nan te ye. Koulye a, nou pral pou yo ale nan Rdimansyone. Nou pwal toujou fè fas ak Bitmap. Ki sa nou ap ale nan se nou pral gen yon bitmap D ' ak Lè sa a, nou pral pase nan yon nimewo ak yon Lè sa a, jwenn yon bitmap outfile kote ki an fondamantalman infile nou scaled pa n. Di dosye mwen te jis yon sèl pixel gwo. Lè sa a, si n mwen te 3, Eskalad pa 3, lè sa a mwen ta repete sa pixel n kantite fwa, Se konsa 3 fwa, ak Lè sa a, tou echèl li desann 3 fwa kòm byen. Se konsa, ou wè mwen dekale li vètikal kòm byen ke orizontal. Lè sa a, isit la nan yon egzanp. Si ou gen n = 2, ou wè sa a premye pixel nan ble gen repete de fwa orizontal kòm byen ke de fwa vètikal. Lè sa a, k ap kontinye sou li a, ak pou ou gen yon Eskalad dirèk nan imaj orijinal ou pa de. Se konsa, Lè sa a, si nou te sou detay pseudocode la pou sa a, nou vle louvri dosye a. Lè sa a, konnen ke si nou ale tounen isit la, nou wè ke lajè a pou outfile an a pwal diferan pase lajè li an pou infile la. Kisa sa vle di? Sa vle di ke enfòmasyon header nou ki pral chanje. Se konsa, ki sa nou pral vle fè se mete ajou info a header, konnen ke lè nou li nan dosye yo si w ap opere sou fondasyon an copy.c, nou deja genyen yon varyab ki endike sa ki gwosè a se ak bagay sa yo tankou sa. Se konsa, yon fwa ou gen sa, ki sa ou ta ka vle fè se chanje sa yo varyab patikilye. Sonje byen, si ou gen yon struct, ki jan ou aksè varyab yo nan sa. Ou sèvi ak operatè a dot, dwa? Se konsa, Lè sa a, lè l sèvi avèk sa, ou konnen ke ou pral bezwen chanje info a header. Se konsa, isit la a, se jis yon lis nan eleman yo ki aktyèl yo pral chanje nan dosye ou. Gwosè a dosye yo pral chanje, imaj la, osi byen ke lajè a ak wotè a. Se konsa, Lè sa a, pral tounen nan kat jeyografik la nan Bitmap yo, gade nan si wi ou non li nan header nan dosye oswa header nan info ki gen enfòmasyon sa a ak Lè sa a, chanje jan sa nesesè. Yon fwa ankò, di cp copy.c resize.c. Sa vle di ke resize.c kounye a gen tout bagay ki nan genyen andedan kopi paske kopi bay nou yon fason pou lekti nan nan chak pixel scanline pa pixel. Eksepte, koulye a, olye pou yo jis chanje valè yo tankou nou te fè sa nan Whodunit, ki sa nou vle fè se nou vle ekri nan piksèl miltip osi lontan ke n nou an, se pi gran pase 1. Lè sa a, ki sa nou vle fè se nou vle detire li orizontal pa n, kòm byen ke detire li vètikal pa n. Ki jan ta ka nou fè sa? Di n ou a se 2 ak ou gen sa a infile bay yo. Kurseur ou a ap pral kòmanse nan yon sèl a an premye, ak sa ou vle fè si n se 2, ou vle enprime nan 2 moun sa yo. Se konsa, ou enprime nan 2 moun sa yo. Lè sa a, kurseur ou a pral pou yo avanse pou pixel nan pwochen, ki se youn nan wouj, ak li a pral enprime soti 2 nan moun ki moun wouj, ajou li sou sa ki li fè anvan an. Lè sa a, kurseur a ap deplase li nan yon pixel nan pwochen epi trase nan 2 moun sa yo. Si ou gade tounen nan copy.c fondasyon an, ki sa ki sa a fè isit la se li kreye yon egzanp nouvo nan yon trip rgb, yon varyab ki rele New trip. Ak isit la, lè li li nan li, li li soti nan infile RGBTRIPLE nan 1 ak magazen li anndan varyab sa a trip. Se konsa, Lè sa a, ou gen aktyèlman yon varyab ki reprezante ki pixel an patikilye. Lè sa a, lè ou ekri, ki sa ou ta ka vle fè se recouvrir deklarasyon an fwrite nan yon riban pou ki ekri l 'nan outfile ou kòm anpil fwa tankou sa nesesè. Sa a se senp ase. Jis fondamantalman repete pwosesis la ekri n kantite fwa selon echèl li orizontal. Men, Lè sa a, nou dwe sonje ke kouvèti nou ki pral chanje. Précédemment, di nou te gen yon bagay nan longè 3. Lè sa a, nou ta jis ajoute nan konbyen lajan kouvèti? Jis youn plis fè li yon miltip 4. Men, di nou ap dekale imaj sa a an patikilye pa n = 2. Se konsa, Lè sa a, ki jan anpil piksèl ble nou ta gen nan fen a? Nou ta gen 6. 1, 2, 3, 4, 5, 6. Tout dwa. 6 se pa yon miltip nan 4. Ki sa ki nan plizyè ki pi pre a 4? Sa k ap pase yo dwe 8. Se konsa, nou ap aktyèlman pral gen 2 karaktè nan kouvèti a. nenpòt moun ki sonje si nou gen yon fòmil kalkile kouvèti ak ki kote ki ta kapab? [Fèbl elèv repons] >> Yeah, copy.c. Dwat. Gen yon fòmil nan copy.c kalkile konbyen kouvèti ou genyen bay yon lajè patikilye nan imaj la bitmap. Se konsa, Lè sa a, ki k ap pase yo dwe itil lè ou bezwen ajoute nan yon sèten kantite kouvèti aktyèlman konnen ki jan anpil kouvèti ou bezwen ajoute. Men, yon nòt, menm si, se ke ou vle asire ke w ap sèvi ak gwosè dwat la. Jis dwe fè atansyon paske w ap fondamantalman yo pral fè fas ak de imaj bitmap. Ou vle asire w ke ou ap sèvi ak youn nan dwa. Lè w ap kalkile kouvèti a pou outfile a, ou vle sèvi ak lajè a nan outfile la epi yo pa lajè a nan yon sèl la anvan yo. Great. Sa kalite yo nan pran swen de etann yon imaj bitmap antye orizontal. Men, ki sa nou vle fè se aktyèlman detire li vètikal kòm byen. Sa a se pral fè yon ti jan Delice paske lè nou te fin kopye yon ranje ak ekri ki ranje, kurseur nou a pwal nan fen an. Se konsa, si nou li ankò, Lè sa a, li jis pral li nan nan liy kap vini an. Se konsa, sa nou vle fè se kalite jwenn kèk fason pou kopye sa yo ranje ankò oswa jis kalite pran ki ranje ak Lè sa a, reekri l 'ankò. Kòm mwen kalite evoke, gen plizyè fason diferan nan fè sa. Ki sa ou ta ka fè se kòm w ap ale atravè tout ak lekti atravè scanline an patikilye ak chanje li jan sa nesesè, Lè sa a, kalite magazen tout moun ki piksèl nan yon etalaj. Lè sa a, pita sou ou konnen ke ou pral bezwen enprime soti ki etalaj ankò, ak pou w ka jis itilize ki etalaj fè sa. Yon lòt fason fè li se ou ta ka kopye desann yon sèl ranje, konprann ke ou bezwen yon kopi sa ankò, se konsa aktyèlman deplase kurseur ou a, Epi sa a, yo pral lè l sèvi avèk fik nan metòd. Ou te kapab deplase kurseur ou a tout wout la tounen ak Lè sa a, repete pwosesis la kopi ankò. Se konsa, si nimewo Eskalad nou an, se n, Lè sa a, konbyen fwa nou ta gen yo ale tounen ak reyekri yon liy? >> [Elèv] n - 1. >> Yeah, pafè. n - 1. Nou te fè l 'yon fwa deja, se konsa Lè sa a, nou pral vle repete pwosesis la tounen pral n - 1 kantite lajan pou fwa. Oke. Se konsa, gen ou genyen fonksyon rdimansyonman ou a. Koulye a, nou ka jwenn nan yon pati, reyèlman amizan pset pi renmen m ', ki se geri. Olye pou yo Bitmap, tan sa a nou ap fè fas ak JPEGs. Nou ap aktyèlman pa bay yon dosye jis nan JPEGs, n ap bay fondamantalman yon memwa anvan tout koreksyon fòma kat. Se konsa, sa a gen ladan yon ti jan nan info ak fatra valè depi nan konmansman an, ak Lè sa a, li kòmanse ak li gen yon pakèt moun sou JPEG dosye. Sepandan, nou ap lage yon kat kote nou te efase foto yo; esansyèlman, nou te bliye kote foto yo yo sitiye nan kat la. Se konsa, Lè sa a, travay nou yo nan Reprann se yo ale nan fòma sa a kat ak jwenn moun foto ankò. Chans, estrikti nan JPEG dosye ak dosye a kat se yon ti jan ki itil. Li definitivman te kapab yon ti jan Delice si se te pa nan fòma sa a an patikilye. Chak dosye JPEG aktyèlman kòmanse ak de sekans sa posib, endike anwo a. Fondamantalman, ou nenpòt lè w genyen yon nouvo JPEG ranpli, li kòmanse ak swa sekans lan ffd8 ffe0 oswa yon sèl nan lòt, ffd8 ffe1. Yon lòt bagay ki itil yo konnen se ke JPEGs yo estoke kontigu. Se konsa, chak fwa yon sèl JPEG dosye fini, lòt yon moun w ap yo. Se konsa, pa gen nenpòt kalite nan-ant valè a. Yon fwa ou frape kòmansman yon JPEG, si ou te deja te li yon JPEG, ou konnen ke ou te frape nan fen yon sèl anvan an ak nan kòmansman an nan youn nan pwochen. Kalite visualized sa a, mwen te fè yon chematikman. Yon lòt bagay sou JPEGs se ke nou ka li yo nan sekans nan 512 bytes nan yon moman, Menm jan an ak nan konmansman an nan kat la. Nou pa bezwen tcheke chak multiple sèl paske yo ta ka souse. Se konsa, olye, ki sa nou ka fè se aktyèlman jis li nan 512 bytes nan yon moman ak Lè sa a,, olye pou yo tcheke nan ant sa yo ki nan sa yo tranch ti ti kras, nou ka jis tcheke nan konmansman an nan 512 bytes yo. Esansyèlman, nan foto sa a, ki sa ou wè, se nan konmansman an nan kat la, ou gen valè ki se pa reyèlman ki gen rapò ak JPEGs yo vrè tèt yo. Men, Lè sa a, ki sa m 'genyen se yon etwal ki endike ki youn nan de sekans yo kòmanse pou yon JPEG. Se konsa, chak fwa ou wè yon zetwal, ou konnen ke ou gen yon dosye JPEG. Lè sa a, chak dosye JPEG a pwal kèk miltip nan 512 bytes men se pa nesesèman miltip an menm. Fason ke ou konnen ke ou te frape yon lòt JPEG se si ou frape yon lòt etwal, yon lòt sekans kòmanse nan bytes. Lè sa a, sa ou genyen isit la se ou gen wouj JPEG dosye a kontinye jiskaske ou frape yon etwal, ki se endike pa yon nouvo koulè. Ou kontinye ak Lè sa a, ou frape yon lòt etwal, ou frape yon lòt JPEG, ou kontinye tout wout la jouk nan fen an. Ou se nan foto a dènye isit la, yon sèl la woz. Ou ale nan fen a jiskaske ou frape nan fen karaktè dosye-a. Sa a se pral fè reyèlman itil. Yon kèk takeaways prensipal la a: Dosye a kat pa kòmanse avèk yon JPEG, men yon fwa yon JPEG kòmanse, nan tout JPEGs yo yo estoke kòt a kòt youn ak lòt. Gen kèk pseudocode pou Reprann la. Premyèman, nou ap ale nan louvri dosye kat nou an, Epi sa a, yo pral lè l sèvi avèk dosye nou an mwen / O fonksyon. Nou pral repete pwosesis sa a jiskaske nou te rive nan fen an nan dosye a. Nou pral li 512 bytes nan yon tan. Epi ki sa mwen te di isit la se nou pral nan magazen li nan yon zòn de defans, Se konsa, fondamantalman kenbe fèm nan fè sa yo bytes 512 jiskaske nou konnen ekzakteman ki sa fè ak yo. Lè sa a, ki sa nou vle fè se nou vle tcheke si nou te frape yon etwal oswa ou pa. Si nou te frape yon etwal, si nou te frape youn nan sekans yo kòmanse, Lè sa a, nou konnen ke nou te frape yon nouvo JPEG dosye. Ki sa nou pral vle fè se nou pral vle kreye yon dosye nouvo nan anyè pset4 nou kontinye ap fè ke dosye-a. Men tou, si nou te deja fè yon JPEG anvan, Lè sa a, nou vle fini ke dosye ak pouse li nan folder nan pset4, kote nou pral gen ke dosye ki estoke paske si nou pa presize ke nou te te fini ke JPEG ranpli, Lè sa a, nou pral fondamantalman gen yon kantite lajan endetèmine. JPEGs yo pap janm fini. Se konsa, nou vle asire ke lè nou ap li nan nan yon dosye JPEG ak ekri sa, nou vle espesyalman fèmen ke yo nan lòd yo louvri youn nan pwochen. Nou pral vle tcheke plizyè bagay. Nou vle tcheke si nou ap nan kòmansman yon nouvo JPEG ak tanpon nou epi tou li si nou te deja jwenn yon JPEG anvan paske sa pral chanje pwosesis ou a yon ti jan. Se konsa, Lè sa a, apre ou fin ale nan tout wout la ak ou frape nan fen dosye a, Lè sa a, ki sa ou pral vle fè se ou pral vle fèmen tout dosye yo ki aktyèlman ap louvri. Sa pwal pwobableman pase pou dènye JPEG dosye a ki di ou gen, kòm byen ke dosye a kat ke ou ve yo te fè fas ak. Obstak la pase ke nou bezwen atake se kouman yo aktyèlman fè yon dosye JPEG ak kouman yo aktyèlman pouse l 'bay folder la. Pset sa a mande pou chak JPEG ke ou jwenn dwe nan fòma sa a, ki kote w gen nimewo a. jpg. Nimewo a, menm si li nan 0, nou rele li 000.jpg. Chak fwa ou jwenn yon JPEG nan pwogram ou an, w ap ale nan vle non li yo nan lòd la ke li nan te jwenn yo. Ki sa sa vle di? Nou bezwen kalite kenbe tras nan konbyen nou te jwenn epi ki sa ki kantite chak JPEG yo ta dwe. Isit la nou ap ale nan pran avantaj de fonksyon an sprintf. Menm jan ak printf, ki jis kalite simagri yon valè soti nan tèminal la, sprintf simagri dosye a deyò nan folder nan. Se konsa, ki sa sa a ta fè si mwen te gen sprintf, tit, ak Lè sa a, fisèl la a, li ta enprime soti 2.jpg. Nou asime ke mwen te fèmen dosye mwen yo kòrèkteman, ki ta genyen dosye a ke mwen te te ekri deyò. Men, yon sèl bagay se ke kòd la ke mwen gen isit la pa byen satisfè sa ki pset a mande. Pset sa a mande pou yo ta dwe dezyèm JPEG dosye a yo nonmen non li 002 olye pou yo jis 2. Se konsa, lè ou enprime soti non an, Lè sa a, petèt ou ta ka vle chanje kontneur la yon ti jan. nenpòt moun ki sonje ki jan nou pèmèt pou espas anplis lè nou enprime yon bagay? Yeah. >> [Elèv] Ou mete yon 3 ant siy ki pousan ak 2 a. >> Yeah, pafè. Ou ap mete yon 3 nan ka sa a paske nou vle espas pou 3. 3D% ta pwobableman ba ou 002.jpg olye pou yo 2. Agiman an premye nan fonksyon an sprintf se aktyèlman yon etalaj Char, ki nou deja te konnen kòm strings. Moun sa yo ki testaman, kalite plis tankou yon depo tanporè, jis sere fisèl la resultant. Ou pa pral reyèlman dwe fè fas ak sa a, men ou bezwen gen ladan li. Lè konnen ke chak non dosye a gen nimewo a, ki te pran moute twa karaktè, ak Lè sa a,. jpg, depi konbyen tan yo ta dwe sa a etalaj ta dwe ye? Jete yon nimewo. Konbyen karaktè enprimri nan tit la, nan non an? Se konsa, gen nan 3 hashtags, peryòd, jpg. >> [Elèv] 7. >> 7. Pa byen. Nou pwal vle 8 paske nou vle pèmèt pou nil Terminator a tou. Finalman, jis trase soti pwosesis la ke ou ap fè pou retabli yo, ou gen kèk enfòmasyon kòmansman. Ou kontinye jiskaske ou jwenn nan kòmansman an nan yon dosye JPEG, e ke sa yo kapab swa youn nan de sekans kòmanse. Ou kenbe sou lekti. Chak koupe isit la reprezante 512 bytes. Ou kenbe sou lekti, kenbe sou lekti jiskaske ou rankontre yon lòt sekans kòmanse. Yon fwa ou gen sa, ou fini JPEG aktyèl la - nan ka sa a, li nan yon sèl la wouj, konsa ou vle fini sa. Ou vle sprintf non an nan ki nan folder pset4 ou a, Lè sa a, ou vle louvri yon JPEG ak nouvo Lè sa a, kenbe sou lekti jiskaske ou rankontre pwochen an. Kenbe sou lekti, kenbe sou lekti, yo, epi finalman, evantyèlman, w ap ale nan rive nan fen a nan dosye li an, ak sa ou pral vle fèmen JPEG an dènye ke ou te ap travay ak, sprintf ki nan pset4 folder ou a, ak Lè sa a, gade tout nan foto yo ke ou te resevwa yo. Moun sa yo ki foto yo aktyèlman pictures of CS50 anplwaye yo, epi konsa sa a se kote pati a plezi bonis nan pset a vini nan se ke ou se konpetisyon nan seksyon ou a jwenn TFs yo ki nan foto yo ak pran foto ak yo pwouve ke ou te fè pset la ak pou w ka wè ki manm pèsonèl la yo se nan foto yo. Se konsa, lè sa a ou pran foto ak anplwaye a. Pafwa ou pral oblije kouri dèyè yo desann. Pwobableman kèk nan yo ki pral eseye kouri byen lwen pou ou. Ou pran foto ak yo. Sa a se kontini. Li pa akòz lè pset a se garanti dwa moun. Pral dat limit la ap anonse nan espèk a. Lè sa a, ansanm ak seksyon ou, kèlkeswa sa ki seksyon pran foto yo ki pi ak manm yo anplwaye ki pi ap genyen yon pri trè pè. Sa a kalite ankourajman jwenn pset4 ou a fin kòm byen vit ke posib paske lè sa a ou kapab jwenn desann nan biznis lachas desann tout CS50 manm yo diferan anplwaye yo. Sa a se pa obligatwa, menm si, kidonk yon fwa ou jwenn foto yo, Lè sa a, w ap fini ak pset4. Apre sa, mwen ap fini ak solisyon 4, se konsa di ou mèsi tout pou vini yo. Bon chans ak Medsin legal. [Aplodisman] [CS50.TV]