1 00:00:00,000 --> 00:00:02,700 [Powered by Google Translate] [Walkthrough - Set Problema 4] 2 00:00:02,700 --> 00:00:05,000 [Zamyla Chan - Universitatea Harvard] 3 00:00:05,000 --> 00:00:07,340 [Acest lucru este CS50. - CS50.TV] 4 00:00:08,210 --> 00:00:11,670 Bine. Bună ziua, tuturor, si bun venit la Walkthrough 4. 5 00:00:11,670 --> 00:00:14,270 >> Astazi PSET nostru este criminalistica. 6 00:00:14,270 --> 00:00:18,080 Criminalistica este un foarte distractiv, care PSET presupune lucrul cu fișiere bitmap 7 00:00:18,080 --> 00:00:21,550 pentru a descoperi care a comis o infracțiune. 8 00:00:21,550 --> 00:00:24,200 Apoi, vom redimensiona unele fișiere bitmap, 9 00:00:24,200 --> 00:00:27,780 apoi vom merge, de asemenea, să se ocupe de o parte foarte distractiv numit Recuperare, 10 00:00:27,780 --> 00:00:31,160 în care suntem înmânat de fapt un card de memorie 11 00:00:31,160 --> 00:00:34,350 în care cineva a șters accidental toate fișierele lor, 12 00:00:34,350 --> 00:00:38,860 și ni se cere să recupereze aceste fișiere. 13 00:00:38,860 --> 00:00:42,910 >> Dar, în primul rând, înainte de a ajunge în PSET, eu chiar vreau doar să-l felicit pe toți. 14 00:00:42,910 --> 00:00:45,230 Suntem pe cale de la punctul de mijloc al acestui curs. 15 00:00:45,230 --> 00:00:50,070 Chestionar 0 este în spatele nostru, și noi suntem la pset4, deci, în esență, suntem la jumatatea drumului. 16 00:00:50,070 --> 00:00:55,490 Am parcurs un drum lung, dacă te uiți înapoi la psets dvs., pset0 și pset1, 17 00:00:55,490 --> 00:00:57,300 deci te felicit cu privire la faptul că, 18 00:00:57,300 --> 00:01:00,760 și vom intra în niște chestii foarte distractiv. 19 00:01:00,760 --> 00:01:07,070 >> Deci, set de instrumente nostru pentru acest PSET, din nou, în loc de a rula sudo yum-y update, 20 00:01:07,070 --> 00:01:13,890 suntem capabili de a rula doar update50 daca esti la versiunea 17.3 și mai sus a aparatului. 21 00:01:13,890 --> 00:01:17,380 Deci, asigurați-vă că pentru a rula update50 - e mai ușor o mulțime, câteva personaje mai puțin - 22 00:01:17,380 --> 00:01:20,640 pentru a vă asigura că sunteți la cea mai recentă versiune a aparatului. 23 00:01:20,640 --> 00:01:25,410 Mai ales că e important să update50 atunci când vom începe să utilizați CS50 Data Check. 24 00:01:25,410 --> 00:01:28,700 Deci, asigurați-vă că faceți asta. 25 00:01:28,700 --> 00:01:30,760 >> Pentru toate secțiunile pentru acest PSET, 26 00:01:30,760 --> 00:01:34,350 vom fi de-a face cu intrări și ieșiri de fișiere, file I / O. 27 00:01:34,350 --> 00:01:38,140 Vom fi merge peste o mulțime de programe care se ocupă cu matrice 28 00:01:38,140 --> 00:01:40,350 subliniind fișiere și lucruri de genul asta, 29 00:01:40,350 --> 00:01:43,050 așa că doriți să vă asigurați că suntem cu adevărat familiară și confortabilă 30 00:01:43,050 --> 00:01:47,990 de-a face cu modul de a de intrare și de ieșire în fișiere. 31 00:01:47,990 --> 00:01:52,080 >> În codul de distribuție pentru acest PSET este un fișier numit copy.c, 32 00:01:52,080 --> 00:01:55,280 și asta e ceea ce am de gând să găsească va fi foarte util pentru noi 33 00:01:55,280 --> 00:02:00,340 pentru că vom ajunge de fapt, copierea fișierul copy.c 34 00:02:00,340 --> 00:02:05,350 și doar schimbând ușor să fie în măsură să realizeze primele 2 părți ale set de probleme. 35 00:02:05,350 --> 00:02:09,030 >> Și așa cum am menționat atunci înainte, avem de-a face cu fișiere bitmap, precum și JPEG. 36 00:02:09,030 --> 00:02:13,170 Deci, într-adevăr înțelegerea structurii de modul în care aceste fișiere sunt organizate, 37 00:02:13,170 --> 00:02:16,170 cum putem traduce într-adevăr 0s și 1s în structs 38 00:02:16,170 --> 00:02:19,040 și lucrurile pe care le pot înțelege și interpreta de fapt și edita, 39 00:02:19,040 --> 00:02:21,000 care va fi foarte important, 40 00:02:21,000 --> 00:02:25,970 astfel a intra în JPEG și fișiere bitmap și înțelegerea structurii acestora. 41 00:02:25,970 --> 00:02:30,780 >> Pset4, ca de obicei, începe cu o secțiune de întrebări. 42 00:02:30,780 --> 00:02:36,600 Cei se va ocupa de dosar I / O și te obișnuiți cu asta. 43 00:02:36,600 --> 00:02:42,520 Apoi, partea 1 este roman sau film polițist, în care ai de dat un fișier de tip bitmap 44 00:02:42,520 --> 00:02:45,630 care arata un fel de pete roșii peste tot. 45 00:02:45,630 --> 00:02:52,180 Și apoi, practic ceea ce am de gând să faceți este să luați acest fisier si doar o editați ușor 46 00:02:52,180 --> 00:02:54,010 într-o versiune pe care le putem citi. 47 00:02:54,010 --> 00:02:56,000 În esență, după ce vom termina, vom avea același fișier, 48 00:02:56,000 --> 00:03:02,630 cu excepția vom putea vedea mesajul ascuns ascuns de toate acele puncte roșii. 49 00:03:02,630 --> 00:03:07,310 Atunci Resize este un program care, având în vedere un fișier 50 00:03:07,310 --> 00:03:11,490 și având în vedere apoi numele fișierului pe care să emită și dat apoi un număr la fel de bine, 51 00:03:11,490 --> 00:03:16,850 va redimensiona de fapt, că bitmap de această valoare întreagă. 52 00:03:16,850 --> 00:03:19,240 Apoi în sfârșit, avem PSET recupera. 53 00:03:19,240 --> 00:03:24,160 Ni se dă o cartelă de memorie și apoi trebuie să recupereze toate fotografiile 54 00:03:24,160 --> 00:03:25,920 care au fost șterse accidental, 55 00:03:25,920 --> 00:03:31,420 dar, după cum vom afla, nu, de fapt, șterse și eliminate din dosar; 56 00:03:31,420 --> 00:03:38,470 am doar un fel de pierdere în cazul în care acestea au fost în dosar, dar vom recupera. 57 00:03:38,470 --> 00:03:44,950 >> Mare. Deci, merge într-un fișier I / O, în mod special, acestea sunt o listă întreagă de funcții pe care le veți folosi. 58 00:03:44,950 --> 00:03:49,840 Ati vazut deja un pic elementele de bază ale fopen, fread, fwrite și, 59 00:03:49,840 --> 00:03:54,350 dar ne vom uita mai departe, în unele file I / O funcții, cum ar fi fputc, 60 00:03:54,350 --> 00:03:56,930 în care se scrie doar un caracter la un moment dat, 61 00:03:56,930 --> 00:04:02,000 la fseek, în cazul în care vă mutați fel de indicatorul de poziție fișierul înainte și înapoi, 62 00:04:02,000 --> 00:04:05,770 și apoi altele. Dar noi vom merge în faptul că un pic mai târziu, în timpul PSET. 63 00:04:08,050 --> 00:04:13,100 >> Deci, mai întâi, doar pentru a obține într-un fișier I / O, înainte de a merge în PSET, 64 00:04:13,100 --> 00:04:19,860 pentru a deschide un fișier, de exemplu, ceea ce trebuie să faceți este să setați, de fapt un pointer la acel fișier. 65 00:04:19,860 --> 00:04:22,710 Deci avem un pointer * FILE. 66 00:04:22,710 --> 00:04:27,140 În acest caz, am numind-o un indicator pentru că, în va fi infile mea. 67 00:04:27,140 --> 00:04:33,340 Și așa am de gând să utilizeze funcția fopen și apoi numele fișierului 68 00:04:33,340 --> 00:04:36,360 și apoi modul în care am de gând să se ocupe cu fișierul. 69 00:04:36,360 --> 00:04:42,080 Deci nu e "r", în acest caz, pentru a citi, "w", pentru scris, și apoi "o" pentru extensia. 70 00:04:42,080 --> 00:04:44,270 De exemplu, atunci când ai de a face cu un infile 71 00:04:44,270 --> 00:04:47,310 și tot ce doriți să faceți este să citiți biți și bytes stocate acolo, 72 00:04:47,310 --> 00:04:50,420 atunci esti, probabil, de gând să doriți să utilizați "r" ca modul tău. 73 00:04:50,420 --> 00:04:54,520 Când doriți să scrie de fapt, un fel de a face un fișier nou, 74 00:04:54,520 --> 00:04:57,220 atunci ceea ce am de gând să faceți este să mergem pentru a deschide noul fișier 75 00:04:57,220 --> 00:05:02,410 și de a folosi "w" modul de scriere. 76 00:05:02,410 --> 00:05:07,540 >> Deci, atunci când sunteți de fapt, citind în fișiere, structura este după cum urmează. 77 00:05:07,540 --> 00:05:14,930 În primul rând să includeți indicatorul pentru a struct care va conține octeți pe care îl citesc. 78 00:05:14,930 --> 00:05:19,830 Așa că va fi locația sfârșitul octeți pe care îl citesc. 79 00:05:19,830 --> 00:05:23,360 Te apoi merge pentru a indica dimensiunea, ca principiu, cât de multe bytes 80 00:05:23,360 --> 00:05:30,100 programul dumneavoastră trebuie să citesc în la dosar, dimensiunea practic un element este, 81 00:05:30,100 --> 00:05:32,620 si apoi ai de gând să specificați cât de multe elemente pe care doriți să îl citiți. 82 00:05:32,620 --> 00:05:34,980 Și apoi în cele din urmă, trebuie să știi unde te citind din, 83 00:05:34,980 --> 00:05:37,580 astfel încât va fi indicatorul în. 84 00:05:37,580 --> 00:05:41,780 Am culorilor, acestea deoarece fread este de asemenea foarte asemanatoare cu fwrite, 85 00:05:41,780 --> 00:05:47,050 , cu excepția doriți să vă asigurați că utilizați ordinea corectă, 86 00:05:47,050 --> 00:05:51,960 asigurați-vă că sunteți de fapt, scriere sau citire din fișierul dreapta. 87 00:05:54,910 --> 00:05:58,610 >> Deci la fel ca înainte, dacă avem dimensiunea elementului, precum și numărul de elemente, 88 00:05:58,610 --> 00:06:00,600 atunci putem juca în jurul valorii de aici, un pic. 89 00:06:00,600 --> 00:06:06,810 Spune că am un câine și struct da, atunci vreau să citesc doi caini, la un moment dat. 90 00:06:06,810 --> 00:06:12,450 Ce am putea face este marimea spune un element va fi dimensiunea de un câine 91 00:06:12,450 --> 00:06:14,770 și am de gând să citesc de fapt, doi dintre ei. 92 00:06:14,770 --> 00:06:18,290 Alternativ, ceea ce am putea face este spun că sunt doar de gând să citesc un element 93 00:06:18,290 --> 00:06:21,340 și că un element va fi dimensiunea de doi câini. 94 00:06:21,340 --> 00:06:24,320 Deci, asta e analog cum puteți fel de joc în jurul valorii de cu dimensiunea și numărul de 95 00:06:24,320 --> 00:06:28,250 în funcție de ceea ce este mai mult intuitiv pentru tine. 96 00:06:28,250 --> 00:06:30,810 >> Bine. Deci, acum ajungem la fișiere de scriere. 97 00:06:30,810 --> 00:06:36,880 Când doriți să scrie un fișier, primul argument este, de fapt în cazul în care sunteți de lectură de la. 98 00:06:36,880 --> 00:06:42,050 Deci, asta e practic datele pe care aveți de gând să scrie în fișierul, 99 00:06:42,050 --> 00:06:44,490 care este indicatorul la sfârșitul. 100 00:06:44,490 --> 00:06:47,670 Așa că atunci când ai de a face cu PSET, asigurați-vă că nu obține confuz. 101 00:06:47,670 --> 00:06:50,480 Poate că au partea definiții, prin partea. 102 00:06:50,480 --> 00:06:58,090 Puteți trage definițiile în manualul de tastarea om și fwrite, apoi, de exemplu, 103 00:06:58,090 --> 00:06:59,950 în terminalul, sau puteți referi înapoi la acest diapozitiv 104 00:06:59,950 --> 00:07:03,570 și asigurați-vă că utilizați corect. 105 00:07:03,570 --> 00:07:08,700 Deci, din nou, pentru fwrite, atunci când aveți un fișier pe care doriți să scrie în, 106 00:07:08,700 --> 00:07:14,290 care va fi ultimul argument și că va fi un pointer la acel fișier. 107 00:07:14,290 --> 00:07:18,670 Deci asta e modul în care avem de a face cu scrierea, probabil, mai multe octeți la un moment dat, 108 00:07:18,670 --> 00:07:21,820 dar presupunem că doriți să scrieți doar în doar un caracter unic. 109 00:07:21,820 --> 00:07:25,940 După cum vom vedea mai târziu în acest exemplu, în bitmap vom avea de a utiliza asta. 110 00:07:25,940 --> 00:07:32,180 Asta e atunci când putem folosi fputc, în esență, pune doar un caracter la un moment dat, Chr, 111 00:07:32,180 --> 00:07:37,050 în pointerul fișierului, și asta e indicatorul nostru acolo. 112 00:07:38,700 --> 00:07:41,560 Deci ori de câte ori căutăm sau să scrie într-un fișier, 113 00:07:41,560 --> 00:07:44,690 fișierul este pastrarii unei piste unde suntem. 114 00:07:44,690 --> 00:07:47,810 Deci e un fel de cursor, poziția indicatorul fișierului. 115 00:07:47,810 --> 00:07:54,330 Și așa ori de câte ori scrie sau să citească din nou într-un fișier, 116 00:07:54,330 --> 00:07:56,760 fișierul de fapt, își amintește în cazul în care aceasta este, 117 00:07:56,760 --> 00:07:59,270 și astfel continuă de unde cursorul este. 118 00:07:59,270 --> 00:08:03,970 Acest lucru poate fi benefic, atunci când doriți, să zicem, citiți într-o anumită sumă pentru a face ceva 119 00:08:03,970 --> 00:08:06,160 și a citit apoi în următoarea sumă, 120 00:08:06,160 --> 00:08:10,700 dar, uneori, s-ar putea dori să se întoarcă sau de fapt, începe de la o anumită valoare de referință. 121 00:08:10,700 --> 00:08:16,870 Deci, atunci funcția fseek, ceea ce face este ne permite pentru a muta cursorul într-un anumit fișier 122 00:08:16,870 --> 00:08:19,680 un anumit număr de octeți. 123 00:08:19,680 --> 00:08:24,260 Și atunci ce trebuie să facem este specifica în cazul în care valoarea de referință este. 124 00:08:24,260 --> 00:08:31,520 Deci, fie că se deplasează înainte sau înapoi de unde cursorul prezent este, 125 00:08:31,520 --> 00:08:35,750 sau putem specifica faptul că acesta ar trebui să treacă doar de la începutul fișierului 126 00:08:35,750 --> 00:08:37,090 sau de la sfârșitul fișierului. 127 00:08:37,090 --> 00:08:41,230 Și astfel încât să puteți trece la valori negative sau pozitive la suma, 128 00:08:41,230 --> 00:08:44,960 și că va fel de a muta cursorul, fie înainte sau înapoi. 129 00:08:46,170 --> 00:08:51,920 >> Înainte de a intra în psets celelalte, orice întrebări pe fișier I / O? 130 00:08:53,860 --> 00:08:59,990 Bine. Așa cum am intra în mai multe exemple, nu ezitați să mă opresc pentru întrebări. 131 00:08:59,990 --> 00:09:06,930 >> Deci, în roman sau film polițist, ești dat un fișier de tip bitmap similar cu acesta roșu pe diapozitiv, 132 00:09:06,930 --> 00:09:14,510 si se pare ca asta - o grămadă de puncte roșii - și nu știi cu adevărat ce este scris. 133 00:09:14,510 --> 00:09:23,310 Dacă vă strabism, ați putea fi capabil de a vedea o culoare albastruie ușoară în interiorul mijloc. 134 00:09:23,310 --> 00:09:26,270 În esență, asta e în cazul în care textul este stocat. 135 00:09:26,270 --> 00:09:30,270 Nu a fost o crimă ce sa întâmplat, iar noi trebuie să aflăm cine a făcut-o. 136 00:09:30,270 --> 00:09:36,760 În scopul de a face acest lucru, avem nevoie de un fel de a converti această imagine într-un format lizibil. 137 00:09:36,760 --> 00:09:42,740 Dacă voi întâlnit vreodată acest lucru, uneori, nu ar fi kituri de mici 138 00:09:42,740 --> 00:09:48,510 în cazul în care v-ați putea avea o lupă cu un film roșu. Oricine? Da. 139 00:09:48,510 --> 00:09:52,770 Deci, v-ar fi ceva de mână ca asta, ar avea o lupă 140 00:09:52,770 --> 00:09:58,130 cu filmul roșu peste ea, v-ar pune peste imaginea, 141 00:09:58,130 --> 00:10:03,410 și v-ar fi capabil de a vedea mesajul ascuns acolo. 142 00:10:03,410 --> 00:10:07,080 Noi nu avem o lupă cu film rosu, astfel încât în ​​loc vom crea un fel de propriile noastre 143 00:10:07,080 --> 00:10:09,060 în acest PSET. 144 00:10:09,060 --> 00:10:15,760 Și astfel utilizatorul este de gând să roman sau film polițist de intrare, apoi indiciu,. Bmp, 145 00:10:15,760 --> 00:10:18,800 asa ca asta e infile, asta e mesajul red dot, 146 00:10:18,800 --> 00:10:23,550 și apoi ei spun verdict.bmp va fi outfile noastră. 147 00:10:23,550 --> 00:10:27,900 Deci, se va crea o imagine bitmap nou similar cu un indiciu 148 00:10:27,900 --> 00:10:32,600 cu excepția cazului în-un format lizibil unde putem vedea mesajul ascuns. 149 00:10:32,600 --> 00:10:37,550 >> Din moment ce am de gând să se ocupe cu editarea și manipularea bitmap de un anumit fel, 150 00:10:37,550 --> 00:10:42,400 vom arunca cu capul în fel de în structura acestor fișiere bitmap. 151 00:10:42,400 --> 00:10:48,130 Am trecut peste astea un pic cam în curs, dar să ne uităm în ele ceva mai mult. 152 00:10:48,130 --> 00:10:51,740 Bitmap sunt în esență, doar un aranjament de octeți 153 00:10:51,740 --> 00:10:55,790 în cazul în care am precizat care înseamnă octeți ce. 154 00:10:55,790 --> 00:11:00,540 Deci, aici este un fel de hartă a imaginii bitmap 155 00:11:00,540 --> 00:11:08,550 spunând că acesta începe cu unele fișiere antet, începe cu unele informații acolo. 156 00:11:08,550 --> 00:11:16,540 Veți vedea că la aproximativ 14 numarul octet dimensiunea este indicată de imagine bitmap, 157 00:11:16,540 --> 00:11:18,520 și continuă pe. 158 00:11:18,520 --> 00:11:23,810 Dar atunci ce suntem cu adevărat interesați și de aici se începe în jurul valorii de numărul de octet 54. 159 00:11:23,810 --> 00:11:26,060 Avem aceste triplete RGB. 160 00:11:26,060 --> 00:11:30,760 Ceea ce se întâmplă să faceți este să conțină pixeli reale, valorile de culoare. 161 00:11:30,760 --> 00:11:35,950 Tot mai sus că, în antetul este unele informații 162 00:11:35,950 --> 00:11:41,240 corespunzător dimensiunea imaginii, lățimea imaginii și înălțimea. 163 00:11:41,240 --> 00:11:44,930 Când mergem în umplutură mai târziu, vom vedea de ce dimensiunea imaginii 164 00:11:44,930 --> 00:11:48,670 ar putea fi diferită decât lățimea sau înălțimea. 165 00:11:48,670 --> 00:11:54,240 Deci, atunci pentru a reprezenta aceste - aceste imagini bitmap sunt secvențe de octeți - 166 00:11:54,240 --> 00:11:59,370 ceea ce am putea face este bine spune, am de gând să-mi amintesc că, la indicele de 14, 167 00:11:59,370 --> 00:12:03,380 asta e în cazul în care dimensiunea este, de exemplu, ci ceea ce am de gând să fac pentru a face acest lucru mai ușor 168 00:12:03,380 --> 00:12:06,020 este acesta incapsuleaza intr-o struct. 169 00:12:06,020 --> 00:12:08,880 Și astfel avem două struct făcute pentru noi, un BITMAPFILEHEADER 170 00:12:08,880 --> 00:12:10,440 și o BITMAPINFOHEADER, 171 00:12:10,440 --> 00:12:14,840 și așa ori de câte ori am citit în acest dosar, în mod implicit, va fi merge în ordine, 172 00:12:14,840 --> 00:12:22,360 și astfel, în ordinea în care, de asemenea, de gând să completeze în variabile, cum ar fi biWidth și biSize. 173 00:12:25,270 --> 00:12:31,230 Și apoi în cele din urmă, fiecare pixel este reprezentat de trei octeți. 174 00:12:31,230 --> 00:12:35,500 Primul este cantitatea de albastru, în pixeli, a doua este cantitatea de verde, 175 00:12:35,500 --> 00:12:41,120 și, în final, cantitatea de roșu, unde 0 este, în esență nici verde, albastru sau roșu sau nu o 176 00:12:41,120 --> 00:12:43,720 și apoi ff este valoarea maximă. 177 00:12:43,720 --> 00:12:46,800 Acestea sunt valori hexazecimale. 178 00:12:46,800 --> 00:12:53,870 Deci, dacă avem FF0000, apoi care corespunde valorii maxime a albastru 179 00:12:53,870 --> 00:12:58,890 si atunci nu mai verde și nu roșu, astfel încât atunci ne-ar da un pixel albastru. 180 00:12:58,890 --> 00:13:04,190 Apoi, dacă avem cu toții ff lui peste bord, atunci înseamnă că avem un pixel alb. 181 00:13:04,190 --> 00:13:11,370 Aceasta este un fel de opus de obicei atunci când spunem că RGB. Se întâmplă de fapt BGR. 182 00:13:12,750 --> 00:13:18,990 >> Deci, dacă ne uităm, de fapt într-un exemplu de imagine bitmap - lasa-ma sa o trag aici. 183 00:13:31,560 --> 00:13:33,830 E un mic mic. 184 00:13:39,890 --> 00:13:47,840 Sunt zoom in, și putem vedea e pixelated. Se pare ca blocuri de culoare. 185 00:13:47,840 --> 00:13:50,110 Ai blocuri albe și apoi blocuri de culoare roșie. 186 00:13:50,110 --> 00:13:53,700 Dacă joci în Microsoft Paint, de exemplu, ai putea face ceva de genul asta 187 00:13:53,700 --> 00:13:58,960 de fapt doar pictura pătrate anumite într-o anumită ordine. 188 00:13:58,960 --> 00:14:08,060 Deci, atunci ce acest lucru se traduce în bitmap este după cum urmează. 189 00:14:08,060 --> 00:14:15,710 Aici avem primul pixeli albi, că toate 6 sunt ai lui f, iar apoi avem pixeli roșii, 190 00:14:15,710 --> 00:14:19,910 indicată de 0000FF. 191 00:14:19,910 --> 00:14:27,940 Și astfel, secvența de octeți pe care le avem indică modul în care imaginea bitmap este de gând să uite. 192 00:14:27,940 --> 00:14:32,230 Deci, ceea ce am făcut aici este doar scris toate acele octeți și apoi colorate în roșu 193 00:14:32,230 --> 00:14:37,550 astfel încât să puteți vedea un fel de, dacă strabism un pic, modul în care indică un fel de o fata zambitoare. 194 00:14:40,180 --> 00:14:46,390 >> Modul în care locul de muncă bitmap imagini este practic l-am imagina ca o grilă. 195 00:14:46,390 --> 00:14:54,940 Și astfel în mod implicit, fiecare rand al grilei trebuie să fie un multiplu de 4 octeți. 196 00:15:00,520 --> 00:15:07,060 Dacă ne uităm la o imagine bitmap, pe care îl completați în fiecare valoare. 197 00:15:07,060 --> 00:15:17,370 De exemplu, este posibil să aveți un roșu aici, un verde aici, un albastru aici, 198 00:15:17,370 --> 00:15:24,950 dar trebuie să vă asigurați că imaginea este completat cu un multiplu de patru octeți. 199 00:15:24,950 --> 00:15:32,200 Deci, dacă vreau imaginea mea să fie de trei blocuri de larg, atunci mi-ar trebui să pună o valoare gol 200 00:15:32,200 --> 00:15:35,640 în ultima pentru a face un multiplu de patru. 201 00:15:35,640 --> 00:15:39,530 Așa că atunci aș adăuga în ceva care ne suni umplutură. 202 00:15:39,530 --> 00:15:43,750 Mă duc pentru a indica faptul că există cu un x. 203 00:15:44,920 --> 00:15:54,160 Acum spune dorim o imagine care este de 7 pixeli lung, de exemplu. 204 00:15:54,160 --> 00:15:59,550 Avem 1, 2, 3, 4, 5, 6, 7, 205 00:16:04,750 --> 00:16:07,000 și toate, care este umplut cu culoare. 206 00:16:07,000 --> 00:16:10,620 Modul în care imaginile bitmap lucra este că avem nevoie de un 8-a. 207 00:16:10,620 --> 00:16:12,460 Chiar acum avem 1, 2, 3, 4, 5, 6, 7. 208 00:16:12,460 --> 00:16:19,360 Avem nevoie de 8 locuri pentru imaginea bitmap pentru a citi corect. 209 00:16:19,360 --> 00:16:25,600 Deci ceea ce trebuie să faceți este să adăugați în doar un pic de umplutură 210 00:16:25,600 --> 00:16:29,430 pentru a vă asigura că toate lățimile sunt uniforme 211 00:16:29,430 --> 00:16:34,260 și că toate lățimile sunt un multiplu de 4. 212 00:16:42,110 --> 00:16:47,310 Și așa am indicat mai sus, padding ca x sau o linie de greu de descifrat, 213 00:16:47,310 --> 00:16:53,880 dar în imaginile reale bitmap padding este indicată cu un 0 hexazecimal. 214 00:16:53,880 --> 00:16:57,340 Deci, care ar fi un singur caracter, 0. 215 00:16:58,980 --> 00:17:06,329 Ce ar putea veni la îndemână este comanda xxd. 216 00:17:06,329 --> 00:17:11,220 Ceea ce face este de fapt vă arată, cum ar fi similar cu ceea ce am făcut înainte cu smiley 217 00:17:11,220 --> 00:17:15,630 De fapt, când am imprimat ce fiecare culoare ar fi pentru pixel 218 00:17:15,630 --> 00:17:21,800 și apoi cu ajutorul culorilor, atunci când rulați xxd cu următoarele comenzi, 219 00:17:21,800 --> 00:17:28,670 apoi îl va imprima de fapt, ce culorile sunt pentru acei pixeli. 220 00:17:28,670 --> 00:17:33,810 Ceea ce trebuie sa faci este aici eu indică, la fel ca s-54 221 00:17:33,810 --> 00:17:36,530 spune că am de gând să înceapă de la octet 54 222 00:17:36,530 --> 00:17:40,820 pentru că înainte de asta, amintiți-vă, dacă ne uităm înapoi la harta de bitmap-uri, 223 00:17:40,820 --> 00:17:42,690 asta e tot ce informațiile de antet și lucruri de genul asta. 224 00:17:42,690 --> 00:17:46,280 Dar ceea ce ne interesează cu adevărat este despre pixelii reale care indică culoarea. 225 00:17:46,280 --> 00:17:52,700 Deci, prin adăugarea în acest pavilion,-S 54, atunci suntem capabili de a vedea valorile de culoare. 226 00:17:52,700 --> 00:17:56,020 Și nu vă faceți griji cu privire la steagurile complicate și lucruri de genul asta. 227 00:17:56,020 --> 00:18:05,020 În spec. set de probleme, vei avea directii despre cum să utilizați xxd pentru a afișa pixeli. 228 00:18:07,070 --> 00:18:15,590 Deci, dacă vedeți aici, un fel de arata ca o cutie verde, acest lucru mic. 229 00:18:15,590 --> 00:18:23,610 Am culorilor, 00ff00 spunand ca practic nici albastru, o mulțime de verde, și nu roșu. 230 00:18:23,610 --> 00:18:26,370 Deci, care corespunde verde. 231 00:18:26,370 --> 00:18:31,920 După cum vedeți aici, vom vedea un dreptunghi verde. 232 00:18:31,920 --> 00:18:36,660 Acest dreptunghi verde este la numai 3 pixeli lățime, deci atunci ce trebuie să facem 233 00:18:36,660 --> 00:18:44,350 pentru a vă asigura că imaginea este un multiplu de 4 largi este să adăugați în padding suplimentare. 234 00:18:44,350 --> 00:18:49,460 Și astfel, atunci cum veți vedea aceste 0s aici. 235 00:18:49,460 --> 00:18:54,510 Acest lucru va fi de fapt rezultatul Redimensionare PSET dumneavoastră, 236 00:18:54,510 --> 00:19:01,350 luând în esență, bitmap mic și apoi majorându-se cu 4. 237 00:19:01,350 --> 00:19:09,380 Și astfel ceea ce vedem este că, de fapt această imagine este de 12 pixeli lățime, dar 12 este un multiplu de 4, 238 00:19:09,380 --> 00:19:12,940 și astfel avem de fapt, nu văd nici 0s la capăt, deoarece nu avem nevoie să adăugați orice 239 00:19:12,940 --> 00:19:19,070 deoarece este pe deplin căptușite. Ea nu are nici o cameră mai mult. 240 00:19:20,720 --> 00:19:23,470 >> Bine. Orice întrebări despre umplutură? 241 00:19:25,150 --> 00:19:27,460 Bine. Mișto. 242 00:19:27,460 --> 00:19:32,520 >> Așa cum am menționat mai înainte, bitmap-uri sunt doar o secvență de octeți. 243 00:19:32,520 --> 00:19:39,170 Și astfel ceea ce avem este loc de care au nevoie pentru a ține evidența exact ce număr de octet 244 00:19:39,170 --> 00:19:47,050 corespunde un element specific, de fapt, am creat o structura pentru a reprezenta. 245 00:19:47,050 --> 00:19:50,930 Deci, ceea ce avem este o struct RGBTRIPLE. 246 00:19:50,930 --> 00:19:54,590 Ori de câte ori aveți o instanță a unui triplu RGB, 247 00:19:54,590 --> 00:20:00,970 deoarece acesta este un tip de defini struct, atunci puteți accesa variabila rgbtBlue, 248 00:20:00,970 --> 00:20:09,520 În mod similar, variabilele verde și roșu, care va indica cat de mult albastru, verde, roșu și 249 00:20:09,520 --> 00:20:11,580 respectiv, ai. 250 00:20:11,580 --> 00:20:16,800 >> Deci, dacă avem variabila set albastru la 0, setul verde la FF, 251 00:20:16,800 --> 00:20:22,060 care este valoarea maximă poti avea, iar apoi variabila roșu setată la 0, 252 00:20:22,060 --> 00:20:27,870 atunci ce culoare ar prezenta special, RGB triplu reprezinta? >> [Elev] Verde. 253 00:20:27,870 --> 00:20:29,150 Verde. Exact. 254 00:20:29,150 --> 00:20:34,480 Acesta va fi util să știți că ori de câte ori aveți o instanță a unui triplu RGB, 255 00:20:34,480 --> 00:20:41,340 puteți accesa de fapt, cantitatea de culoare - albastru, verde și roșu - separat. 256 00:20:43,350 --> 00:20:54,900 >> Acum, că am vorbit despre structura pe care, haideți să aruncăm o privire la fișierul BMP. 257 00:20:54,900 --> 00:20:57,870 Acestea sunt făcute pentru tine struct. 258 00:20:57,870 --> 00:21:01,820 Aici avem o struct BITMAPFILEHEADER. 259 00:21:01,820 --> 00:21:07,610 De interes este dimensiunea. 260 00:21:07,610 --> 00:21:12,660 Mai târziu, avem antet informații, care are câteva lucruri care sunt mai interesante pentru noi, 261 00:21:12,660 --> 00:21:15,480 și anume dimensiunea, latimea, inaltimea si. 262 00:21:15,480 --> 00:21:19,170 Așa cum vom merge în mai târziu, atunci când ai citit in pentru a fișier, 263 00:21:19,170 --> 00:21:25,500 se citește în mod automat, deoarece ne-am stabilit pentru a fi la fel. 264 00:21:25,500 --> 00:21:31,990 Deci, biSize va conține octeți dreptul care corespund dimensiunea reală a imaginii. 265 00:21:34,700 --> 00:21:40,500 Și apoi aici, în cele din urmă, așa cum am vorbit despre, avem struct RGBTRIPLE typedef. 266 00:21:40,500 --> 00:21:46,840 Avem un rgbtBlue, verde, roșu și asociate cu ea. 267 00:21:48,210 --> 00:21:49,340 >> Mare. Bine. 268 00:21:49,340 --> 00:21:56,360 Acum, că am înțeles bitmap un pic, să înțelegeți că avem un antet fișier 269 00:21:56,360 --> 00:22:00,790 și un antet informatiile asociate cu acesta și apoi după aceea, avem lucruri interesante 270 00:22:00,790 --> 00:22:05,110 de culori, iar aceste culori sunt reprezentate de structs RGBTRIPLE, 271 00:22:05,110 --> 00:22:12,710 și cei, la rândul lor, au trei valori asociate albastru, verde, rosu si. 272 00:22:12,710 --> 00:22:17,270 >> Deci, acum, putem fel de Recuperare cred despre un pic. 273 00:22:17,270 --> 00:22:20,130 Scuze. Gândiți-vă la roman sau film polițist. 274 00:22:20,130 --> 00:22:25,750 Când avem fișierul nostru de idee, atunci ceea ce dorim să facem este să-l citesc în pixel cu pixel 275 00:22:25,750 --> 00:22:33,860 si apoi schimba cumva acei pixeli, astfel încât să putem scoate într-un format ușor de citit. 276 00:22:33,860 --> 00:22:41,020 Și așa să-l transmite, vom scrie pixel cu pixel în fișierul verdict.bmp. 277 00:22:41,020 --> 00:22:45,120 Asta e un fel de multe de făcut. Ne dăm seama că. 278 00:22:45,120 --> 00:22:49,860 Deci, ceea ce am făcut este de fapt am le-ați furnizat cu copy.c. 279 00:22:49,860 --> 00:22:57,610 Ce copy.c face este doar face o copie exactă a unui fișier de tip bitmap dat și apoi scoate-l. 280 00:22:57,610 --> 00:23:01,900 Deci, aceasta deschide fișierul deja pentru tine, citește în pixel cu pixel, 281 00:23:01,900 --> 00:23:04,510 și apoi scrie într-un fișier de ieșire într-. 282 00:23:04,510 --> 00:23:07,080 >> Să aruncăm o privire la asta. 283 00:23:13,390 --> 00:23:18,290 Aceasta este asigurarea utilizării adecvate, 284 00:23:18,290 --> 00:23:22,640 obtinerea de nume de fișiere aici. 285 00:23:22,640 --> 00:23:29,940 Ceea ce face este aceasta stabilește fișierul de intrare pentru a fi ceea ce am trecut în în infile aici, 286 00:23:29,940 --> 00:23:34,750 care este al doilea în linia de comandă argumentul. 287 00:23:34,750 --> 00:23:37,640 Controale pentru a vă asigura că putem deschide fișierul. 288 00:23:38,960 --> 00:23:44,860 Controale să vă asigurați că putem face o outfile nou aici. 289 00:23:45,630 --> 00:23:53,270 Atunci ce face asta aici, doar practic începe să citească pentru a fișier de tip bitmap de la început. 290 00:23:53,270 --> 00:23:56,700 Început, după cum știm, conține BITMAPFILEHEADER, 291 00:23:56,700 --> 00:24:03,200 și astfel acele secvențe de biți vor completa în mod direct în BITMAPFILEHEADER. 292 00:24:03,200 --> 00:24:07,940 Deci, ce avem aici este a spune că BF BITMAPFILEHEADER - 293 00:24:07,940 --> 00:24:13,150 asta e variabila noul nostru a BITMAPFILEHEADER tip - 294 00:24:13,150 --> 00:24:22,560 am de gând să pună în interiorul BF ceea ce am citit de la în pointer, care este infile noastră. 295 00:24:22,560 --> 00:24:23,970 Cât de mult am citit? 296 00:24:23,970 --> 00:24:32,160 Am citit în modul în care de multe bytes avem nevoie să conțină BITMAPFILEHEADER întreg. 297 00:24:32,160 --> 00:24:34,660 În mod similar, asta e ceea ce facem noi pentru antet informatii. 298 00:24:34,660 --> 00:24:39,010 Deci, suntem în continuare de-a lungul fișierul nostru în infile, 299 00:24:39,010 --> 00:24:44,360 și suntem citirea acestor biți și bytes, iar noi că le conectați direct în 300 00:24:44,360 --> 00:24:47,880 în aceste cazuri ale variabilelor pe care le faci. 301 00:24:49,370 --> 00:24:53,800 Aici suntem doar asigurându-vă că este un bitmap bitmap. 302 00:24:57,670 --> 00:25:01,030 >> Acum avem un outfile, nu? 303 00:25:01,030 --> 00:25:04,420 Deci, ca atare atunci când l-am crea, în esență, e gol. 304 00:25:04,420 --> 00:25:07,710 Deci avem de a crea de fapt un bitmap nou de la zero. 305 00:25:07,710 --> 00:25:12,280 Ceea ce facem este trebuie să ne asigurăm că vom copia în antetul fișierului 306 00:25:12,280 --> 00:25:16,850 și antet informații la fel ca infile are. 307 00:25:16,850 --> 00:25:22,850 Ceea ce facem este vom scrie - și amintiți-vă că BF este variabila 308 00:25:22,850 --> 00:25:29,300 BITMAPFILEHEADER de tip, astfel încât ceea ce facem noi este doar faptul că vom folosi conținut 309 00:25:29,300 --> 00:25:34,980 pentru a scrie în outfile. 310 00:25:36,550 --> 00:25:38,510 Aici, îți amintești că am vorbit despre umplutură, 311 00:25:38,510 --> 00:25:47,820 cum e important să vă asigurați că suma de pixeli pe care le avem este un multiplu de 4. 312 00:25:47,820 --> 00:25:52,790 Aceasta este o formulă destul de util pentru a calcula cât de mult ai umplutură 313 00:25:52,790 --> 00:25:57,670 având în vedere lățimea de fișier. 314 00:25:57,670 --> 00:26:04,120 Vreau ca voi să vă amintiți că, în copy.c avem o formulă de calcul umplutură. 315 00:26:04,120 --> 00:26:07,970 Bine? Deci, toată lumea minte asta. Mare. 316 00:26:07,970 --> 00:26:14,050 Deci, atunci ce face copy.c următoare este iterează peste toate scanlines. 317 00:26:14,050 --> 00:26:23,730 Ea trece prin primele rânduri și apoi stochează fiecare triplă că citește 318 00:26:23,730 --> 00:26:26,920 și apoi scrie în outfile. 319 00:26:26,920 --> 00:26:33,120 Deci aici suntem doar o lectură RGB triplu la un moment dat 320 00:26:33,120 --> 00:26:39,860 și punerea apoi că triplă aceleași în outfile. 321 00:26:41,120 --> 00:26:48,340 Partea mai dificila este faptul că padding nu este un triplet RGB, 322 00:26:48,340 --> 00:26:55,200 și astfel nu putem citi doar că valoarea umplutură de triplete RGB. 323 00:26:55,200 --> 00:27:01,460 Ceea ce trebuie să facem este de fapt doar să mutați indicatorul de poziția noastră fișierul, mutați cursorul nostru, 324 00:27:01,460 --> 00:27:06,840 la fel de săriți peste tot padding, astfel că suntem la rândul următor. 325 00:27:06,840 --> 00:27:12,990 Și apoi ce face asta este copia vă arată cum ar putea să doriți să adăugați padding. 326 00:27:12,990 --> 00:27:14,990 Deci am calculat cât de mult avem nevoie de umplutură, 327 00:27:14,990 --> 00:27:18,220 Asta înseamnă că avem nevoie de numărul de umplutură 0s. 328 00:27:18,220 --> 00:27:24,510 Ceea ce face este un pentru buclă care pune numărul de umplutură 0s în outfile nostru. 329 00:27:24,510 --> 00:27:31,170 Și apoi în cele din urmă, vă închideți ambele fișiere. Să închideți infile, precum și outfile. 330 00:27:31,170 --> 00:27:34,870 >> Deci asta e modul în care copy.c lucrări, 331 00:27:34,870 --> 00:27:37,430 și că va fi destul de util. 332 00:27:39,720 --> 00:27:43,750 De fapt, în loc de doar direct copierea și lipirea-l 333 00:27:43,750 --> 00:27:46,800 sau doar se uită la ea și să tastați în tot ce vrei, 334 00:27:46,800 --> 00:27:49,440 este posibil să doriți doar să execute această comandă în terminal, 335 00:27:49,440 --> 00:27:54,520 cp copy.c whodunit.c, ceea ce va crea un nou fișier, whodunit.c, 336 00:27:54,520 --> 00:27:58,330 care conține conținutul exact același ca și copie face. 337 00:27:58,330 --> 00:28:03,880 Deci, atunci ce putem face este folosi ca un cadru pe care să construiască și să editați 338 00:28:03,880 --> 00:28:06,900 pentru fișierul nostru roman sau film polițist. 339 00:28:08,500 --> 00:28:14,670 >> Acestea sunt noastră de a-DOS să facă pentru roman sau film polițist, dar ceea ce face copy.c 340 00:28:14,670 --> 00:28:16,730 este, de fapt are grijă de cele mai multe dintre ele pentru noi. 341 00:28:16,730 --> 00:28:21,900 Deci, tot ce trebuie să faci în continuare este să modificați pixeli după cum este necesar 342 00:28:21,900 --> 00:28:25,920 pentru a face de fapt fișierul poate fi citit. 343 00:28:25,920 --> 00:28:32,960 Amintiți-vă că, pentru un pixel dat triplu, asa ca pentru o variabilă dată de RGBTRIPLE tip, 344 00:28:32,960 --> 00:28:35,990 puteți accesa valorile albastru, verde și roșu. 345 00:28:35,990 --> 00:28:38,670 Care va veni la îndemână, deoarece în cazul în care aveți posibilitatea să le accesați, 346 00:28:38,670 --> 00:28:41,770 asta înseamnă că puteți verifica, de asemenea, le, 347 00:28:41,770 --> 00:28:45,430 și asta înseamnă că puteți schimba, de asemenea, le. 348 00:28:45,430 --> 00:28:49,430 >> Așa că atunci când ne-am dus înapoi la exemplul nostru roșu lupă, 349 00:28:49,430 --> 00:28:53,390 în esență, că a fost acționând ca un fel de filtru pentru noi. 350 00:28:53,390 --> 00:28:58,160 Deci, ceea ce dorim să facem este să vrem filtra toate tripletele care vin inch 351 00:28:58,160 --> 00:29:01,240 Există mai multe moduri diferite de a face acest lucru. 352 00:29:01,240 --> 00:29:07,100 Practic, poti avea orice tip de filtru dorit. 353 00:29:07,100 --> 00:29:09,890 Poate că doriți să schimbați toți pixelii rosii 354 00:29:09,890 --> 00:29:13,570 sau poate doriți să modificați un pixel de culoare diferită de o culoare diferită. 355 00:29:13,570 --> 00:29:15,400 Asta depinde de tine. 356 00:29:15,400 --> 00:29:19,580 Amintiți-vă că puteți verifica ce culoare pixelilor este 357 00:29:19,580 --> 00:29:23,000 și apoi puteți modifica, de asemenea, ca te duci prin intermediul. 358 00:29:24,410 --> 00:29:26,420 >> Bine. Deci asta e roman sau film polițist. 359 00:29:26,420 --> 00:29:32,760 Odată ce aveți o roman sau film polițist, veți ști cine vinovat de crimă a fost. 360 00:29:32,760 --> 00:29:35,540 >> Acum vom merge la Resize. 361 00:29:35,540 --> 00:29:37,990 Vom fi în continuare de-a face cu bitmap-uri. 362 00:29:37,990 --> 00:29:40,750 Ceea ce am de gând să faci este vom avea un bitmap de intrare 363 00:29:40,750 --> 00:29:45,890 iar apoi vom trece într-un număr și apoi obține un bitmap outfile 364 00:29:45,890 --> 00:29:51,380 în cazul în care este practic infile nostru scalate de n. 365 00:29:54,670 --> 00:30:01,450 Spune dosarul meu a fost doar un pixel mare. 366 00:30:01,450 --> 00:30:09,100 Apoi, dacă n meu a fost de 3, scalare cu 3, atunci aș repeta că n pixeli număr de ori, 367 00:30:09,100 --> 00:30:14,410 SO 3 ori, iar apoi, de asemenea, scară-l jos de 3 ori la fel de bine. 368 00:30:14,410 --> 00:30:17,840 Deci, vedeți voi că extinderea vertical, cât și orizontal. 369 00:30:17,840 --> 00:30:19,680 >> Și apoi aici este un exemplu. 370 00:30:19,680 --> 00:30:27,590 Dacă aveți n = 2, veți vedea că primul pixel albastru acolo repetate de două ori 371 00:30:27,590 --> 00:30:30,930 orizontal, precum și de două ori pe verticală. 372 00:30:30,930 --> 00:30:38,040 Și apoi continuă pe care, și așa aveți o scalare directă a imaginii originale de către doi. 373 00:30:40,920 --> 00:30:47,600 >> Deci, dacă ar fi să detaliat pseudocod pentru aceasta, dorim să deschideți fișierul. 374 00:30:47,600 --> 00:30:49,880 Și apoi, știind că, dacă ne întoarcem aici, 375 00:30:49,880 --> 00:30:54,540 vedem că lățimea de outfile va fi diferit decât lățimea de infile. 376 00:30:54,540 --> 00:30:56,130 Ce înseamnă asta? 377 00:30:56,130 --> 00:31:01,230 Asta înseamnă că informațiile noastre antet se va schimba. 378 00:31:01,230 --> 00:31:03,790 Și deci ce vom dori să faceți este să actualizeze informatiile antet, 379 00:31:03,790 --> 00:31:11,820 știind că atunci când citim în fișierele dacă sunteți de operare pe cadru copy.c, 380 00:31:11,820 --> 00:31:17,570 avem deja o variabila care indică ceea ce este dimensiunea și lucruri de genul asta. 381 00:31:17,570 --> 00:31:24,060 Deci, odată ce ați că, ceea ce ar putea să doriți să faceți este să schimbe aceste variabile speciale. 382 00:31:24,060 --> 00:31:29,380 Amintiți-vă, dacă aveți un struct, modul în care accesați variabilele din asta. 383 00:31:29,380 --> 00:31:32,080 Puteți utiliza operatorul punct, nu? 384 00:31:32,080 --> 00:31:36,420 Deci folosind asta, știți că veți avea nevoie pentru a schimba informatii antet. 385 00:31:36,480 --> 00:31:41,030 Deci, aici e doar o listă a elementelor reale care vor să se schimbe în fișierul. 386 00:31:41,030 --> 00:31:45,180 Dimensiunea fișierului este de gând să se schimbe, imaginea, precum și lățimea și înălțimea. 387 00:31:45,180 --> 00:31:50,080 Deci, apoi merge înapoi la harta de bitmap-uri, 388 00:31:50,080 --> 00:31:57,730 uita-te la ea, dacă e antetul fișierului sau antet care conține informații că informațiile 389 00:31:57,730 --> 00:32:00,920 și apoi modificați după cum este necesar. 390 00:32:05,010 --> 00:32:12,470 Din nou, spun cp copy.c resize.c. 391 00:32:12,470 --> 00:32:19,270 Asta înseamnă că acum resize.c conține tot ceea ce este conținut în interiorul copie 392 00:32:19,270 --> 00:32:24,490 pentru că ne oferă o copie mod de a citi în fiecare pixel pentru a scanline cu pixel. 393 00:32:24,490 --> 00:32:29,860 Cu excepția acum, în loc de a schimba doar valorile așa cum am făcut-o în roman sau film polițist, 394 00:32:29,860 --> 00:32:37,980 ceea ce dorim să facem este vrem să scrie în pixeli mai multe 395 00:32:37,980 --> 00:32:43,580 atâta timp cât n nostru este mai mare decât 1. 396 00:32:43,580 --> 00:32:47,110 >> Atunci, ce vrem să facem este vrem să-l întindă orizontal cu n, 397 00:32:47,110 --> 00:32:50,490 precum și întinde pe verticală cât de n. 398 00:32:50,490 --> 00:32:52,710 Cum am putea face acest lucru? 399 00:32:52,710 --> 00:32:56,890 Spune n este 2 și aveți această infile dat. 400 00:32:56,890 --> 00:32:58,730 Cursorul este de gând să înceapă de la prima, 401 00:32:58,730 --> 00:33:03,530 și ceea ce vrei să faci în cazul în care n este 2, pe care doriți să imprimați în 2 din cele. 402 00:33:03,530 --> 00:33:05,490 Deci, să imprimați în 2 din cele. 403 00:33:05,490 --> 00:33:10,830 Apoi, cursorul se va muta la următoarea pixeli, care este rosie, 404 00:33:10,830 --> 00:33:18,400 și se va imprima 2 din acelea rosii, adaugarea se pe ceea ce se face înainte. 405 00:33:18,400 --> 00:33:26,280 Apoi, cursorul se va muta la următoarea pixel și să tragă în 2 din cele. 406 00:33:26,280 --> 00:33:37,180 Dacă te uiți înapoi la cadrul copy.c, ce face asta chiar aici 407 00:33:37,180 --> 00:33:42,830 se creează o nouă instanță a unui triplet RGB, o nouă variabilă numită triplu. 408 00:33:42,830 --> 00:33:50,500 Și aici, atunci când citește în ea, citește de la infile 1 RGBTRIPLE 409 00:33:50,500 --> 00:33:53,470 și îl stochează în interiorul acelei variabile triplu. 410 00:33:53,470 --> 00:33:57,590 Deci, atunci aveți de fapt, o variabilă care reprezintă acel pixel special. 411 00:33:57,590 --> 00:34:05,290 Apoi, când scrii, ceea ce ar putea să doriți să faceți este să incadrati declarația fwrite într-o buclă de 412 00:34:05,290 --> 00:34:11,080 că scrie în outfile dumneavoastră ori de câte ori este nevoie. 413 00:34:17,449 --> 00:34:20,100 Asta e destul de simplu. 414 00:34:20,200 --> 00:34:27,590 Doar repeta practic procesul de scriere n numărul de ori să-l scară orizontală. 415 00:34:27,590 --> 00:34:32,969 >> Dar apoi trebuie să ne amintim că padding noastră se va schimba. 416 00:34:47,350 --> 00:34:53,020 Anterior, spune că am avut ceva de lungime 3. 417 00:34:53,020 --> 00:35:00,130 Apoi, ne-ar adăuga doar în cât de mult umplutură? Doar un singur mai mult pentru a face un multiplu de 4. 418 00:35:00,130 --> 00:35:10,480 Dar spun suntem scalarea această imagine special prin n = 2. 419 00:35:10,480 --> 00:35:16,300 Deci, atunci numarul de pixeli albaștri ne-ar avea la sfârșitul anului? Ne-ar avea 6. 420 00:35:16,300 --> 00:35:21,470 1, 2, 3, 4, 5, 6. Bine. 421 00:35:21,470 --> 00:35:26,580 6 nu este un multiplu de 4. Care e cel mai apropiat multiplu de 4? Asta va fi 8. 422 00:35:26,580 --> 00:35:33,200 Deci, de fapt, vom avea 2 caractere de umplutură acolo. 423 00:35:33,200 --> 00:35:38,720 >> Are cineva aminte dacă avem o formulă pentru a calcula padding 424 00:35:38,720 --> 00:35:41,350 și în cazul în care ar putea fi? 425 00:35:41,350 --> 00:35:45,160 [Imperceptibil elev de răspuns] >> Da, copy.c. Corect. 426 00:35:45,160 --> 00:35:49,800 Există o formulă în copy.c pentru a calcula cât de mult ai umplutură 427 00:35:49,800 --> 00:35:53,810 dat o lățime special de imagine bitmap. 428 00:35:53,810 --> 00:36:02,950 Deci, atunci care va fi util atunci când aveți nevoie să adăugați într-o anumită sumă de umplutură 429 00:36:02,950 --> 00:36:06,160 să dau de fapt seama cât de mult padding trebuie să adăugați. 430 00:36:10,820 --> 00:36:15,850 Dar într-o notă, totuși, este că doriți să vă asigurați că sunteți folosind mărimea potrivită. 431 00:36:15,850 --> 00:36:21,410 Trebuie doar să fiți atenți, pentru că tu ești de fapt de gând să se ocupe cu două imagini bitmap. 432 00:36:21,410 --> 00:36:23,410 Doriți să vă asigurați că sunteți folosind dreptul de unul. 433 00:36:23,410 --> 00:36:26,820 Când sunteți calcularea padding pentru outfile, pe care doriți să utilizați lățimea outfile 434 00:36:26,820 --> 00:36:29,860 și nu lățimea anterior. 435 00:36:29,860 --> 00:36:37,240 >> Mare. Acest tip de stretching are grija de o imagine bitmap ansamblu orizontal. 436 00:36:37,240 --> 00:36:41,290 Dar ceea ce vrem să facem este de fapt întinde pe verticală, precum și. 437 00:36:41,290 --> 00:36:48,760 Acest lucru se întâmplă să fie un pic mai complicată pentru că atunci când ne-am terminat de copiat un rând 438 00:36:48,760 --> 00:36:51,580 și scris că rand, cursorul nostru va fi la sfârșitul anului. 439 00:36:51,580 --> 00:36:56,210 Deci, dacă am citit din nou, apoi se doar de gând să citesc în la linia următoare. 440 00:36:56,210 --> 00:37:03,660 Deci, ceea ce dorim să facem este un fel de găsi o modalitate de a copia aceste rânduri din nou 441 00:37:03,660 --> 00:37:12,500 sau doar un fel de a lua acel rând și apoi rescrierea din nou. 442 00:37:14,380 --> 00:37:17,940 Așa cum am un fel de aluzie la, există mai multe moduri diferite de a face acest lucru. 443 00:37:17,940 --> 00:37:23,040 Ce ai putea face este ca te duci prin citirea și prin scanline special 444 00:37:23,040 --> 00:37:28,560 și modificarea acesteia, după caz, apoi un fel de magazin toate aceste pixeli într-o matrice. 445 00:37:28,560 --> 00:37:36,350 Apoi, mai târziu, pe știți că veți avea nevoie pentru a imprima ca matrice din nou, 446 00:37:36,350 --> 00:37:39,830 și astfel încât să puteți utiliza doar că matrice pentru a face asta. 447 00:37:39,830 --> 00:37:44,500 Un alt mod de a face acest lucru este de ai putut copia în jos cu un rând, 448 00:37:44,500 --> 00:37:47,950 Înțeleg că aveți nevoie să copiați din nou, astfel muta cursorul de fapt, 449 00:37:47,950 --> 00:37:50,950 și care va fi folosind metoda fseek. 450 00:37:50,950 --> 00:37:56,410 Ai putea muta cursorul tot drumul înapoi și apoi repetați procesul de copiere din nou. 451 00:37:56,410 --> 00:38:03,960 >> Deci, în cazul în care numărul nostru de scalare este n, atunci cum de multe ori ne-ar trebui să ne întoarcem 452 00:38:03,960 --> 00:38:10,500 și rescrie o linie? >> [Elev] n - 1. Da >>, perfectă. n - 1. 453 00:38:10,500 --> 00:38:14,390 Am făcut-o deja o dată, astfel încât, atunci vom dori să repetați procesul de întoarcere 454 00:38:14,390 --> 00:38:17,460 n - 1 valoarea de ori. 455 00:38:22,730 --> 00:38:25,860 Bine. Deci nu aveți funcția de redimensionare. 456 00:38:25,860 --> 00:38:34,360 >> Acum putem ajunge la o parte foarte distractiv, PSET meu favorit, care este Recover. 457 00:38:34,360 --> 00:38:39,580 În loc de bitmap-uri, de data aceasta avem de-a face cu JPEG. 458 00:38:39,580 --> 00:38:43,370 Noi nu suntem de fapt un fișier dat doar de JPEG, 459 00:38:43,370 --> 00:38:46,600 suntem de fapt o primă dat format de card de memorie. 460 00:38:46,600 --> 00:38:51,790 Și astfel această contine un pic de valori și informații de gunoi la început, 461 00:38:51,790 --> 00:38:57,240 si apoi incepe si el are o grămadă de fișiere JPEG. 462 00:38:57,240 --> 00:39:03,430 Cu toate acestea, suntem înmânat o carte în care am șters fotografiile; 463 00:39:03,430 --> 00:39:08,300 în esență, ne-am uitat în cazul în care fotografiile sunt situate în carte. 464 00:39:08,300 --> 00:39:12,770 Deci, atunci sarcina noastră în Recover este de a merge prin acest format de cartelă 465 00:39:12,770 --> 00:39:16,500 și de a găsi acele poze din nou. 466 00:39:16,500 --> 00:39:23,990 >> Din fericire, structura de fișiere JPEG și fișiere carte este un pic de ajutor. 467 00:39:23,990 --> 00:39:28,850 Este cu siguranta ar fi fost un pic mai complicată în cazul în care nu au fost în acest format special. 468 00:39:28,850 --> 00:39:40,160 Fiecare fișier JPEG de fapt, începe cu două secvențe posibile, enumerate mai sus. 469 00:39:40,160 --> 00:39:42,970 Practic, ori de câte ori aveți un nou fișier JPEG, 470 00:39:42,970 --> 00:39:52,720 începe fie cu secvența ffd8 ffe0 sau altul, ffd8 ffe1. 471 00:39:52,720 --> 00:39:59,530 Un alt lucru util de știut este faptul că JPEG sunt stocate culorile. 472 00:39:59,530 --> 00:40:03,380 Deci, ori de câte ori un fișier JPEG se termină, celălalt începe. 473 00:40:03,380 --> 00:40:07,070 Deci, nu există nici un fel de în-între valorile de acolo. 474 00:40:07,070 --> 00:40:15,510 Odată ce te-a lovit începutul unui JPEG, dacă ați fost deja citit un fișier JPEG, 475 00:40:15,510 --> 00:40:21,800 știi că ai lovit la sfârșitul celui anterior și începutul celui următor. 476 00:40:21,800 --> 00:40:25,890 >> Pentru a vizualiza acest fel de, am făcut o schematică. 477 00:40:25,890 --> 00:40:36,910 Un alt lucru despre JPEG este că le putem citi în secvențe de 512 octeți, la un moment dat, 478 00:40:36,910 --> 00:40:39,380 în mod similar cu începutul cardului. 479 00:40:39,380 --> 00:40:43,370 Noi nu trebuie să fie verificarea fiecare octet unic, pentru că asta ar suge. 480 00:40:43,370 --> 00:40:48,200 Deci, în loc, ceea ce putem face este de fapt doar citesc în 512 octeți la un moment dat 481 00:40:48,200 --> 00:40:54,700 și apoi, în loc de check-in între cei în aceste felii mici mici, 482 00:40:54,700 --> 00:40:58,640 putem verifica doar începutul 512 bytes. 483 00:40:58,640 --> 00:41:02,570 În esență, în această imagine, ceea ce vezi este la începutul cardului, 484 00:41:02,570 --> 00:41:08,700 aveți valori care nu sunt cu adevărat relevante pentru JPEG reale. 485 00:41:08,700 --> 00:41:15,830 Dar atunci ce am este o stea pentru a indica unul dintre cele două secvențe de pornire pentru un JPEG. 486 00:41:15,830 --> 00:41:19,910 Deci, ori de câte ori vedeți o stea, știți că aveți un fișier JPEG. 487 00:41:19,910 --> 00:41:25,030 Și apoi fiecare fișier JPEG este de gând să fie un multiplu de 512 octeți 488 00:41:25,030 --> 00:41:27,880 dar nu neapărat multiplu aceeași. 489 00:41:27,880 --> 00:41:32,050 Modul în care știți că v-ați lovit un alt JPEG este dacă te-a lovit o altă stea, 490 00:41:32,050 --> 00:41:39,090 o altă secvență de pornire de octeți. 491 00:41:39,090 --> 00:41:43,330 Atunci ceea ce avem aici este aveti roșu fișier JPEG continuă până când te-a lovit o stea, 492 00:41:43,330 --> 00:41:45,150 care este indicată printr-o culoare nouă. 493 00:41:45,150 --> 00:41:48,510 Veți continua si apoi te-a lovit o altă stea, te-a lovit un alt JPEG, 494 00:41:48,510 --> 00:41:50,590 vei continua tot drumul până la sfârșitul anului. 495 00:41:50,590 --> 00:41:53,180 Ești la ultima fotografie aici, roz. 496 00:41:53,180 --> 00:41:58,220 Te duci la capăt până când te-a lovit la sfârșitul fișierului de caracter. 497 00:41:58,220 --> 00:42:00,820 Acest lucru se întâmplă pentru a fi cu adevărat utile. 498 00:42:00,820 --> 00:42:03,170 >> Câteva takeaways principale aici: 499 00:42:03,170 --> 00:42:06,670 Fișier carte nu începe cu un fișier JPEG, 500 00:42:06,670 --> 00:42:13,350 dar o dată JPEG începe, toate imaginile JPEG sunt stocate alături unul de altul. 501 00:42:17,520 --> 00:42:20,420 >> Unii pseudocod pentru Recover. 502 00:42:20,420 --> 00:42:22,570 În primul rând, vom deschide fișierul nostru carte, 503 00:42:22,570 --> 00:42:27,500 și care va fi cu ajutorul fișierului de I / O funcții. 504 00:42:27,500 --> 00:42:32,430 Vom repeta procesul până când următorul am ajuns la sfârșitul fișierului. 505 00:42:32,430 --> 00:42:36,450 Vom citi 512 octeți la un moment dat. 506 00:42:36,450 --> 00:42:39,180 Și ceea ce am spus aici este că o să-l stocați într-un tampon, 507 00:42:39,180 --> 00:42:46,230 Deci, practic stai la aceste 512 octeți până nu știm exact ce să facă cu ele. 508 00:42:46,230 --> 00:42:50,300 Atunci, ce vrem să facem este vrem să verificați dacă ne-am lovit o stea sau nu. 509 00:42:50,300 --> 00:42:57,960 Dacă ne-am lovit o stea, în cazul în care ne-am lovit pe unul dintre secvențele de pornire, 510 00:42:57,960 --> 00:42:59,980 atunci știm că ne-am lovit de un nou fișier JPEG. 511 00:42:59,980 --> 00:43:08,860 Ceea ce vom dori să faceți este să ne gând să doriți să creați un fișier nou în directorul nostru pset4 512 00:43:08,860 --> 00:43:14,480 pentru a continua să faceți acel fișier. 513 00:43:14,480 --> 00:43:18,220 Dar, de asemenea, dacă ne-am făcut deja un JPEG înainte, 514 00:43:18,220 --> 00:43:25,620 Apoi vrem să se încheie cu acel fișier și împingeți-l în folderul pset4, 515 00:43:25,620 --> 00:43:29,780 în cazul în care vom avea acel fișier stocat pentru că dacă nu se specifică faptul că am terminat acel fișier JPEG, 516 00:43:29,780 --> 00:43:37,290 atunci vom avea practic o sumă nedeterminată. Cele JPEG nu se va termina. 517 00:43:37,290 --> 00:43:40,840 Deci, vrem să ne asigurăm că, atunci când suntem într-lectură într-un fișier JPEG și scris, 518 00:43:40,840 --> 00:43:46,590 vrem să închidă în mod expres că, în scopul de a deschide urmatorul. 519 00:43:46,590 --> 00:43:48,430 Vom dori pentru a verifica mai multe lucruri. 520 00:43:48,430 --> 00:43:52,880 Dorim să verifice dacă suntem la începutul unui nou JPEG cu tampon nostru 521 00:43:52,880 --> 00:43:56,780 și, de asemenea, în cazul în care deja am găsit o JPEG înainte de 522 00:43:56,780 --> 00:44:03,930 pentru că se va schimba procesul de ușor. 523 00:44:03,930 --> 00:44:07,880 Deci dupa ce trece prin tot drumul și te-a lovit la sfârșitul fișierului, 524 00:44:07,880 --> 00:44:11,570 atunci ceea ce veți dori să faceți este să vă veți dori să închideți toate fișierele care sunt deschise în prezent. 525 00:44:11,570 --> 00:44:14,100 Asta va fi, probabil, ultimul fișier JPEG pe care o ai, 526 00:44:14,100 --> 00:44:18,930 precum și fișierul cardul pe care le-ați avut de a face cu. 527 00:44:21,940 --> 00:44:28,670 >> Ultimul obstacol de care avem nevoie pentru a aborda este modul de a face de fapt un fișier JPEG 528 00:44:28,670 --> 00:44:31,950 și cum pentru a împinge de fapt la dosar. 529 00:44:33,650 --> 00:44:39,850 PSET cere ca fiecare JPEG pe care le găsiți fie în următorul format, 530 00:44:39,850 --> 00:44:43,990 în cazul în care aveți numărul. jpg. 531 00:44:43,990 --> 00:44:50,750 Numărul, chiar daca e 0, numim aceasta 000.jpg. 532 00:44:50,750 --> 00:44:55,730 Ori de câte ori veți găsi un fișier JPEG în program, 533 00:44:55,730 --> 00:44:58,040 ai de gând să doriți să-l numească, în ordinea în care se gaseste. 534 00:44:58,040 --> 00:44:59,700 Ce înseamnă? 535 00:44:59,700 --> 00:45:03,530 Avem nevoie de un fel de a ține evidența cât de multe am gasit 536 00:45:03,530 --> 00:45:08,680 și ce numărul fiecărui JPEG ar trebui să fie. 537 00:45:08,680 --> 00:45:13,800 Aici am de gând să profite de funcția sprintf. 538 00:45:13,800 --> 00:45:17,480 Similar cu printf, care doar un fel de printuri o valoare afară, în terminal, 539 00:45:17,480 --> 00:45:23,910 imprimă sprintf fișierul afară, în folderul. 540 00:45:23,910 --> 00:45:30,870 Și deci ce-ar face dacă am avut sprintf, titlul, iar apoi șirul acolo, 541 00:45:30,870 --> 00:45:36,660 s-ar imprima 2.jpg. 542 00:45:36,660 --> 00:45:41,020 Presupunând că am închis fișierele mele în mod corect, 543 00:45:41,020 --> 00:45:47,210 , care să conțină fișierul pe care am fost scris afară. 544 00:45:47,210 --> 00:45:50,320 Dar un lucru este faptul că cod pe care am aici 545 00:45:50,320 --> 00:45:53,360 nu satisface destul de ceea ce PSET cere. 546 00:45:53,360 --> 00:46:02,410 PSET cere ca al doilea fișier JPEG ar trebui să fie numit 002 în loc de doar 2. 547 00:46:02,410 --> 00:46:09,160 Deci, atunci când imprimați numele, atunci, probabil, ați putea dori să-și modifice substituent ușor. 548 00:46:09,160 --> 00:46:18,140 >> Are cineva aminte cum ne permite spații suplimentare atunci când am imprima ceva? 549 00:46:18,140 --> 00:46:22,530 Da. >> [Elev] Ai pus un 3 între semnul procent și 2. Da >>, perfectă. 550 00:46:22,530 --> 00:46:25,610 Vei pune un 3 în acest caz, pentru ca vrem spatiu pentru 3. 551 00:46:25,610 --> 00:46:32,590 3d% ar da probabil 002.jpg în loc de 2. 552 00:46:32,590 --> 00:46:40,120 Primul argument în funcția sprintf este de fapt o matrice char, 553 00:46:40,120 --> 00:46:42,520 pe care am cunoscut anterior ca siruri de caractere. 554 00:46:42,520 --> 00:46:50,700 Cei voință, un fel de mult ca un depozit temporar, stoca doar șirul rezultat. 555 00:46:50,700 --> 00:46:54,950 Tu nu va fi într-adevăr de-a face cu acest lucru, dar trebuie să-l includă. 556 00:46:54,950 --> 00:47:00,710 >> Știind că fiecare nume de fișier are număr, care preia trei caractere, 557 00:47:00,710 --> 00:47:06,770 și apoi jpg,. cât timp ar trebui să fie această matrice? 558 00:47:09,070 --> 00:47:14,310 Arunca un număr. Câte caractere în titlu, în numele? 559 00:47:18,090 --> 00:47:26,320 Deci, nu e 3 hashtag-uri, perioada, jpg. >> [Elev] 7. >> 7. Nu este destul. 560 00:47:26,320 --> 00:47:32,000 Am de gând să doriți 8 pentru că vrem să permită Terminator nul, de asemenea. 561 00:47:45,340 --> 00:47:49,730 >> În cele din urmă, doar pentru a scoate procesul pe care îl veți face pentru Recover, 562 00:47:49,730 --> 00:47:55,420 aveți vreo informație început. 563 00:47:55,420 --> 00:48:02,460 De a continua până când veți găsi la începutul unui fișier JPEG, 564 00:48:02,460 --> 00:48:07,900 și care poate fi fie una din cele două secvențe minime orientative. 565 00:48:07,900 --> 00:48:12,510 Vă păstrați la lectura. Fiecare bară reprezintă aici 512 octeți. 566 00:48:12,510 --> 00:48:22,630 Vă păstrați la lectura, ține la lectura până când vă confruntați cu o altă secvență de pornire. 567 00:48:22,630 --> 00:48:29,790 Odată ce ați că, ajungi curent JPEG - în acest caz, e roșu, 568 00:48:29,790 --> 00:48:31,030 așa că vă doriți să se încheie asta. 569 00:48:31,030 --> 00:48:35,540 Vrei să sprintf numele pe care în folderul pset4, 570 00:48:35,540 --> 00:48:41,580 atunci când doriți să deschideți un nou JPEG și apoi să păstreze la lectura 571 00:48:41,580 --> 00:48:46,370 până când vă confruntați cu următoarea. 572 00:48:46,370 --> 00:48:49,040 Păstrați la lectura, ține la lectura, 573 00:48:49,040 --> 00:48:56,290 și apoi în cele din urmă, în cele din urmă, ai de gând să ajungă la sfârșitul fișierului, 574 00:48:56,290 --> 00:49:00,360 și așa veți dori să închidă ultimul JPEG care au fost de lucru cu, 575 00:49:00,360 --> 00:49:08,380 sprintf că în folderul pset4, si uita-te apoi la toate imaginile pe care le-ați primit. 576 00:49:08,380 --> 00:49:12,050 Aceste imagini sunt de fapt imagini ale personalului CS50, 577 00:49:12,050 --> 00:49:16,430 și astfel acest lucru este în cazul în care partea distractivă bonus de PSET vine în 578 00:49:16,430 --> 00:49:26,310 este că sunteți în competiție în secțiunile dvs. pentru a găsi TFS în imagini 579 00:49:26,310 --> 00:49:34,610 și a face fotografii cu ei pentru a dovedi că ai făcut PSET 580 00:49:34,610 --> 00:49:37,030 și astfel încât să puteți vedea care membrii personalului sunt în imagini. 581 00:49:37,030 --> 00:49:41,510 Deci, atunci luați fotografii cu personalul. Uneori, va trebui să-i alunge jos. 582 00:49:41,510 --> 00:49:44,680 Probabil unii dintre ei vor încerca să fugă de la tine. 583 00:49:44,680 --> 00:49:47,320 Faci poze cu ei. 584 00:49:47,320 --> 00:49:51,190 Acest lucru este în curs de desfășurare. Nu e din cauza atunci când PSET este datorată. 585 00:49:51,190 --> 00:49:53,340 Termenul va fi anunțată în spec.. 586 00:49:53,340 --> 00:49:58,060 Apoi, împreună cu secțiunea dumneavoastră, în funcție de secțiunea ia cele mai multe imagini 587 00:49:58,060 --> 00:50:04,430 cu majoritatea membrilor personalului va câștiga un premiu destul de minunat. 588 00:50:04,430 --> 00:50:08,890 Asta e un fel de stimulent pentru a obține dvs. de pset4 terminat cât mai repede posibil 589 00:50:08,890 --> 00:50:10,820 pentru că atunci puteți obține la afaceri 590 00:50:10,820 --> 00:50:14,570 vânătoare în jos toți membrii personalului CS50 diferite. 591 00:50:14,570 --> 00:50:17,500 Asta nu e obligatoriu, deși, astfel încât odată ce veți obține imagini, 592 00:50:17,500 --> 00:50:20,310 atunci ați terminat cu pset4. 593 00:50:20,310 --> 00:50:23,970 >> Și am terminat cu Walkthrough 4, astfel încât vă mulțumesc tuturor pentru venit. 594 00:50:23,970 --> 00:50:29,330 Noroc cu criminalistica. [Aplauze] 595 00:50:29,330 --> 00:50:31,000 [CS50.TV]