1 00:00:00,000 --> 00:00:02,700 [Powered by Google Translate] [Walkthrough - Проблем Постави 4] 2 00:00:02,700 --> 00:00:05,000 [Zamyla Чан - Универзитетот Харвард] 3 00:00:05,000 --> 00:00:07,340 [Ова е CS50. - CS50.TV] 4 00:00:08,210 --> 00:00:11,670 Во ред. Здраво на сите, и добредојде на можи 4. 5 00:00:11,670 --> 00:00:14,270 >> Денес нашата pset е вештачења. 6 00:00:14,270 --> 00:00:18,080 Forensics е навистина забавно pset што вклучува занимаваат со битмапа датотеки 7 00:00:18,080 --> 00:00:21,550 да се открие кој извршил кривично дело. 8 00:00:21,550 --> 00:00:24,200 Тогаш ние ќе треба да ја промените големината некои битмапа датотеки, 9 00:00:24,200 --> 00:00:27,780 тогаш ние, исто така, ќе се справи со навистина забавно дел наречен реставрирана, 10 00:00:27,780 --> 00:00:31,160 во која ние сме во основа предаден на мемориска картичка 11 00:00:31,160 --> 00:00:34,350 во која некој случајно избришани сите нивни фајлови, 12 00:00:34,350 --> 00:00:38,860 и ние сме побарано да направите овие датотеки. 13 00:00:38,860 --> 00:00:42,910 >> Но, прво, пред да се влезе во pset, јас навистина само сакаат да им честитам на сите. 14 00:00:42,910 --> 00:00:45,230 Ние сме за во средина на овој курс. 15 00:00:45,230 --> 00:00:50,070 Квиз 0 е зад нас, а ние сме во pset4, па во суштина, ние сме на половина пат. 16 00:00:50,070 --> 00:00:55,490 Ние измина долг пат, ако се погледне назад кон вашиот psets, pset0 и pset1, 17 00:00:55,490 --> 00:00:57,300 па си честитам за тоа, 18 00:00:57,300 --> 00:01:00,760 и ние ќе ја добиеме во некои навистина забавно работи. 19 00:01:00,760 --> 00:01:07,070 >> Така, нашето алатникот за овој pset, пак, наместо на водење на sudo yum-y ажурирање, 20 00:01:07,070 --> 00:01:13,890 ние сме во состојба само да се кандидира update50 ако сте на верзија 17,3 и погоре на апаратот. 21 00:01:13,890 --> 00:01:17,380 Па не заборавајте да се кандидира update50 - тоа е многу полесно, неколку помалку карактери - 22 00:01:17,380 --> 00:01:20,640 да бидете сигурни дека сте на најновата верзија на апаратот. 23 00:01:20,640 --> 00:01:25,410 Особено важно е да се update50 кога ќе почнат да го користат CS50 Провери. 24 00:01:25,410 --> 00:01:28,700 Така бидете сигурни дека ќе го направи тоа. 25 00:01:28,700 --> 00:01:30,760 >> За сите делови за овој pset, 26 00:01:30,760 --> 00:01:34,350 ние ќе треба да се занимаваат со датотека влезови и излези, датотека I / O. 27 00:01:34,350 --> 00:01:38,140 Ние ќе се случува во текот на многу програми кои се занимаваат со низи 28 00:01:38,140 --> 00:01:40,350 укажува на датотеки и работи како што, 29 00:01:40,350 --> 00:01:43,050 затоа сакаме да бидете сигурни дека ние сме навистина познати и удобно 30 00:01:43,050 --> 00:01:47,990 кои се занимаваат со тоа како да влезни и излезни во датотеки. 31 00:01:47,990 --> 00:01:52,080 >> Во дистрибуцијата код за овој pset е датотека наречена copy.c, 32 00:01:52,080 --> 00:01:55,280 и тоа е она што ние ќе треба да се најде ќе биде навистина корисно за нас 33 00:01:55,280 --> 00:02:00,340 бидејќи ние ќе се заокружи всушност копирање на copy.c датотека 34 00:02:00,340 --> 00:02:05,350 и само го менува нешто да биде во можност да се постигне првите 2 дела на проблемот во собата. 35 00:02:05,350 --> 00:02:09,030 >> И така тогаш како што споменав порано, ние се занимаваат со bitmaps, како и JPEG слики. 36 00:02:09,030 --> 00:02:13,170 Значи, навистина разбирање на структурата на тоа како овие датотеки се организирани, 37 00:02:13,170 --> 00:02:16,170 како што навистина може да го преведе 0-ти и 1S во structs 38 00:02:16,170 --> 00:02:19,040 и она што ние всушност може да се разбере и протолкува и уреди, 39 00:02:19,040 --> 00:02:21,000 дека ќе биде навистина важно, 40 00:02:21,000 --> 00:02:25,970 па оди во JPEG и битмапа датотеки и разбирање на структурата на нив. 41 00:02:25,970 --> 00:02:30,780 >> Pset4, како и обично, започнува со дел од прашањата. 42 00:02:30,780 --> 00:02:36,600 Оние кои ќе се справи со датотека I / O и да ви се навикнати на тоа. 43 00:02:36,600 --> 00:02:42,520 Потоа дел 1 е Whodunit, во која ќе се доделува bitmap датотека 44 00:02:42,520 --> 00:02:45,630 што изгледа нешто како црвени точки над сите. 45 00:02:45,630 --> 00:02:52,180 А потоа во основа она што ние ќе треба да направите е да ја искористам оваа датотека и само да го уреди малку 46 00:02:52,180 --> 00:02:54,010 во верзија која може да се прочита. 47 00:02:54,010 --> 00:02:56,000 Во суштина, откако ќе заврши, ќе имаме иста датотека, 48 00:02:56,000 --> 00:03:02,630 освен што ќе бидете во можност да ги видите скриените порака скриени од страна на сите оние црвени точки. 49 00:03:02,630 --> 00:03:07,310 Потоа Повторно е програма која, со оглед на датотечниот 50 00:03:07,310 --> 00:03:11,490 а потоа дадено името на датотеката која ја излези, а потоа дадени голем број, како и, 51 00:03:11,490 --> 00:03:16,850 всушност ќе ја промени големината дека битмапа со тоа целобројна вредност. 52 00:03:16,850 --> 00:03:19,240 Тогаш на крај, ние имаме опорави pset. 53 00:03:19,240 --> 00:03:24,160 Ние се дадени мемориска картичка, а потоа мора да се опорави сите слики 54 00:03:24,160 --> 00:03:25,920 кои биле случајно избришана, 55 00:03:25,920 --> 00:03:31,420 но, како што ќе научат не, всушност избришани и отстранети од датотека; 56 00:03:31,420 --> 00:03:38,470 ние само вид на изгубени каде што беа во датотеката, но ние ќе се опорави тоа. 57 00:03:38,470 --> 00:03:44,950 >> Велики. Па оди во датотека I / O конкретно, тие се цела листа на функции што ќе биде во употреба. 58 00:03:44,950 --> 00:03:49,840 Веќе сте виделе малку основите на fopen, fread и запишување, 59 00:03:49,840 --> 00:03:54,350 но ние ќе се погледне понатаму во некои датотека I / O функции, како што fputc, 60 00:03:54,350 --> 00:03:56,930 во која само напиши еден карактер во еден момент, 61 00:03:56,930 --> 00:04:02,000 да fseek, каде што вид на преместите датотеката позиција индикатор напред и назад, 62 00:04:02,000 --> 00:04:05,770 а потоа некои други. Но, ние ќе одиме во таа малку подоцна во текот на pset. 63 00:04:08,050 --> 00:04:13,100 >> Значи прво, само за да се влезе во датотека I / O пред да одат во pset, 64 00:04:13,100 --> 00:04:19,860 за да отворите датотека, на пример, она што треба да направите е, всушност, се постави покажувачот во тој фајл. 65 00:04:19,860 --> 00:04:22,710 Значи имаме датотека * покажувач. 66 00:04:22,710 --> 00:04:27,140 Во овој случај, јас сум нарекувајќи го во покажувачот, бидејќи тоа ќе биде мојот infile. 67 00:04:27,140 --> 00:04:33,340 И така јас ќе одам да ја користите функцијата fopen а потоа името на датотеката 68 00:04:33,340 --> 00:04:36,360 а потоа начинот на кој јас ќе одам да се занимаваат со датотеката. 69 00:04:36,360 --> 00:04:42,080 Па таму е "r" во овој случај за читање, "W" за пишување, а потоа "а" за додавање. 70 00:04:42,080 --> 00:04:44,270 На пример, кога си имаш работа со infile 71 00:04:44,270 --> 00:04:47,310 и сите што сакате да направите е да прочитате на битови и бајти чуваат таму, 72 00:04:47,310 --> 00:04:50,420 тогаш сте веројатно нема да сакате да го користите "r" како режим. 73 00:04:50,420 --> 00:04:54,520 Кога сакате да всушност пишува, вид на направи нов фајл, 74 00:04:54,520 --> 00:04:57,220 тогаш што ние ќе треба да направите е да одиме да се отвори нова датотека 75 00:04:57,220 --> 00:05:02,410 и употреба на "w" на владата за пишување. 76 00:05:02,410 --> 00:05:07,540 >> Па тогаш кога сте всушност читање на датотеки, структурата е како што следува. 77 00:05:07,540 --> 00:05:14,930 Прво што вклучуваат покажувач на struct, која ќе содржи бајти кои што ти ја читаш. 78 00:05:14,930 --> 00:05:19,830 Така што ќе биде на крајот локацијата на бајти кои што ти ја читаш. 79 00:05:19,830 --> 00:05:23,360 Ти си тогаш ќе укажуваат на големината, како основа колку бајти 80 00:05:23,360 --> 00:05:30,100 вашата програма има за читање во датотеката, големината основа еден елемент е, 81 00:05:30,100 --> 00:05:32,620 а потоа ви се случува да наведете колку елементи ќе сакате да ја прочитате. 82 00:05:32,620 --> 00:05:34,980 А потоа, конечно, треба да знаете кога сте за читање од, 83 00:05:34,980 --> 00:05:37,580 така што ќе биде вашата во покажувач. 84 00:05:37,580 --> 00:05:41,780 Јас боја овие затоа fread е исто така многу слични на запишување, 85 00:05:41,780 --> 00:05:47,050 освен вие сакате да бидете сигурни дека го користите правилен редослед, 86 00:05:47,050 --> 00:05:51,960 бидете сигурни дека сте всушност пишување или читање од правото датотека. 87 00:05:54,910 --> 00:05:58,610 >> Па тогаш како и досега, ако имаме големина на елементот, како и бројот на елементи, 88 00:05:58,610 --> 00:06:00,600 тогаш можеме да се позанимавам тука малку. 89 00:06:00,600 --> 00:06:06,810 Велат дека имам куче struct и така тогаш сакам да ја прочитам две кучиња во исто време. 90 00:06:06,810 --> 00:06:12,450 Што можев да сторам е да се каже од големината на еден елемент се случува да биде со големина на едно куче 91 00:06:12,450 --> 00:06:14,770 и јас одам да всушност читање на две од нив. 92 00:06:14,770 --> 00:06:18,290 Алтернативно, она што можам да направам е да се каже јас сум само ќе прочитате еден елемент 93 00:06:18,290 --> 00:06:21,340 и дека еден елемент се случува да биде со големина на две кучиња. 94 00:06:21,340 --> 00:06:24,320 Значи тоа е аналогно како можете да вид на игра околу со големината и бројот 95 00:06:24,320 --> 00:06:28,250 во зависност од она што е повеќе интуитивна за вас. 96 00:06:28,250 --> 00:06:30,810 >> Во ред. Па сега ние да се пишува датотеки. 97 00:06:30,810 --> 00:06:36,880 Кога сакате да напишете датотека, првиот аргумент е, всушност, каде што ти ја читаш од. 98 00:06:36,880 --> 00:06:42,050 Значи тоа е во основа на податоците кои ви се случува да се напише во датотека, 99 00:06:42,050 --> 00:06:44,490 која е надвор покажувачот на крајот. 100 00:06:44,490 --> 00:06:47,670 Па кога си имаш работа со pset, бидете сигурни дека не се збунети. 101 00:06:47,670 --> 00:06:50,480 Можеби имаат дефиниции рамо до рамо. 102 00:06:50,480 --> 00:06:58,090 Можете да ги повлечат дефинициите во прирачникот со пишување човек, а потоа запишување, на пример, 103 00:06:58,090 --> 00:06:59,950 во терминал, или може да се однесува назад кон овој слајд 104 00:06:59,950 --> 00:07:03,570 и бидете сигурни дека сте користење на правото. 105 00:07:03,570 --> 00:07:08,700 Значи, повторно, за запишување, кога имаш датотека што сакате да го напишете во, 106 00:07:08,700 --> 00:07:14,290 тоа ќе биде последниот аргумент и дека ќе биде покажувач на таа датотека. 107 00:07:14,290 --> 00:07:18,670 Па тогаш тоа е како ние се занимаваат со пишување можеби неколку бајти во еден момент, 108 00:07:18,670 --> 00:07:21,820 но велат дека сакаат само да се напише во само еден единствен карактер. 109 00:07:21,820 --> 00:07:25,940 Како што ќе видиме подоцна, во овој пример, во bitmaps ќе имаме да го користат. 110 00:07:25,940 --> 00:07:32,180 Тоа е кога можеме да го користиме fputc, во суштина само ставање еден карактер во еден момент, Chr, 111 00:07:32,180 --> 00:07:37,050 во датотеката покажувач, и тоа е нашата надвор покажувачот таму. 112 00:07:38,700 --> 00:07:41,560 Па тогаш кога бараме или пишувам во датотеката, 113 00:07:41,560 --> 00:07:44,690 датотеката е следење на каде сме. 114 00:07:44,690 --> 00:07:47,810 Така, тоа е еден вид на курсорот, на датотеката позиција индикатор. 115 00:07:47,810 --> 00:07:54,330 И така, кога ние пишуваме или прочитате повторно во датотека, 116 00:07:54,330 --> 00:07:56,760 на датотеката всушност се сеќава каде е, 117 00:07:56,760 --> 00:07:59,270 и така тоа продолжува од каде курсорот е. 118 00:07:59,270 --> 00:08:03,970 Ова може да биде корисно кога сакате, да речеме, да се прочита во одреден износ да се направи нешто 119 00:08:03,970 --> 00:08:06,160 а потоа читаат во следните износ, 120 00:08:06,160 --> 00:08:10,700 но понекогаш можеби ќе сакате да се врати или, всушност да почне од одредена референтна вредност. 121 00:08:10,700 --> 00:08:16,870 Па тогаш функцијата fseek, она што го прави е ни овозможува да го движите курсорот во одредена датотека 122 00:08:16,870 --> 00:08:19,680 одреден број на бајти. 123 00:08:19,680 --> 00:08:24,260 И тогаш она што го имаме да направите е да одредите каде референтна вредност е. 124 00:08:24,260 --> 00:08:31,520 Па или се движи напред или назад од каде курсорот во моментов е, 125 00:08:31,520 --> 00:08:35,750 или може да се каже дека тоа само треба да се движи во од почетокот на датотеката 126 00:08:35,750 --> 00:08:37,090 или од крајот на датотеката. 127 00:08:37,090 --> 00:08:41,230 И така може да помине во негативен или позитивен вредности износ, 128 00:08:41,230 --> 00:08:44,960 и тој вид на ќе го преместите курсорот или нанапред или наназад. 129 00:08:46,170 --> 00:08:51,920 >> Пред да се влезе во други psets, било какви прашања на датотека I / O? 130 00:08:53,860 --> 00:08:59,990 Во ред. Како да се влезе во повеќе примери, се чувствуваат слободно да ме запре за прашања. 131 00:08:59,990 --> 00:09:06,930 >> Значи во Whodunit, ти си подаде bitmap датотека слично на ова црвениот на слајд, 132 00:09:06,930 --> 00:09:14,510 и тоа изгледа вака - еден куп црвени точки - и навистина не знам што е напишано. 133 00:09:14,510 --> 00:09:23,310 Ако кривогледство, може да биде во можност да видите мал сина боја во средината. 134 00:09:23,310 --> 00:09:26,270 Во суштина, тоа е каде што текстот е зачувана. 135 00:09:26,270 --> 00:09:30,270 Имаше убиството што се случи, и ние треба да дознаете кој го сторил тоа. 136 00:09:30,270 --> 00:09:36,760 Со цел да го направат тоа, ние треба да се вид на претворање на оваа слика во читлив формат. 137 00:09:36,760 --> 00:09:42,740 Ако вие момци некогаш се сретнал ова, понекогаш ќе има малку колекции 138 00:09:42,740 --> 00:09:48,510 каде што ќе мора лупа со црвена филм. Некој? Да. 139 00:09:48,510 --> 00:09:52,770 Па ќе им бидат предадени нешто како ова, ќе треба лупа 140 00:09:52,770 --> 00:09:58,130 со црвена филм над неа, ќе ја стави во текот на сликата, 141 00:09:58,130 --> 00:10:03,410 и ќе бидете во можност да ја видите пораката скриена во него. 142 00:10:03,410 --> 00:10:07,080 Ние немаме лупа со црвена филм, па наместо ние ќе вид на создаваме наша сопствена 143 00:10:07,080 --> 00:10:09,060 во овој pset. 144 00:10:09,060 --> 00:10:15,760 И така на корисникот ќе влез whodunit, тогаш поим. BMP, 145 00:10:15,760 --> 00:10:18,800 па тоа е infile, тоа е црвена точка порака, 146 00:10:18,800 --> 00:10:23,550 а потоа тие кажуваат verdict.bmp ќе биде нашата outfile. 147 00:10:23,550 --> 00:10:27,900 Па затоа се случува да се создаде нова bitmap слика слична на поим еден 148 00:10:27,900 --> 00:10:32,600 освен во читлив формат, каде што можеме да видиме скриената порака. 149 00:10:32,600 --> 00:10:37,550 >> Бидејќи ние ќе треба да се занимаваат со уредување и манипулација со bitmaps на некој вид, 150 00:10:37,550 --> 00:10:42,400 ние ќе вид на нурне во во структурата на овие битмапа датотеки. 151 00:10:42,400 --> 00:10:48,130 Отидовме во текот на овие малку во предавањето, но ајде да погледнеме во нив некои повеќе. 152 00:10:48,130 --> 00:10:51,740 Bitmaps во суштина се само аранжман на бајти 153 00:10:51,740 --> 00:10:55,790 каде што имаш специфицирано која бајти значи она. 154 00:10:55,790 --> 00:11:00,540 Значи тука е нешто како карта на bitmap слика 155 00:11:00,540 --> 00:11:08,550 велејќи дека тоа започнува со некои насловот датотеки, започнува со некои информации во таму. 156 00:11:08,550 --> 00:11:16,540 Ќе видите дека на околу бајт број 14 од големината е означена на bitmap слика, 157 00:11:16,540 --> 00:11:18,520 и продолжува натаму. 158 00:11:18,520 --> 00:11:23,810 Но, тогаш она што ние сме навистина заинтересирани тука почнува околу бајт број 54. 159 00:11:23,810 --> 00:11:26,060 Имаме овие RGB тројки. 160 00:11:26,060 --> 00:11:30,760 Она што се случува да направите е да ги содржи вистинските пиксели, бојата вредности. 161 00:11:30,760 --> 00:11:35,950 Сето погоре дека во заглавието е некои информации 162 00:11:35,950 --> 00:11:41,240 одговара на големината на сликата, ширината на сликата, и висина. 163 00:11:41,240 --> 00:11:44,930 Кога одиме во Соочи подоцна, ќе видиме зошто големината на сликата 164 00:11:44,930 --> 00:11:48,670 може да биде различна од ширината или висината. 165 00:11:48,670 --> 00:11:54,240 Па потоа да се претставуваат овие - овие bitmap слики се секвенци на бајти - 166 00:11:54,240 --> 00:11:59,370 она што може да направите е да се каже во ред, јас ќе одам да се запамети дека во индекс 14, 167 00:11:59,370 --> 00:12:03,380 тоа е каде што големина е, на пример, туку што ние ќе треба да направите за да се направи овој полесно 168 00:12:03,380 --> 00:12:06,020 е тоа капсулирало во структурата. 169 00:12:06,020 --> 00:12:08,880 И така имаме две structs направен за нас, BITMAPFILEHEADER 170 00:12:08,880 --> 00:12:10,440 и BITMAPINFOHEADER, 171 00:12:10,440 --> 00:12:14,840 и така кога читаме во таа датотека, по дифолт тоа ќе се случува во ред, 172 00:12:14,840 --> 00:12:22,360 и така во ред тоа е, исто така, ќе се пополни во во варијабли како што се biWidth и biSize. 173 00:12:25,270 --> 00:12:31,230 А потоа конечно, секој пиксел е претставена со три бајти. 174 00:12:31,230 --> 00:12:35,500 Првиот е износот на сино во пиксели, а втората е износот на зелена, 175 00:12:35,500 --> 00:12:41,120 и конечно, износот на црвено, каде што 0 е во суштина нема сина или без зелен или не црвени 176 00:12:41,120 --> 00:12:43,720 а потоа FF е максималната вредност. 177 00:12:43,720 --> 00:12:46,800 Овие се хексадецимално вредности. 178 00:12:46,800 --> 00:12:53,870 Па тогаш ако имаме FF0000, тогаш што одговара на максималната сума на сино 179 00:12:53,870 --> 00:12:58,890 и тогаш нема зелена и нема црвена, па тогаш тоа ќе ни даде сини пиксели. 180 00:12:58,890 --> 00:13:04,190 Потоа, ако имаме ff за сите во одборот, тогаш тоа значи дека имаме бели пиксели. 181 00:13:04,190 --> 00:13:11,370 Ова е вид на спротивни обично кога велиме RGB. Тоа е всушност се случува BGR. 182 00:13:12,750 --> 00:13:18,990 >> Значи, ако ние всушност се погледне во еден пример на bitmap слика - дозволете ми една повлече до тука. 183 00:13:31,560 --> 00:13:33,830 Тоа е малку мала. 184 00:13:39,890 --> 00:13:47,840 Јас сум зумирање, и може да се види тоа е pixelated. Тоа изгледа како блокови на боја. 185 00:13:47,840 --> 00:13:50,110 Имате бели блокови, а потоа црвени блокови. 186 00:13:50,110 --> 00:13:53,700 Ако играте во Microsoft Paint, на пример, можете да направите нешто слично 187 00:13:53,700 --> 00:13:58,960 од основа, само сликање одредени плоштади во одредена цел. 188 00:13:58,960 --> 00:14:08,060 Па тогаш што е ова преведува во битмапа е како што следува. 189 00:14:08,060 --> 00:14:15,710 Тука имаме првата бела пиксели, дека сите 6 се ѓ, а потоа ние имаме црвени пиксели, 190 00:14:15,710 --> 00:14:19,910 наведено од страна 0000ff. 191 00:14:19,910 --> 00:14:27,940 И така секвенца на бајти дека имаме покажува како bitmap слика се случува да се погледне. 192 00:14:27,940 --> 00:14:32,230 Значи она што го направив тука е само напишани сите оние бајти, а потоа обоени во црвено 193 00:14:32,230 --> 00:14:37,550 така што ќе вид на може да се види, ако кривогледство малку, како тоа вид на укажува на лицето смешковци. 194 00:14:40,180 --> 00:14:46,390 >> Начинот на кој bitmap слики работата е го гледа во основа како мрежа. 195 00:14:46,390 --> 00:14:54,940 И така по дифолт, секој ред на мрежата мора да биде повеќе од 4 бајти. 196 00:15:00,520 --> 00:15:07,060 Ако ги погледнеме во bitmap слика, ти си пополнување на секоја вредност. 197 00:15:07,060 --> 00:15:17,370 На пример, може да имаат црвени тука, зелени тука, сини тука, 198 00:15:17,370 --> 00:15:24,950 но мора да бидете сигурни дека на сликата се пополнува со повеќе од четири бајти. 199 00:15:24,950 --> 00:15:32,200 Значи, ако јас сакам мојата слика да биде три блока широк, тогаш јас ќе треба да се стави празно вредност 200 00:15:32,200 --> 00:15:35,640 во последниот еден да се направи повеќе од четири. 201 00:15:35,640 --> 00:15:39,530 Па тогаш јас би додал во нешто што ние сме повикувајќи баласт. 202 00:15:39,530 --> 00:15:43,750 Јас сум само ќе покаже дека таму со х. 203 00:15:44,920 --> 00:15:54,160 Сега велат сакаме слика што е 7 пиксели долго, на пример. 204 00:15:54,160 --> 00:15:59,550 Имаме 1, 2, 3, 4, 5, 6, 7, 205 00:16:04,750 --> 00:16:07,000 и сето тоа е исполнет со боја. 206 00:16:07,000 --> 00:16:10,620 Начинот на кој bitmap слики работи е дека ние треба 8. 207 00:16:10,620 --> 00:16:12,460 Токму сега имаме 1, 2, 3, 4, 5, 6, 7. 208 00:16:12,460 --> 00:16:19,360 Ние треба 8 простори за bitmap слика да се чита правилно. 209 00:16:19,360 --> 00:16:25,600 Па тогаш што треба да направите е да додадете само малку баласт 210 00:16:25,600 --> 00:16:29,430 да бидете сигурни дека сите ширини се подеднакво 211 00:16:29,430 --> 00:16:34,260 и дека сите ширини се повеќе од 4. 212 00:16:42,110 --> 00:16:47,310 И така јас претходно наведено, Соочи како x или squiggly линија, 213 00:16:47,310 --> 00:16:53,880 но во конкретната bitmap слики Соочи е означен со хексадецимален 0. 214 00:16:53,880 --> 00:16:57,340 Значи тоа ќе биде еден лик, 0. 215 00:16:58,980 --> 00:17:06,329 Она што може да дојде во рака е xxd команда. 216 00:17:06,329 --> 00:17:11,220 Што го прави тоа е всушност ви покажува, како слични на она што го направив пред со смешко 217 00:17:11,220 --> 00:17:15,630 кога јас всушност печатени надвор она што секоја боја ќе биде за пиксели 218 00:17:15,630 --> 00:17:21,800 а потоа боја, кога ќе ја стартувате xxd со следниве команди, 219 00:17:21,800 --> 00:17:28,670 тогаш тоа навистина ќе се печати она што боите се за оние пиксели. 220 00:17:28,670 --> 00:17:33,810 Што треба да направите е овде јас покаже, како-и 54 221 00:17:33,810 --> 00:17:36,530 вели дека ќе одам да започне на 54 бајт 222 00:17:36,530 --> 00:17:40,820 бидејќи пред тоа, не заборавајте ако се погледне назад на мапата на bitmaps, 223 00:17:40,820 --> 00:17:42,690 тоа е сите технички податоци и работи како што. 224 00:17:42,690 --> 00:17:46,280 Но, она што навистина се грижат за е вистински пиксели кои укажуваат на боја. 225 00:17:46,280 --> 00:17:52,700 Значи, со додавање на тоа знаме,-S 54, тогаш ние сме во можност да ја видите вредности на бојата. 226 00:17:52,700 --> 00:17:56,020 И не грижете се за комплицирани знамиња и работи како што. 227 00:17:56,020 --> 00:18:05,020 Во проблемот сет спецификации, ќе имате насоки за тоа како да се користи xxd да се прикаже пиксели. 228 00:18:07,070 --> 00:18:15,590 Значи, ако видите тука, тој вид на изгледа како зелена кутија, оваа мала работа. 229 00:18:15,590 --> 00:18:23,610 Сум боја на 00ff00 како основа велејќи дека нема сина, многу зелен, а не црвена боја. 230 00:18:23,610 --> 00:18:26,370 Така што кореспондира со зелена боја. 231 00:18:26,370 --> 00:18:31,920 Како што можете да видите тука, можеме да видиме зелена правоаголник. 232 00:18:31,920 --> 00:18:36,660 Оваа зелено правоаголник е само 3 пиксели широк, па тогаш што ние треба да направите 233 00:18:36,660 --> 00:18:44,350 да бидете сигурни дека на сликата е повеќе од 4 широк е да додадете во екстра баласт. 234 00:18:44,350 --> 00:18:49,460 И така тогаш тоа е како гледате овие 0-ти тука. 235 00:18:49,460 --> 00:18:54,510 Ова, всушност, ќе биде резултат на вашата Повторно pset, 236 00:18:54,510 --> 00:19:01,350 суштина преземање на мали bitmap и потоа проширување тоа од 4. 237 00:19:01,350 --> 00:19:09,380 И така она што го гледаме е дека всушност оваа слика е 12 пиксели широк, но 12 е повеќе од 4, 238 00:19:09,380 --> 00:19:12,940 и така ние всушност не гледам никаква 0-ти на крајот, бидејќи ние не треба да додадете 239 00:19:12,940 --> 00:19:19,070 бидејќи тоа е целосно поместена. Тоа не имате било какви повеќе простор. 240 00:19:20,720 --> 00:19:23,470 >> Во ред. Било какви прашања во врска со баласт? 241 00:19:25,150 --> 00:19:27,460 Во ред. Кул. 242 00:19:27,460 --> 00:19:32,520 >> Како што споменав порано, bitmaps се само низа од бајти. 243 00:19:32,520 --> 00:19:39,170 И така она што го имаме е наместо да има потреба да ги пратите на точно кој број на бајт 244 00:19:39,170 --> 00:19:47,050 одговара на специфичен елемент, ние всушност се создаде struct да ја претставува. 245 00:19:47,050 --> 00:19:50,930 Значи она што го имаме е RGBTRIPLE struct. 246 00:19:50,930 --> 00:19:54,590 Секогаш кога имате пример на RGB трокреветни, 247 00:19:54,590 --> 00:20:00,970 бидејќи ова е еден вид дефинира структурата, тогаш можете да пристапите до rgbtBlue променлива, 248 00:20:00,970 --> 00:20:09,520 Слично на зелени и црвени променливи, кои ќе покажат колку сина, зелена и црвена, 249 00:20:09,520 --> 00:20:11,580 односно, го имате. 250 00:20:11,580 --> 00:20:16,800 >> Значи, ако имаме сини променлива е поставено на 0, зелени сет на FF, 251 00:20:16,800 --> 00:20:22,060 која е максималната вредност може да имаат, а потоа и црвени променлива е поставено на 0, 252 00:20:22,060 --> 00:20:27,870 тогаш каква боја овој RGB тројно би претставувало? >> [Студент] зелено. 253 00:20:27,870 --> 00:20:29,150 Зелена. Точно. 254 00:20:29,150 --> 00:20:34,480 Тоа ќе биде корисно да се знае дека секогаш кога имате пример на RGB трокреветни, 255 00:20:34,480 --> 00:20:41,340 вие всушност може да пристапите до износот на боја - сина, зелена и црвена - одделно. 256 00:20:43,350 --> 00:20:54,900 >> Сега дека ние сме зборуваше за структурата на тоа, ајде да ги разгледаме во датотеката BMP. 257 00:20:54,900 --> 00:20:57,870 Овие се structs направи за вас. 258 00:20:57,870 --> 00:21:01,820 Тука имаме BITMAPFILEHEADER struct. 259 00:21:01,820 --> 00:21:07,610 Од интерес е големината. 260 00:21:07,610 --> 00:21:12,660 Подоцна, имаме информации насловот, кој има уште неколку работи кои се интересни за нас, 261 00:21:12,660 --> 00:21:15,480 имено големина, ширина, и висина. 262 00:21:15,480 --> 00:21:19,170 Како ќе одиме во подоцна, кога ќе прочитате во датотеката, 263 00:21:19,170 --> 00:21:25,500 тој автоматски се вели во затоа што ние сме постави цел да биде ист. 264 00:21:25,500 --> 00:21:31,990 Па biSize ќе содржи право бајти кои соодветствуваат со реалните големината на сликата. 265 00:21:34,700 --> 00:21:40,500 А потоа тука, на крај, како што ние си зборуваше за, имаме RGBTRIPLE typedef struct. 266 00:21:40,500 --> 00:21:46,840 Имаме rgbtBlue, зелена и црвена поврзани со неа. 267 00:21:48,210 --> 00:21:49,340 >> Велики. Во ред. 268 00:21:49,340 --> 00:21:56,360 Сега дека ние се разбираме bitmaps малку, да разберат дека ние имаме заглавје на датотеката 269 00:21:56,360 --> 00:22:00,790 и информации заглавието поврзани со неа, а потоа после тоа, имаме интересни нешта 270 00:22:00,790 --> 00:22:05,110 на боите, и тие бои се претставени со RGBTRIPLE structs, 271 00:22:05,110 --> 00:22:12,710 и оние, пак, имаат три вредности кои се поврзани со сини, зелени и црвени. 272 00:22:12,710 --> 00:22:17,270 >> Па сега, можеме вид на размислува за враќање на малку. 273 00:22:17,270 --> 00:22:20,130 Жал ми е. Размислете за Whodunit. 274 00:22:20,130 --> 00:22:25,750 Кога имаме поим датотека, тогаш она што сакате да го направите е да прочитате во него пиксел од пиксел 275 00:22:25,750 --> 00:22:33,860 а потоа некако се промени оние пиксели, така што можеме да го излез во читлив формат. 276 00:22:33,860 --> 00:22:41,020 И така на излез, ние ќе пишувам пиксел од пиксел во verdict.bmp датотека. 277 00:22:41,020 --> 00:22:45,120 Тоа е вид на многу да се направи. Ние сме свесни дека. 278 00:22:45,120 --> 00:22:49,860 Значи она што ние го направивме е што сме всушност ви се предвидени со copy.c. 279 00:22:49,860 --> 00:22:57,610 Што copy.c не е само прави точна копија на дадениот bitmap датотека, и потоа излези тоа. 280 00:22:57,610 --> 00:23:01,900 Па ова веќе го отвора досие за вас, чита на пиксел од пиксел, 281 00:23:01,900 --> 00:23:04,510 а потоа го пишува во во излезната датотека. 282 00:23:04,510 --> 00:23:07,080 >> Ајде да ги разгледаме во тоа. 283 00:23:13,390 --> 00:23:18,290 Ова е обезбедување правилна употреба, 284 00:23:18,290 --> 00:23:22,640 добивање на имиња на датотеки тука. 285 00:23:22,640 --> 00:23:29,940 Што тоа не е тоа поставува влезна датотека да биде она што го помина во во infile тука, 286 00:23:29,940 --> 00:23:34,750 што е нашата втора командната линија аргумент. 287 00:23:34,750 --> 00:23:37,640 Проверки за да бидете сигурни дека ние може да се отвори датотеката. 288 00:23:38,960 --> 00:23:44,860 Проверки за да бидете сигурни дека ние може да се направи нов outfile тука. 289 00:23:45,630 --> 00:23:53,270 Тогаш што тоа не тука, тоа само во основа започнува читање во битмапа датотеки од самиот почеток. 290 00:23:53,270 --> 00:23:56,700 На почетокот, како што знаеме, содржи BITMAPFILEHEADER, 291 00:23:56,700 --> 00:24:03,200 и така тие секвенци од битови директно ќе се пополни во BITMAPFILEHEADER. 292 00:24:03,200 --> 00:24:07,940 Значи она што го имаме тука е дека BITMAPFILEHEADER Bf - 293 00:24:07,940 --> 00:24:13,150 тоа е нашата нова променлива од типот BITMAPFILEHEADER - 294 00:24:13,150 --> 00:24:22,560 ние ќе се стави внатре BF она што го читаме од во покажувач, што е нашата infile. 295 00:24:22,560 --> 00:24:23,970 Колку читаме? 296 00:24:23,970 --> 00:24:32,160 Читаме во колку бајти ние треба да содржат целата BITMAPFILEHEADER. 297 00:24:32,160 --> 00:24:34,660 Слично на тоа, тоа е она што го правиме за инфо заглавието. 298 00:24:34,660 --> 00:24:39,010 Па ние сме континуирано заедно нашата датотека во infile, 299 00:24:39,010 --> 00:24:44,360 и ние ја читаш овие битови и бајти, а ние сме ги директно приклучување во 300 00:24:44,360 --> 00:24:47,880 во овие случаи на променливи кои правиме. 301 00:24:49,370 --> 00:24:53,800 Тука ние сме само што си сигурен дека битмапа е битмапа. 302 00:24:57,670 --> 00:25:01,030 >> Сега имаме outfile, нели? 303 00:25:01,030 --> 00:25:04,420 Така како што стои кога ќе го креирате, тоа е во суштина празна. 304 00:25:04,420 --> 00:25:07,710 Значи ние треба да основа создадете нова bitmap од нула. 305 00:25:07,710 --> 00:25:12,280 Што правиме е ние треба да бидете сигурни дека ние копија во заглавјето на датотеката 306 00:25:12,280 --> 00:25:16,850 и информации наслов исто како infile има. 307 00:25:16,850 --> 00:25:22,850 Што правиме е ние пишуваме - и се сеќавам дека bf е променлива 308 00:25:22,850 --> 00:25:29,300 од типот BITMAPFILEHEADER, па она што го правиме е ние едноставно користете ја таа содржина 309 00:25:29,300 --> 00:25:34,980 да се напише во outfile. 310 00:25:36,550 --> 00:25:38,510 Еве, се сеќавам ние разговаравме за баласт, 311 00:25:38,510 --> 00:25:47,820 како тоа е важно да бидете сигурни дека износот на пиксели кои имаме е повеќе од 4. 312 00:25:47,820 --> 00:25:52,790 Ова е доста корисно формула за да се пресмета колку Соочи имате 313 00:25:52,790 --> 00:25:57,670 со оглед на ширината на вашето досие. 314 00:25:57,670 --> 00:26:04,120 Сакам да момци да се запамети дека во copy.c имаме формула за пресметување на баласт. 315 00:26:04,120 --> 00:26:07,970 Во ред? Па секој сеќавам на тоа. Велики. 316 00:26:07,970 --> 00:26:14,050 Па тогаш што copy.c прави следната е iterates над сите scanlines. 317 00:26:14,050 --> 00:26:23,730 Тоа оди преку редови, а потоа продавници секој тројно го чита 318 00:26:23,730 --> 00:26:26,920 а потоа го пишува во outfile. 319 00:26:26,920 --> 00:26:33,120 Па тогаш тука ќе ти ја читаш само еден RGB тројно во време 320 00:26:33,120 --> 00:26:39,860 и тогаш стави истата тројна во outfile. 321 00:26:41,120 --> 00:26:48,340 На слабо дел е тоа што баласт не е RGB трокреветни, 322 00:26:48,340 --> 00:26:55,200 и така ние не само да се прочита дека Соочи износот на RGB тројки. 323 00:26:55,200 --> 00:27:01,460 Она што ние треба да направите е всушност само се движи нашиот датотека позиција индикатор, се движи нашата курсорот, 324 00:27:01,460 --> 00:27:06,840 да се вид на прескокнете над сите баласт, така што ние сме во следниот ред. 325 00:27:06,840 --> 00:27:12,990 И тогаш што тоа не е копија ви покажува како може да сакате да го додадете баласт. 326 00:27:12,990 --> 00:27:14,990 Значи ние сме пресметува колку баласт што треба, 327 00:27:14,990 --> 00:27:18,220 па тоа значи дека ние треба Соочи бројот на 0-ти. 328 00:27:18,220 --> 00:27:24,510 Што тоа не е за телефонска линија што го става Соочи бројот на 0-ти во нашата outfile. 329 00:27:24,510 --> 00:27:31,170 А потоа, конечно, ќе го затворите и датотеки. Ќе го затворите infile како и outfile. 330 00:27:31,170 --> 00:27:34,870 >> Значи тоа е како copy.c дела, 331 00:27:34,870 --> 00:27:37,430 и дека ќе биде доста корисно. 332 00:27:39,720 --> 00:27:43,750 Наместо само всушност директно копирање и вметнување 333 00:27:43,750 --> 00:27:46,800 или само гледајќи во тоа и пишување во она што го сакате, 334 00:27:46,800 --> 00:27:49,440 само можеби ќе сакате да ја извршите оваа команда во терминалот, 335 00:27:49,440 --> 00:27:54,520 cp copy.c whodunit.c, кој ќе се создаде новата датотека, whodunit.c, 336 00:27:54,520 --> 00:27:58,330 кој содржи иста содржина како копија прави. 337 00:27:58,330 --> 00:28:03,880 Па тогаш што можеме да направиме е да се користи тоа како рамка врз која да се изгради и уреди 338 00:28:03,880 --> 00:28:06,900 за нашите whodunit датотека. 339 00:28:08,500 --> 00:28:14,670 >> Овие се нашите на-DOS да се направи за Whodunit, но она што copy.c не 340 00:28:14,670 --> 00:28:16,730 е, всушност, се грижи за повеќето од нив за нас. 341 00:28:16,730 --> 00:28:21,900 Значи, сите ние треба следно да направи е промена на пиксели колку што е потребно 342 00:28:21,900 --> 00:28:25,920 всушност да се направи датотека може да се чита. 343 00:28:25,920 --> 00:28:32,960 Запомнете дека за даден пиксели трокреветни, така и за дадена променлива од тип RGBTRIPLE, 344 00:28:32,960 --> 00:28:35,990 можете да пристапите во сина, зелена и црвена вредности. 345 00:28:35,990 --> 00:28:38,670 Тоа се случува да дојде во рака, бидејќи ако можете да им пристапите, 346 00:28:38,670 --> 00:28:41,770 тоа значи дека можете да ги проверите, 347 00:28:41,770 --> 00:28:45,430 а тоа значи дека можете да ги промените. 348 00:28:45,430 --> 00:28:49,430 >> Па кога се вративме во нашата црвена лупа пример, 349 00:28:49,430 --> 00:28:53,390 основа, значи дека дејствува како еден вид на филтер за нас. 350 00:28:53,390 --> 00:28:58,160 Значи она што сакате да го направите е да сакаме да ги филтрираат сите тројки кои доаѓаат внатре 351 00:28:58,160 --> 00:29:01,240 Постојат неколку различни начини да го направите тоа. 352 00:29:01,240 --> 00:29:07,100 Во суштина, може да имаат било каков тип на филтер сакате. 353 00:29:07,100 --> 00:29:09,890 Можеби сакате да ги промените сите црвени пиксели 354 00:29:09,890 --> 00:29:13,570 или можеби сакате да го промените различна боја пиксели на различни бои. 355 00:29:13,570 --> 00:29:15,400 Тоа е до вас. 356 00:29:15,400 --> 00:29:19,580 Запомнете дека можете да ја проверите каква боја на пиксел е 357 00:29:19,580 --> 00:29:23,000 а потоа исто така можете да ја промените како што поминува. 358 00:29:24,410 --> 00:29:26,420 >> Во ред. Значи тоа е Whodunit. 359 00:29:26,420 --> 00:29:32,760 Откако ќе се кандидира Whodunit, ќе се знае кој е виновникот за злосторството беше. 360 00:29:32,760 --> 00:29:35,540 >> Сега ние ќе одат за менување на големината. 361 00:29:35,540 --> 00:29:37,990 Ние ќе се уште се занимаваат со bitmaps. 362 00:29:37,990 --> 00:29:40,750 Она што ние ќе треба да направите е ние ќе имаат влез bitmap 363 00:29:40,750 --> 00:29:45,890 а потоа ние ќе помине во голем број, а потоа се добие outfile битмапа 364 00:29:45,890 --> 00:29:51,380 каде што тоа е во основа нашите infile намалени од n. 365 00:29:54,670 --> 00:30:01,450 Кажи ми датотека беше само еден пиксел голем. 366 00:30:01,450 --> 00:30:09,100 Потоа, ако ми n е 3, скалирање од 3, тогаш јас ќе повторам дека пиксели n број на пати, 367 00:30:09,100 --> 00:30:14,410 па 3 пати, а потоа, исто така, го намалите 3 пати, како и. 368 00:30:14,410 --> 00:30:17,840 Така што гледате јас сум таа скалирање вертикално, како и хоризонтално. 369 00:30:17,840 --> 00:30:19,680 >> А потоа тука е еден пример. 370 00:30:19,680 --> 00:30:27,590 Ако имате n = 2, ќе видите дека првите сини пиксели таму се повторува два пати 371 00:30:27,590 --> 00:30:30,930 хоризонтално како и вертикално два пати. 372 00:30:30,930 --> 00:30:38,040 И тогаш тоа продолжува натаму, и така имаш директен скалирање на вашата оригинална слика од двајца. 373 00:30:40,920 --> 00:30:47,600 >> Па тогаш ако ние требаше да детали pseudocode за ова, сакаме да ја отворам датотеката. 374 00:30:47,600 --> 00:30:49,880 А потоа знаејќи дека ако се вратиме тука, 375 00:30:49,880 --> 00:30:54,540 можеме да видиме дека ширината на outfile се случува да се биде различен од ширината на infile. 376 00:30:54,540 --> 00:30:56,130 Што значи тоа? 377 00:30:56,130 --> 00:31:01,230 Тоа значи дека нашите технички податоци нема да се промени. 378 00:31:01,230 --> 00:31:03,790 И така што ќе сакате да направите е да се ажурира заглавието информации, 379 00:31:03,790 --> 00:31:11,820 знаејќи дека кога читаме во досиејата ако сте работат на copy.c рамка, 380 00:31:11,820 --> 00:31:17,570 веќе имаме променлива која укажува на она што големина е и работи како што. 381 00:31:17,570 --> 00:31:24,060 Значи откако ќе го имаме тоа, она што можеби ќе сакате да направите е да се промени оние кои се особено променливи. 382 00:31:24,060 --> 00:31:29,380 Запомнете, ако имате struct, како да пристапите на променливи во тоа. 383 00:31:29,380 --> 00:31:32,080 Го користите точка операторот, нели? 384 00:31:32,080 --> 00:31:36,420 Па потоа со помош дека, знаеш дека ќе треба да го промените насловот информации. 385 00:31:36,480 --> 00:31:41,030 Па овде е само листа на реалните елементи кои се случува да се менува во вашето досие. 386 00:31:41,030 --> 00:31:45,180 Големината на датотеката ќе се менува, на сликата, како и ширина и висина. 387 00:31:45,180 --> 00:31:50,080 Па тогаш ќе се вратам на картата на bitmaps, 388 00:31:50,080 --> 00:31:57,730 погледне дали тоа е заглавје на датотеката или информации насловот кој содржи таа информација 389 00:31:57,730 --> 00:32:00,920 и потоа да се промени колку што е потребно. 390 00:32:05,010 --> 00:32:12,470 Повторно, да речеме ср copy.c resize.c. 391 00:32:12,470 --> 00:32:19,270 Тоа значи дека resize.c сега содржи сè што е содржан внатре копија 392 00:32:19,270 --> 00:32:24,490 бидејќи копија ни дава начин на читање во секој scanline пиксел од пиксел. 393 00:32:24,490 --> 00:32:29,860 Освен сега, наместо само менување на вредностите како што правевме во Whodunit, 394 00:32:29,860 --> 00:32:37,980 она што сакате да го направите е да сакаме да пишуваат во повеќе пиксели 395 00:32:37,980 --> 00:32:43,580 додека нашата n е поголема од 1. 396 00:32:43,580 --> 00:32:47,110 >> Потоа она што сакате да направите е ние сакаме да го водат хоризонтално со n, 397 00:32:47,110 --> 00:32:50,490 како и тоа се водат вертикално од n. 398 00:32:50,490 --> 00:32:52,710 Како да го направите ова? 399 00:32:52,710 --> 00:32:56,890 Кажете го вашиот n е 2 и имаш овој дадена infile. 400 00:32:56,890 --> 00:32:58,730 Курсорот ќе започне во првата, 401 00:32:58,730 --> 00:33:03,530 и она што сакате да го направите ако n е 2, сакате да се печати во 2 од нив. 402 00:33:03,530 --> 00:33:05,490 Така ќе се печати во 2 од нив. 403 00:33:05,490 --> 00:33:10,830 Тогаш курсорот ќе се движи кон следниот пиксели, што е црвен, 404 00:33:10,830 --> 00:33:18,400 и тоа се случува да испечатите 2 од оние црвени, додавање тоа врз она што е направено досега. 405 00:33:18,400 --> 00:33:26,280 Тогаш покажувачот ќе се движи кон следниот пиксели и да подготви во 2 од нив. 406 00:33:26,280 --> 00:33:37,180 Ако се погледне назад кон copy.c рамка, што е ова не тука 407 00:33:37,180 --> 00:33:42,830 се создава нова инстанца на RGB трокреветни, нова променлива наречена трокреветни. 408 00:33:42,830 --> 00:33:50,500 И тука кога се чита во неа, го чита од infile 1 RGBTRIPLE 409 00:33:50,500 --> 00:33:53,470 и продавници внатре во тоа тројно променлива. 410 00:33:53,470 --> 00:33:57,590 Па тогаш вие всушност имаат променлива претставуваат дека особено пиксели. 411 00:33:57,590 --> 00:34:05,290 Тогаш кога ќе напишам, она што можеби ќе сакате да направите е да покривам на запишување изјава во за телефонска линија 412 00:34:05,290 --> 00:34:11,080 што пишува во вашиот outfile онолку пати колку што е потребно. 413 00:34:17,449 --> 00:34:20,100 Тоа е едноставна. 414 00:34:20,200 --> 00:34:27,590 Само во основа се повторува процесот на пишување n број на пати за да ја скала хоризонтално. 415 00:34:27,590 --> 00:34:32,969 >> Но, тогаш ние треба да се запамети дека нашите баласт е ќе се смени. 416 00:34:47,350 --> 00:34:53,020 Претходно, велат имавме нешто од должината 3. 417 00:34:53,020 --> 00:35:00,130 Тогаш ние само би додал во колку Соочи? Само уште да се направи повеќе од 4. 418 00:35:00,130 --> 00:35:10,480 Но велат дека ние сме скалирање оваа слика со n = 2. 419 00:35:10,480 --> 00:35:16,300 Па тогаш колку сини пиксели ќе имаме на крајот? Ќе имаме 6. 420 00:35:16,300 --> 00:35:21,470 1, 2, 3, 4, 5, 6. Во ред. 421 00:35:21,470 --> 00:35:26,580 6 не е повеќе од 4. Што е најблискиот повеќе од 4? Тоа ќе биде 8. 422 00:35:26,580 --> 00:35:33,200 Така ние всушност ќе имаме 2 букви на Соочи таму. 423 00:35:33,200 --> 00:35:38,720 >> Дали некој се сеќавам ако имаме формула за пресметување Соочи 424 00:35:38,720 --> 00:35:41,350 и каде што може да биде? 425 00:35:41,350 --> 00:35:45,160 [Нечујни студент одговор] >> Да, copy.c. Право. 426 00:35:45,160 --> 00:35:49,800 Постои формула во copy.c да се пресмета колку Соочи имате 427 00:35:49,800 --> 00:35:53,810 дадена одредена ширина на bitmap слика. 428 00:35:53,810 --> 00:36:02,950 Па тогаш тоа ќе биде корисно кога ќе треба да додадете во одредена сума на Соочи 429 00:36:02,950 --> 00:36:06,160 всушност да дознаам колку Соочи треба да додадете. 430 00:36:10,820 --> 00:36:15,850 Но, една забелешка, сепак, е дека вие сакате да бидете сигурни дека сте користење на правото големина. 431 00:36:15,850 --> 00:36:21,410 Но, бидете внимателни затоа што ти си во основа ќе се занимаваат со две bitmap слики. 432 00:36:21,410 --> 00:36:23,410 Вие сакате да бидете сигурни дека сте користење на правото. 433 00:36:23,410 --> 00:36:26,820 Кога сте пресметување на баласт за outfile, сакате да го користите на ширината на outfile 434 00:36:26,820 --> 00:36:29,860 и не ширината на претходниот. 435 00:36:29,860 --> 00:36:37,240 >> Велики. Овој вид на се грижи за се протега на целата bitmap слика хоризонтално. 436 00:36:37,240 --> 00:36:41,290 Но, она што сакате да го направите е, всушност, го водат вертикално, како и. 437 00:36:41,290 --> 00:36:48,760 Ова ќе биде малку сложени да ја формира, бидејќи кога ќе завршите со копирање ред 438 00:36:48,760 --> 00:36:51,580 и пишување тој ред, нашата курсорот ќе биде на крајот. 439 00:36:51,580 --> 00:36:56,210 Значи, ако читаме повторно, тогаш тоа е само ќе прочитате во следната линија. 440 00:36:56,210 --> 00:37:03,660 Значи она што сакате да го направите е вид на се најде некој начин на копирање оние редови повторно 441 00:37:03,660 --> 00:37:12,500 или само вид на преземање на тој ред, а потоа препишување тоа повторно. 442 00:37:14,380 --> 00:37:17,940 Како што вид на алудира, постојат неколку различни начини да го направите тоа. 443 00:37:17,940 --> 00:37:23,040 Што можете да направите е како сте ќе низ и преку читање на одредена scanline 444 00:37:23,040 --> 00:37:28,560 и менување на тоа што е потребно, тогаш вид на продавница на сите оние пиксели во низа. 445 00:37:28,560 --> 00:37:36,350 Потоа подоцна знаеш дека ќе треба да се печати дека низа повторно, 446 00:37:36,350 --> 00:37:39,830 и за да можете да го користите само таа низа да го направите тоа. 447 00:37:39,830 --> 00:37:44,500 Друг начин да го направите е да можете да го копирате надолу еден ред, 448 00:37:44,500 --> 00:37:47,950 разбирам дека треба да го копирате дека повторно, па всушност го движите курсорот, 449 00:37:47,950 --> 00:37:50,950 и тоа ќе биде со користење на метод fseek. 450 00:37:50,950 --> 00:37:56,410 Можете да го движите курсорот целиот пат назад а потоа се повторува копија процес повторно. 451 00:37:56,410 --> 00:38:03,960 >> Значи, ако нашите скалирање број е n, тогаш колку пати ќе треба да се вратиш назад 452 00:38:03,960 --> 00:38:10,500 и преправи линија? >> [Студент] n - 1. >> Да, совршено. n - 1. 453 00:38:10,500 --> 00:38:14,390 Ние го направи еднаш веќе, па потоа ќе сакате да се повторува кога ќе се вратам процес 454 00:38:14,390 --> 00:38:17,460 n - 1 износ од пати. 455 00:38:22,730 --> 00:38:25,860 Во ред. Па таму ќе ја имате големината функција. 456 00:38:25,860 --> 00:38:34,360 >> Сега можеме да дојдеме до навистина забавно дел, мојата омилена pset, која е реставрирана. 457 00:38:34,360 --> 00:38:39,580 Наместо bitmaps, овој пат ние сме се занимаваат со JPEG слики. 458 00:38:39,580 --> 00:38:43,370 Ние сме, всушност, не даде датотека само на JPEG слики, 459 00:38:43,370 --> 00:38:46,600 ние си даде основа суровини мемориска картичка формат. 460 00:38:46,600 --> 00:38:51,790 И така овој содржи малку информации и ѓубре вредности во почетокот, 461 00:38:51,790 --> 00:38:57,240 а потоа почнува и има еден куп на JPEG датотеки. 462 00:38:57,240 --> 00:39:03,430 Сепак, ние сме предадени картичка каде сме избришани слики; 463 00:39:03,430 --> 00:39:08,300 во суштина, ние сме заборавиле каде што фотографиите се наоѓа во рамките на картичката. 464 00:39:08,300 --> 00:39:12,770 Па тогаш нашата задача во направите е да се оди преку оваа картичка формат 465 00:39:12,770 --> 00:39:16,500 и да најдат оние слики повторно. 466 00:39:16,500 --> 00:39:23,990 >> За среќа, структурата на JPEG датотеки и картичка датотека е малку корисни. 467 00:39:23,990 --> 00:39:28,850 Тоа дефинитивно можеше да биде малку сложени да ја формира ако не беше во овој формат. 468 00:39:28,850 --> 00:39:40,160 Секоја датотека JPEG, всушност, започнува со две можни секвенци, наведени погоре. 469 00:39:40,160 --> 00:39:42,970 Во суштина, кога имате нов JPEG фајл, 470 00:39:42,970 --> 00:39:52,720 тоа започнува со или секвенца ffd8 ffe0 или другиот, ffd8 ffe1. 471 00:39:52,720 --> 00:39:59,530 Друга корисна работа да се знае е дека JPEG слики се чуваат contiguously. 472 00:39:59,530 --> 00:40:03,380 Значи секогаш кога еден JPEG фајл завршува, другиот започнува. 473 00:40:03,380 --> 00:40:07,070 Така што не е било каков вид на во-помеѓу вредностите таму. 474 00:40:07,070 --> 00:40:15,510 Откако ќе хит на почетокот на JPEG, ако веќе сте биле читање на JPEG, 475 00:40:15,510 --> 00:40:21,800 знаете дека сте хит на крајот на претходниот и на почетокот на следниот. 476 00:40:21,800 --> 00:40:25,890 >> Да се ​​вид на визуелизира ова, јас направив шематски. 477 00:40:25,890 --> 00:40:36,910 Друга работа за JPEG слики е дека ние може да прочитате во секвенци од 512 бајти во еден момент, 478 00:40:36,910 --> 00:40:39,380 Слично со почетокот на картичката. 479 00:40:39,380 --> 00:40:43,370 Ние не треба да се проверува секој бајт бидејќи тоа би си го цица. 480 00:40:43,370 --> 00:40:48,200 Така, наместо, она што можеме да направиме е, всушност, само читаат во 512 бајти во еден момент 481 00:40:48,200 --> 00:40:54,700 а потоа, наместо на проверка помеѓу оние во тие малечки парчиња, 482 00:40:54,700 --> 00:40:58,640 ние само може да се провери на почетокот на 512 бајти. 483 00:40:58,640 --> 00:41:02,570 Во суштина, во овој филм, она што го гледате е во почетокот на картичката, 484 00:41:02,570 --> 00:41:08,700 имате вредности кои не се навистина релевантни за вистинските JPEG слики себе. 485 00:41:08,700 --> 00:41:15,830 Но, тогаш она што го имам е ѕвезда за да се покаже еден од двата почнувајќи секвенци за JPEG. 486 00:41:15,830 --> 00:41:19,910 Значи секогаш кога ќе видите една ѕвезда, знаете дека имате JPEG датотека. 487 00:41:19,910 --> 00:41:25,030 А потоа секој JPEG датотека ќе биде некои повеќе од 512 бајти 488 00:41:25,030 --> 00:41:27,880 но не значи дека истиот повеќе. 489 00:41:27,880 --> 00:41:32,050 Начинот на кој знаете дека сте погоди уште еден JPEG е ако го погоди друга ѕвезда, 490 00:41:32,050 --> 00:41:39,090 друга почетна секвенца на бајти. 491 00:41:39,090 --> 00:41:43,330 Тогаш она што го имаме тука е дека имате црвена JPEG фајл продолжува додека не го погоди ѕвезда, 492 00:41:43,330 --> 00:41:45,150 кој е означен со нова боја. 493 00:41:45,150 --> 00:41:48,510 Ќе продолжи, а потоа ќе го погоди друга ѕвезда, ќе го погоди уште еден JPEG, 494 00:41:48,510 --> 00:41:50,590 ќе продолжи по целиот пат до крај. 495 00:41:50,590 --> 00:41:53,180 Вие сте на последната слика тука, розова еден. 496 00:41:53,180 --> 00:41:58,220 Да одите до крај додека не го погоди крајот на датотеката карактер. 497 00:41:58,220 --> 00:42:00,820 Ова ќе биде навистина корисно. 498 00:42:00,820 --> 00:42:03,170 >> Неколку главни takeaways тука: 499 00:42:03,170 --> 00:42:06,670 Картичка датотека не започнува со JPEG, 500 00:42:06,670 --> 00:42:13,350 но еднаш JPEG започнува, сите на JPEG слики се чуваат рамо до рамо еден на друг. 501 00:42:17,520 --> 00:42:20,420 >> Некои pseudocode за враќање. 502 00:42:20,420 --> 00:42:22,570 Прво, ние ќе ги отвориме нашите картичка датотека, 503 00:42:22,570 --> 00:42:27,500 и тоа ќе биде со користење на нашите датотека I / O функции. 504 00:42:27,500 --> 00:42:32,430 Ние ќе го повтори овој процес додека не го достигнала крајот на датотеката. 505 00:42:32,430 --> 00:42:36,450 Ние ќе ја прочитате 512 бајти во исто време. 506 00:42:36,450 --> 00:42:39,180 И она што го рече е тука ние ќе се чува во тампон, 507 00:42:39,180 --> 00:42:46,230 Значи, во основа се држи до оние 512 бајти додека ние точно знаеме што да правиме со нив. 508 00:42:46,230 --> 00:42:50,300 Потоа она што сакате да направите е ние сакаме да се провери дали ние сме хит ѕвезда или не. 509 00:42:50,300 --> 00:42:57,960 Ако ние сме хит ѕвезда, ако ние сме го погоди еден од почетна секвенци, 510 00:42:57,960 --> 00:42:59,980 тогаш знаеме дека сме хит нова JPEG фајл. 511 00:42:59,980 --> 00:43:08,860 Што ќе сакате да направите е ние ќе сакате да се создаде новата датотека во нашата pset4 директориум 512 00:43:08,860 --> 00:43:14,480 да продолжат со таа датотека. 513 00:43:14,480 --> 00:43:18,220 Но, исто така, ако веќе сте направиле една JPEG пред, 514 00:43:18,220 --> 00:43:25,620 тогаш ние сакаме да се стави крај на таа датотека и да се поттикнат до pset4 папка, 515 00:43:25,620 --> 00:43:29,780 каде што ќе имаме таа датотека чуваат, бидејќи ако ние не се каже дека ние сме завршиле дека JPEG фајл, 516 00:43:29,780 --> 00:43:37,290 тогаш ние во основа ќе имаат неодредена сума. На JPEG слики никогаш нема да заврши. 517 00:43:37,290 --> 00:43:40,840 Значи, сакаме да бидете сигурни дека кога ќе ја читаш во JPEG датотека и пишување дека, 518 00:43:40,840 --> 00:43:46,590 ние сакаме да конкретно затвори дека со цел да се отвори следниот. 519 00:43:46,590 --> 00:43:48,430 Ние ќе сакате да се провери неколку работи. 520 00:43:48,430 --> 00:43:52,880 Ние сакаме да се провери дали ние сме на почетокот на една нова JPEG со нашите тампон 521 00:43:52,880 --> 00:43:56,780 и исто така ако ние веќе пронашле JPEG пред 522 00:43:56,780 --> 00:44:03,930 затоа што ќе го промени вашиот процес малку. 523 00:44:03,930 --> 00:44:07,880 Па тогаш, откако ќе поминат низ целиот пат и ќе го погоди на крајот на датотеката, 524 00:44:07,880 --> 00:44:11,570 тогаш што ќе сакате да направите е ќе сакате да го затворите сите датотеки кои се во моментов е отворен. 525 00:44:11,570 --> 00:44:14,100 Тоа веројатно ќе биде последен JPEG фајл дека имате, 526 00:44:14,100 --> 00:44:18,930 како и картичка датотека која сте биле занимаваат со. 527 00:44:21,940 --> 00:44:28,670 >> На последната пречка што треба да се справи е како да се навистина направи JPEG датотека 528 00:44:28,670 --> 00:44:31,950 и како да всушност го притисни за папката. 529 00:44:33,650 --> 00:44:39,850 На pset бара секој JPEG дека ќе најдете биде во следниов формат, 530 00:44:39,850 --> 00:44:43,990 каде што ќе имаат број. jpg. 531 00:44:43,990 --> 00:44:50,750 Бројот, дури и ако тоа е 0, ние го нарекуваме 000.jpg. 532 00:44:50,750 --> 00:44:55,730 Секогаш кога ќе се најде JPEG во вашата програма, 533 00:44:55,730 --> 00:44:58,040 сте ќе сакате да го името во цел дека тоа е пронајдена. 534 00:44:58,040 --> 00:44:59,700 Што значи ова? 535 00:44:59,700 --> 00:45:03,530 Ние треба да се вид на ги пратите на тоа колку ние Наидовме 536 00:45:03,530 --> 00:45:08,680 и што бројот на секој JPEG треба да биде. 537 00:45:08,680 --> 00:45:13,800 Тука ние ќе ги искористат предностите на sprintf функција. 538 00:45:13,800 --> 00:45:17,480 Слични на printf, која само вид на отпечатоци вредност надвор во терминал, 539 00:45:17,480 --> 00:45:23,910 sprintf печати ја датотеката во папката. 540 00:45:23,910 --> 00:45:30,870 И така што ова ќе направам, ако имав sprintf, наслов, а потоа стринг таму, 541 00:45:30,870 --> 00:45:36,660 тоа ќе испечатите 2.jpg. 542 00:45:36,660 --> 00:45:41,020 Претпоставувајќи дека сум затворен моите датотеки правилно, 543 00:45:41,020 --> 00:45:47,210 кој ќе содржи датотека која сум бил пишување надвор. 544 00:45:47,210 --> 00:45:50,320 Но, едно е дека кодот што сум тука 545 00:45:50,320 --> 00:45:53,360 сосема не ги задоволуваат што pset бара. 546 00:45:53,360 --> 00:46:02,410 На pset бара вториот JPEG фајл да се именува 002, наместо само 2. 547 00:46:02,410 --> 00:46:09,160 Па кога ќе се печати името, тогаш можеби би сакале да ја смени случаеви малку. 548 00:46:09,160 --> 00:46:18,140 >> Дали некој се сеќавам како ние се овозможи празни места кога ќе печати нешто? 549 00:46:18,140 --> 00:46:22,530 Да. >> [Студент] Вие стави 3 помеѓу знакот за процент и 2. >> Да, совршено. 550 00:46:22,530 --> 00:46:25,610 Ќе се стави 3 во овој случај, бидејќи ние сакаме простор за 3. 551 00:46:25,610 --> 00:46:32,590 % 3d веројатно ќе ви даде 002.jpg наместо на 2. 552 00:46:32,590 --> 00:46:40,120 Првиот аргумент во sprintf функција е всушност знак низа, 553 00:46:40,120 --> 00:46:42,520 кои претходно знаеше како стрингови. 554 00:46:42,520 --> 00:46:50,700 Оние волја, вид на повеќе како привремено чување, исто чување произлегуваат низа. 555 00:46:50,700 --> 00:46:54,950 Вие навистина не ќе се занимаваат со ова, но треба да го вклучат. 556 00:46:54,950 --> 00:47:00,710 >> Знаејќи дека секој името на датотеката има на број, кој ги зема три карактери, 557 00:47:00,710 --> 00:47:06,770 и тогаш. JPG, колку долго оваа низа треба да биде? 558 00:47:09,070 --> 00:47:14,310 Исфрли број. Колку знаци во насловот, во името? 559 00:47:18,090 --> 00:47:26,320 Значи има 3 hashtags, период, JPG. >> [Студент] 7. >> 7. Не сосема. 560 00:47:26,320 --> 00:47:32,000 Ние ќе сакате 8 затоа што ние сакаме да се овозможи null терминаторот, како и. 561 00:47:45,340 --> 00:47:49,730 >> Конечно, само за да извлече процес што ќе се прави за враќање, 562 00:47:49,730 --> 00:47:55,420 имате некои почетокот информации. 563 00:47:55,420 --> 00:48:02,460 Ќе продолжи се додека не се најде на почетокот на JPEG датотека, 564 00:48:02,460 --> 00:48:07,900 и дека може да биде еден од двата почнувајќи секвенци. 565 00:48:07,900 --> 00:48:12,510 Можете задржи за читање. Секој коса црта тука претставува 512 бајти. 566 00:48:12,510 --> 00:48:22,630 Можете да продолжи со читање, да ги задржи за читање додека не наишле на друга почетна секвенца. 567 00:48:22,630 --> 00:48:29,790 Откако ќе го имаат тоа, можете да го завршите тековниот JPEG - во овој случај, тоа е црвен, 568 00:48:29,790 --> 00:48:31,030 па сакате да се стави крај тоа. 569 00:48:31,030 --> 00:48:35,540 Сакате да sprintf името на таа во вашиот pset4 папка, 570 00:48:35,540 --> 00:48:41,580 тогаш ќе сакате да се отвори нов JPEG и потоа ги задржи за читање 571 00:48:41,580 --> 00:48:46,370 додека не се сретне следната. 572 00:48:46,370 --> 00:48:49,040 Чувајте ги за читање, да ги задржи на читање, 573 00:48:49,040 --> 00:48:56,290 а потоа конечно, конечно, си оди за да стигнат до крајот на датотеката, 574 00:48:56,290 --> 00:49:00,360 и така ќе сакате да го затворите последната JPEG дека сте биле работат со, 575 00:49:00,360 --> 00:49:08,380 sprintf дека во вашиот pset4 фолдер, а потоа да се погледне во сите слики кои сте добиле. 576 00:49:08,380 --> 00:49:12,050 Тие слики се всушност слики од CS50 персонал, 577 00:49:12,050 --> 00:49:16,430 и така ова е местото каде бонус забава дел од pset доаѓа во 578 00:49:16,430 --> 00:49:26,310 е дека се натпреваруваат во делови да се најде TFS во слики 579 00:49:26,310 --> 00:49:34,610 и да ги преземат слики со нив за да докаже дека сте го направиле на pset 580 00:49:34,610 --> 00:49:37,030 и за да можете да видите кој членови на персоналот се во слики. 581 00:49:37,030 --> 00:49:41,510 Па тогаш да фотографирате со персоналот. Понекогаш ќе треба да ги бркаат надолу. 582 00:49:41,510 --> 00:49:44,680 Веројатно некои од нив ќе се обиде да побегне од вас. 583 00:49:44,680 --> 00:49:47,320 Можете да фотографирате со нив. 584 00:49:47,320 --> 00:49:51,190 Ова е во тек. Тоа не е поради кога pset се должи. 585 00:49:51,190 --> 00:49:53,340 Крајниот рок ќе бидат објавени во спецификации. 586 00:49:53,340 --> 00:49:58,060 Потоа, заедно со вашата секција, кое дел се и повеќето слики 587 00:49:58,060 --> 00:50:04,430 со повеќето членови на персоналот ќе победи прилично страшни награда. 588 00:50:04,430 --> 00:50:08,890 Тоа е вид на поттик да ја добиете вашата pset4 заврши што е можно побрзо 589 00:50:08,890 --> 00:50:10,820 затоа што тогаш можете да се фаќате за бизнис 590 00:50:10,820 --> 00:50:14,570 лов на одредување на сите различни CS50 членови на персоналот. 591 00:50:14,570 --> 00:50:17,500 Тоа не е задолжително, иако, па откако ќе го добиете слики, 592 00:50:17,500 --> 00:50:20,310 тогаш ќе се заврши со pset4. 593 00:50:20,310 --> 00:50:23,970 >> И јас сум завршил со можи 4, па се заблагодарам на сите што дојдовте. 594 00:50:23,970 --> 00:50:29,330 Среќно со вештачења. [Аплауз] 595 00:50:29,330 --> 00:50:31,000 [CS50.TV]