[Powered by Google Translate] [Праходжанне - Праблема Set 4]
[Zamyla Chan - Гарвардскі універсітэт]
[Гэта CS50. - CS50.TV]
Добра. Прывітанне ўсім, і дабро запрашаем Пакрокавае кіраўніцтва 4.
>> Сёння наш PSET з'яўляецца крыміналістыка.
Судовая экспертыза з'яўляецца вельмі весела PSET, што з'яўляецца праца з растравай файламі
каб даведацца, хто здзейсніў злачынства.
Тады мы ідзем, каб змяніць памеры некаторых графічных файлаў,
Затым мы таксама збіраемся мець справу з сапраўды весела часткі, якая называецца аднаўленне,
, У якім мы ў асноўным перадаў карту памяці
, У якім нехта выпадкова выдаліў усе свае файлы,
і мы папрасілі аднавіць гэтыя файлы.
>> Але спачатку, перш чым мы атрымаем у PSET, я проста хачу павіншаваць ўсіх.
Мы збіраемся ў сярэдзіне гэтага курса.
Віктарына 0, ззаду нас, і мы ў pset4, так што па сутнасці, мы на паўдарозе.
Мы прайшлі доўгі шлях, калі вы паглядзіце на вашыя psets, pset0 і pset1,
так павіншаваць сябе аб тым,
і мы збіраемся, каб патрапіць у некаторыя сапраўды пацешныя рэчы.
>> Такім чынам, наш інструментар для гэтага PSET, зноў жа, замест таго, каб Суда ням-й абнаўленне,
мы можам проста запусціць update50 калі вы ў версіі 17/3 і вышэй прыбора.
Так што не забудзьцеся запусціць update50 - гэта нашмат прасцей, некалькі менш сімвалаў -
каб пераканацца, што вы знаходзіцеся на апошняй версіі прыбора.
Асабліва гэта важна, калі мы update50 пачаць выкарыстоўваць CS50 праверкі.
Таму пераканайцеся, што вы робіце гэта.
>> Для ўсіх падзелаў для гэтага PSET,
мы будзем мець справу з файламі ўваходы і выхады, файлавы ўвод / выснова
Мы збіраемся ісці на мноства праграм, якія маюць справу з масівамі
якія паказваюць на файлы і да таго падобнае,
таму мы хочам пераканацца, што мы сапраўды знаёма і зручна
справу з тым, як уваход і выхад у файлы.
>> У размеркаванні код для гэтай PSET файл з імем copy.c,
і вось, што мы збіраемся знайсці будзе вельмі карысным для нас
таму што мы збіраемся ў канчатковым выніку фактычна капіруеце файл copy.c
і проста змяніць яго трохі, каб быць у стане дасягнуць першыя 2 часткі пастаўленай задачы.
>> І таму тое, як я ўжо казаў, мы маем справу з растравых малюнкаў, а таксама JPEG.
Так на самай справе разумення структуры як гэтыя файлы будуць арганізаваны,
як мы можам на самай справе перакладаць 0 і 1 у структурах
і тое, што мы сапраўды можам зразумець і інтэрпрэтаваць і рэдагаваць,
што будзе сапраўды важна,
так адбываецца ў JPEG і растравых файлаў і разумення структуры з іх.
>> Pset4, як звычайна, пачынаецца з раздзела пытанняў.
Тыя, будзе мець справу з файлавага ўводу / вываду, і вы атрымаеце прывыклі да гэтага.
Тады Частка 1 дэтэктыўны раман, у якім вы далі растравы файл
, Які выглядае накшталт як чырвоныя кропкі на ўсім працягу.
І то ў асноўным тое, што мы збіраемся зрабіць, гэта ўзяць гэты файл і проста змяніць яго крыху
у версіі, што мы можам чытаць.
Па сутнасці, як толькі мы скончым, мы будзем мець той жа файл,
акрамя мы зможам убачыць схаванае паведамленне ўтоена ўсе гэтыя чырвоныя кропкі.
Тады Resize гэта праграма, якая, улічваючы файлаў
, А затым атрымала назву файла, у якім ён выводзіць, а затым прысвойваецца нумар, а таксама,
на самай справе, што памер растравай тым, што цэлае значэнне.
Тады, нарэшце, у нас ёсць Recover PSET.
Нам дадзены карт памяці і затым аднавіць усе фатаграфіі
, Якія былі выпадкова выдаленыя,
але, як мы даведаемся, на самай справе не выдаляецца і выдаляецца з файла;
мы толькі часткова страціла, дзе яны былі ў файле, але мы збіраемся аднавіць гэта.
>> Вялікі. Так адбываецца ў файл I / O у прыватнасці, гэта цэлы спіс функцый, якія вы будзеце выкарыстоўваць.
Вы ўжо бачылі трохі асновы Еореп, FREAD, і FWRITE,
але мы збіраемся глядзець далей у пэўным файле ўводу / вываду функцый, такіх як fputc,
, У якім вы проста напісаць адзін знак за адзін раз,
у FSEEK, дзе вы, здаецца, перамясціць індыкатар пазіцыі файла наперад і назад,
і некаторыя іншыя. Але мы будзем ісці ў гэтым крыху пазней, падчас PSET.
>> Такім чынам, спачатку проста патрапіць у файле ўводу / вываду, перш чым ісці ў PSET,
, Каб адкрыць файл, напрыклад, тое, што вы павінны зрабіць, гэта на самай справе ўсталяваць паказальнік на файл.
Таму ў нас ёсць паказальнік на файл *.
У гэтым выпадку, я тэлефаную яго ў паказальнік, таму што гэта будзе мой INFILE.
І таму я збіраюся выкарыстоўваць функцыю Еореп, а затым імя файла
, А затым рэжым, у якім я буду мець справу з файлам.
Так што "R" у дадзеным выпадку для чытання, "w" для запісу, а затым "" для дадання.
Напрыклад, калі вы маеце справу з входной_файл
і ўсё, што вам трэба зрабіць, гэта прачытаць біты і байты, якія захоўваюцца там,
то вы, верагодна, захочаце выкарыстоўваць "Г" у якасці рэжыму.
Калі вы хочаце на самай справе пісаць, збольшага зрабіць новы файл,
тое, што мы збіраемся зрабіць, гэта мы збіраемся адкрыць новы файл
і выкарыстоўваць "W" рэжым запісу.
>> Такім чынам, калі вы на самой справе чытанне ў файлах, структура выглядае наступным чынам.
Перш за ўсё, уключаць паказальнік на структуру, якая будзе ўтрымліваць байт, якія вы чытаеце.
Так што гэта будзе ў канцы размяшчэнне байт, якія вы чытаеце.
Вы тады збіраецеся паказаць памер, як і ў асноўным, колькі байтаў
Ваша праграма павінна чытаць у файл, памерам у асноўным адзін элемент,
і тады вы будзеце паказваць, колькі элементаў вы хочаце чытаць.
І, нарэшце, вы павінны ведаць, дзе вы чытаеце с,
так што гэта будзе вашай ў паказальнік.
Я колерам, таму што гэтыя FREAD таксама вельмі падобны на FWRITE,
акрамя вас, хочаце, каб пераканацца, што вы выкарыстоўваеце правільны заказ,
Пераканайцеся, што вы на самай справе запіс або чытанне з правага файл.
>> Такім чынам, тое, як і раней, калі ў нас ёсць памер элемента, а таксама шэраг элементаў,
то мы можам пагуляць тут няшмат.
Скажам, у мяне ёсць сабака, структура і так, то я хачу прачытаць двух сабак адначасова.
Што я магу зрабіць, гэта сказаць памер аднаго элемента будзе памер аднаго сабакі
і я збіраюся на самай справе чытаць два з іх.
Акрамя таго, што я мог зрабіць, гэта сказаць, што я толькі збіраюся чытаць адзін элемент
і што адзін элемент будзе памерам два сабакі.
Дык вось аналагічная, як вы можаце відаў пагуляць з памерам і колькасцю
у залежнасці ад таго, што больш інтуітыўна зразумелым для вас.
>> Добра. Такім чынам, зараз мы атрымаем у пісьмовым выглядзе файлаў.
Калі вы хочаце запісаць файл, першы аргумент на самай справе, дзе вы чытаеце с.
Так што ў асноўным дадзеныя, якія вы збіраецеся пісаць у файл,
, Які з'яўляецца з паказальніка ў канцы.
Так што, калі вы маеце справу з PSET, пераканайцеся, што вы не заблыталіся.
Можа быць, ёсць вызначэнне бок аб бок.
Вы можаце выцягнуць азначэнняў ў кіраўніцтве, увёўшы мужчыну, а затым FWRITE, напрыклад,
ў тэрмінале, ці вы можаце звярнуцца да гэтага слайд
і пераканайцеся, што вы карыстаецеся правільны.
Такім чынам, яшчэ раз, для FWRITE, калі ў вас ёсць файл, які вы хочаце запісаць у,
што гэта будзе апошні аргумент, і што гэта будзе паказальнік на гэты файл.
Такім чынам вось як мы маем справу з напісаннем, магчыма, некалькі байт у той час,
але кажуць, што вы проста хочаце напісаць ўсяго адну характару.
Як мы ўбачым пазней у гэтым, напрыклад, у растравыя выявы мы павінны яго выкарыстоўваць.
Вось тады мы можам выкарыстоўваць fputc, па сутнасці, проста паклаўшы адзін знак за раз, CHR,
ў паказальнік, і гэта наш з паказальнікаў няма.
Дык вось, калі мы імкнемся або пісаць у файл,
Размовы адсочваць, дзе мы знаходзімся.
Так што гэта свайго роду курсора, індыкатар пазіцыі файла.
І таму, калі мы пісаць ці чытаць зноў у файл,
файл на самай справе не памятае, дзе яна ёсць,
і так працягваецца ад таго, дзе знаходзіцца курсор.
Гэта можа быць карысна, калі вы хочаце, скажам, чытаць у пэўным колькасці, каб зрабіць нешта
, А затым прачытаць у наступным памеры,
але часам мы маглі б вярнуцца назад або фактычна пачаць з некаторага значэння спасылкі.
Такім чынам, то функцыя FSEEK, што ён робіць, гэта дазваляе нам рухацца курсор ў пэўны файл
пэўную колькасць байт.
І тое, што мы павінны зрабіць, гэта паказаць, дзе спасылкі значэнне.
Так што альбо яна рухаецца наперад або назад ад таго, дзе ў цяперашні час знаходзіцца курсор,
ці мы можам паказаць, што ён проста павінен рухацца ў ад пачатку файла
ці ў канцы файла.
І таму вы можаце перадаць у адмоўных або станоўчых значэнняў да сумы,
і што будзе выгляд перамяшчэння курсора наперад або назад.
>> Перш чым мы пяройдзем у іншы psets, любыя пытанні аб файле I / O?
Добра. Як мы паглыбімся ў прыклады, не саромейцеся, каб спыніць мяне пытанні.
>> Такім чынам, у дэтэктыўны раман, вы перадалі файл малюнка падобныя на гэтую чырвоную на слайдзе,
і, падобна, гэта - букет з чырвоных кропак - і вы сапраўды не ведаю, што там напісана.
Калі ў вас касавокасць, Вы можаце быць у стане бачыць лёгкім блакітнаватым колерам у цэнтры.
Па сутнасці, гэта калі тэкст будзе захаваны.
Існаваў забойства, якое адбылося, і мы павінны высветліць, хто гэта зрабіў.
Для таго каб зрабіць гэта, мы павінны выгляду пераўтварыць гэта малюнак у зручным для чытання фармаце.
Калі вы, хлопцы, ніколі не сутыкаліся з гэтым, часам было б мала наборы
дзе вы бы павелічальнае шкло з чырвонай плёнкай. Любы? Так.
Такім чынам, вы б рукамі нешта накшталт гэтага, вы б павелічальным шклом
з чырвоным фільм па ёй, вы б паставіць яго над малюнкам,
, І вы зможаце ўбачыць паведамленне ўтоена ў ім.
Мы не маем павелічальнае шкло з чырвонай плёнкай, так што замест гэтага мы збіраемся віды стварыць наш уласны
У гэтым PSET.
І таму карыстач будзе ўводзіць дэтэктыўны раман, то ключ,. BMP,
так што гэта INFILE, што гэта чырвоная кропка паведамленні,
а потым яны кажуць verdict.bmp будзе наш выхадны файл.
Такім чынам, ён збіраецца стварыць новую растравых малюнкаў падобны на ключ 1
акрамя як у зручным для чытання фармаце, дзе мы можам убачыць схаванае паведамленне.
>> Паколькі мы збіраемся мець справу з рэдагавання і працы з растравых малюнкаў нейкі,
мы збіраемся выгляду апускання ў ў структуры гэтых растравых файлаў.
Мы пайшлі на гэта трохі ў лекцыі, але давайце паглядзім на іх яшчэ трохі.
Растравыя выявы, па сутнасці толькі размяшчэнне байтаў
дзе мы паказалі, якія байты азначае, што.
Дык вось накшталт як карту растравых малюнкаў
кажуць, што яна пачынаецца з некаторага файлы загалоўкаў, пачынае з некаторай інфармацыяй у там.
Вы бачыце, што каля Байт нумар 14 памер паказваецца ў растравыя малюнкі,
і гэта працягваецца.
Але тое, што мы сапраўды зацікаўленыя ў тут, пачынаючы прыкладна з байта нумар 54.
У нас ёсць гэтыя RGB троек.
Тое, што гэта збіраецца зрабіць, гэта ўтрымліваць фактычныя пікселяў, колер значэння.
Усё, што вышэй, што ў загалоўку некаторую інфармацыю
адпаведнага памеру малюнка, шырыню выявы, а вышыня.
Калі мы ідзем у запаўненне пазней, мы ўбачым, чаму памер малюнка
можа адрознівацца ад шырыні або вышыні.
Такім чынам, каб прадставіць гэтыя - гэтыя растравыя выявы ўяўляюць сабой паслядоўнасці байтаў -
што мы можам зрабіць, гэта сказаць добра, я буду памятаць, што ў індэксе 14,
вось дзе памер, напрыклад, але замест таго, што мы збіраемся зрабіць, каб зрабіць гэта прасцей
будзе апісаць яго структуру.
І так у нас ёсць дзве структуры зрабілі для нас, BITMAPFILEHEADER
і BITMAPINFOHEADER,
і таму, калі мы чытаем у гэты файл, па змаўчанні ён збіраецца ісці ў парадку,
і так, каб яна таксама збіраецца запоўніць ў такіх зменных, як biWidth і biSize.
І, нарэшце, кожны піксель прадстаўлены трыма байтамі.
Па-першае, гэта колькасць сіняга ў піксель, другі гэта колькасць зялёных,
І, нарэшце, колькасць чырвонага, дзе 0 гэта практычна не сіні ці зялёны або няма ні адной чырвонай
, А затым і далей з'яўляецца максімальным значэннем.
Гэтыя шаснаццаткавыя значэння.
Такім чынам, калі мы маем ff0000, тое, што адпавядае максімальнай колькасцю сіняга
і то не зялёныя і не чырвоныя, дык тое, што дасць нам сіне пікселяў.
Тады, калі ў нас ёсць усе Ф.Ф. па ўсіх напрамках, то гэта азначае, што ў нас ёсць белы піксель.
Гэта свайго роду супрацьлегласць Звычайна, калі мы гаворым RGB. Гэта на самай справе адбываецца BGR.
>> Таму, калі мы на самай справе выглядаюць у прыклад растравага малюнка - дазвольце мне выцягнуць адзін тут.
Гэта трохі малы.
Я маштабавання, і мы бачым, што гэта невыразна. Падобна на тое, блокі колеру.
У вас ёсць белыя блокі, а затым чырвоныя блокі.
Калі вы гуляеце ў Microsoft Paint, напрыклад, вы маглі б зрабіць нешта накшталт гэтага
на асноўным толькі жывапіс пэўныя квадраты ў пэўным парадку.
Такім чынам, што гэта азначае ў растравых заключаецца ў наступным.
Тут мы маем першы белыя пікселі, што ўсе 6 з'яўляюцца F, а затым у нас ёсць чырвоныя пікселі,
паказана 0000ff.
І так паслядоўнасць байт, што мы маем паказвае, як растравыя выявы будзе выглядаць.
Так што я зрабіў тут проста напісана ўсе гэтыя байты, а затым афарбаваныя ў чырвоны
так што вы можаце бачыць выгляд, калі вы касавокасць трохі, як гэты выгляд паказвае на ўсьмешлівы твар.
>> Такім чынам, каб праца растравага малюнка, я сабе гэта ў асноўным у выглядзе сеткі.
І так па змаўчанні, кожная радок у табліцы павінна быць кратнай 4 байт.
Калі мы паглядзім на растравыя выявы, вы запаўнення кожнага значэння.
Напрыклад, у вас можа быць чырвоным тут, тут зялёная, сіняя тут,
але вы павінны пераканацца, што выява запаўняецца некалькімі з чатырох байтаў.
Так што калі я хачу, каб мой вобраз, каб быць у трох кварталах шырокі, то я павінен быў бы пакласці пустыя значэння
У апошняй, каб зрабіць яго кратным чатырох.
Дык вось я хацеў бы дадаць у тое, што мы называем абіўка.
Я проста хачу, каб паказаць, што там з х.
Цяпер кажуць, што мы хочам малюнак, якое знаходзіцца ў 7 пікселяў даўжынёй, напрыклад.
У нас ёсць 1, 2, 3, 4, 5, 6, 7,
і ўсё гэта запаўняецца колерам.
Такім чынам, што растравыя выявы працуем, што нам трэба 8-й.
Цяпер у нас ёсць 1, 2, 3, 4, 5, 6, 7.
Нам трэба 8 вочак для растравага малюнка правільна чытаць.
Такім чынам, што мы павінны зрабіць, гэта дадаць у толькі трохі абіўка
каб пераканацца, што ўсе шырыні раўнамернае
і што ўсе шырыні кратнай 4.
І вось я ужо адзначалася раней, запаўненне ў выглядзе х ці хвалістая лінія,
але ў рэальнай растравых малюнкаў абіўка паказваецца шаснаццатковы 0.
Так што быў бы адзін знак, 0.
Што можа спатрэбіцца, з'яўляецца XXD каманды.
Што ён робіць на самай справе паказвае, як падобнае таму, што я рабіў раней з смайлік
Калі я на самой справе раздрукаваць тое, што кожны колер будзе на піксель
, А затым колерам яго, калі вы запускаеце XXD з дапамогай наступных каманд,
то яно будзе на самой справе раздрукаваць тое, што колеры для тых, хто пікселяў.
Тое, што вы павінны зрабіць, гэта тут я паказваю, як-S 54
кажа, што я збіраюся пачаць на 54-м байце
таму што да гэтага, памятаеце, калі мы азірнемся на карце растравых малюнкаў,
Вось і ўсё загалоўкі і таму падобнае.
Але тое, што мы сапраўды клапоцімся аб тым, фактычныя пікселяў, якія паказваюць на колер.
Такім чынам, дадаўшы ў гэты сьцяг,-ы 54, то мы можам убачыць значэння колеру.
І не турбуйцеся пра складаныя сцягамі і да таго падобнае.
У спецыфікацыі пастаўленай задачы, вы будзеце мець ўказанні, як выкарыстоўваць XXD для адлюстравання пікселяў.
Так што калі вы бачыце тут, гэта збольшага выглядае як зялёнае поле, гэтая маленькая рэч.
Я колерам 00ff00 ў асноўным кажуць не сіні, шмат зялёнага, а не чырвонага колеру.
Так што адпавядае зялёны колер.
Як вы бачыце тут, мы бачым зялёны прастакутнік.
Гэты зялёны прастакутнік знаходзіцца ўсяго ў 3 пікселяў у шырыню, так што тое, што мы павінны зрабіць,
каб пераканацца, што выява дзеліцца на 4 шырокі дадаць у дадатковых накладак.
І так, то гэта, як вы бачыце гэтыя 0s тут.
Гэта на самай справе будзе вынік вашай Resize PSET,
па сутнасці прымаючы невялікія растравыя, а затым павялічваючы яго на 4.
І што ж мы бачым, што на самой справе гэта выява знаходзіцца ў 12 пікселяў у шырыню, але 12 з'яўляецца кратным 4,
і таму мы на самай справе не бачу ніякай 0s ў канцы, таму што не трэба дадаваць
таму што ён цалкам запаўняецца. Ён не мае больш месца.
>> Добра. Любыя пытанні аб абіўка?
Добра. Cool.
>> Як я згадваў раней, растравыя выявы проста паслядоўнасць байтаў.
І тое, што ў нас ёсць, замест таго, каб адсочваць, якія менавіта ліку байт
адпавядае пэўнаму элементу, мы фактычна стварылі структуру для прадстаўлення гэтага.
Такім чынам, што мы маем RGBTRIPLE структуры.
Кожны раз, калі ў вас ёсць асобнік RGB тройкі,
таму што гэта тыпу вызначаюць структуру, то вы можаце атрымаць доступ да rgbtBlue зменнай,
Аналагічна зялёны і чырвоны зменных, у якім будзе пазначана, колькі сіняга, зялёнага і чырвонага,
адпаведна, у вас ёсць.
>> Так што, калі ў нас ёсць сіняя набор зменных 0, зялёныя ўстаноўлена далей,
, Што з'яўляецца максімальным значэннем вы можаце мець, а затым чырвоны пераменная ўстаноўлена ў 0,
Затым, якога колеру будзе гэтая тройка RGB ўяўляюць? >> [Студэнт] Green.
Зялёны. Менавіта так.
Гэта будзе карысна ведаць, што кожны раз, калі ў вас ёсць асобнік RGB тройкі,
Вы можаце фактычна атрымаць доступ колькасць кветак - сіні, зялёны і чырвоны - асобна.
>> Цяпер, калі мы казалі аб структуры, давайце зірнем на файл BMP.
Гэтыя структуры для вас.
Тут мы маем BITMAPFILEHEADER структуры.
Цікавым з'яўляецца той памер.
Пазней, у нас ёсць інфармацыя загалоўка, які мае некалькі рэчаў, якія цікавыя для нас,
а менавіта: памер, шырыню і вышыню.
Як мы пойдзем у пазней, калі вы праглядаеце ў ў файл,
ён аўтаматычна счытвае, таму што мы стварылі, каб быць тое ж самае.
Так biSize будзе ўтрымліваць права байт, якія адпавядаюць фактычным памерам малюнка.
А то вось, нарэшце, як мы ўжо казалі, у нас ёсць RGBTRIPLE ЬурейеЕ структуры.
У нас ёсць rgbtBlue, зялёны і чырвоны, звязаных з ім.
>> Вялікі. Добра.
Цяпер, калі мы разумеем, растравыя выявы трохі, разумеем, што ў нас ёсць файл загалоўка
і інфармацыя загалоўкаў, звязаных з ім, а затым пасля гэтага, у нас ёсць цікавыя рэчы
кветак, і гэтыя колеры прадстаўлены RGBTRIPLE структуры,
а тыя, у сваю чаргу, ёсць тры значэння, звязаныя з сіняга, зялёнага і чырвонага.
>> Такім чынам, зараз мы можам выгляд думаеце пра Аднаўленне няшмат.
Выбачайце. Падумайце аб тым, дэтэктыўны раман.
Калі ў нас ёсць ключ файл, тое, што мы хочам зрабіць, гэта прачытаць у яе піксель за пікселем
а то як-то змяніць тыя пікселі, так што мы можам вывесці яго ў зручным для чытання фармаце.
І так, каб вывесьці яго, мы збіраемся напісаць піксель за пікселем ў verdict.bmp файл.
Гэта збольшага многае зрабіць. Мы разумеем, што.
Такім чынам, што мы зрабілі, мы фактычна даў вам copy.c.
Што copy.c робіць, гэта проста робіць дакладную копію дадзенага растравы файл, а затым выводзіць яго.
Такім чынам, гэта ўжо адкрывае файл для вас, гаворыцца ў піксель за пікселем,
а затым запісвае яго ў ў выходны файл.
>> Давайце паглядзім на гэта.
Гэта забеспячэнне належнага выкарыстання,
атрыманне файлаў тут.
Што гэта робіць ён задае ўваходны файл, тое, што мы прайшлі ў Расіі ў входной_файл тут,
якая з'яўляецца нашым другі аргумент каманднага радка.
Праверак, каб пераканацца, што мы можам адкрыць файл.
Правярае, каб пераканацца, што мы можам зрабіць новы выхадны файл тут.
Затым, што яна робіць тут, гэта толькі ў асноўным пачынае чытаць, каб растравы файл з самага пачатку.
У пачатку, як мы ведаем, утрымлівае BITMAPFILEHEADER,
і таму гэтыя паслядоўнасці бітаў будзе наўпрост запоўніць BITMAPFILEHEADER.
Такім чынам, што мы маем тут кажуць, што BITMAPFILEHEADER BF -
Гэта наша новая пераменная тыпу BITMAPFILEHEADER -
мы збіраемся пакласці ўнутр BF тое, што мы чытаем у паказальнік, які з'яўляецца нашым INFILE.
Колькі мы чытаем?
Мы чытаем у колькі байт мы павінны ўтрымлівацца ўсе BITMAPFILEHEADER.
Акрамя таго, гэта тое, што мы робім для інфармацыі загалоўка.
Такім чынам, мы працягваем ўздоўж нашага файла ў INFILE,
і мы чытаем гэтыя біты і байты, і мы падлучыць іх непасрэдна ў
у гэтых выпадках зменныя, якія мы робім.
Тут мы толькі пераканаўшыся, што растравага малюнка растравага малюнка.
>> Цяпер у нас ёсць выхадны файл, так?
Так як ён стаіць, калі мы ствараем, гэта па сутнасці пусты.
Такім чынам, мы ў асноўным ствараем новы растравы з нуля.
Што мы робім гэта, мы павінны пераканацца, што мы капіяваны ў загалоўку файла
і інфармацыйны загаловак гэтак жа, як входной_файл мае.
Што мы робім гэта мы пішам - і памятаеце, што БФ зменную
тып BITMAPFILEHEADER, так што мы робім, мы проста выкарыстоўваем, што ўтрыманне
для запісу ў выхадны файл.
Вось, памятаю, мы гаварылі пра абіўка,
, Як гэта важна, каб пераканацца, што колькасць пікселяў, якое ў нас ёсць, кратнага 4.
Гэта вельмі карысная формула для разліку, колькі ў вас ёсць абіўка
з улікам шырыні вашага файла.
Я хачу вас, хлопцы, памятаеце, што ў copy.c у нас ёсць формула для разліку запаўнення.
Добра? Так што ўсё гэта памятаю. Вялікі.
Такім чынам, што робіць наступны copy.c ён перабірае ўсё Scanlines.
Ён праходзіць праз радкі, а затым захоўвае кожная тройка, што ён чытае
а затым запісвае яго ў выхадны файл.
Такім чынам, то тут мы чытаем толькі адзін RGB патройныя у той час,
, А затым пакласці ў той жа тройку ў выходны файл.
Хітрасць у тым, што абіўка ня RGB тройкі,
і таму мы не можам проста чытаць, што абіўка колькасць троек RGB.
Што мы павінны зрабіць, гэта на самай справе проста перамясціць нашы пазіцыі ў файле індыкатар, перарухаць курсор,
ў выглядзе прапусціць усе водступы, так што мы на наступным радку.
А тое, што гэта робіць копію паказвае вам, як вы можаце дадаць абіўка.
Такім чынам, мы падлічылі, колькі абіўка нам трэба,
так што гэта азначае, што мы павінны абіўка колькасць 0s.
Што гэта робіць цыкл, які ставіць абіўка колькасць 0s ў нашай выходной_файл.
І, нарэшце, вы зачыняеце абодва файла. Вы зачыняеце INFILE, а таксама выходной_файл.
>> Дык вось, як copy.c работ,
і гэта будзе вельмі карысна.
Замест таго каб проста на самай справе прамога капіявання і ўстаўкі
або проста гледзячы на ​​яго, і набраўшы ў тое, што вы хочаце,
Вы можаце проста хачу, каб выканаць гэтую каманду ў тэрмінале,
ср copy.c whodunit.c, які створыць новы файл, whodunit.c,
, Які змяшчае тыя ж зместу, як капіраванне робіць.
Такім чынам, што мы можам зрабіць, гэта выкарыстоўваць яго ў якасці асновы, на якой будуецца і рэдагаваць
для нашых дэтэктыўны раман файл.
>> Гэта нашы з-DOS, каб зрабіць для дэтэктыўны раман, але тое, што робіць copy.c
на самай справе клапоціцца пра большасць з іх для нас.
Так што ўсе мы павінны зрабіць, гэта змяніць наступны пікселяў па меры неабходнасці
на самай справе зрабіць файл для чытання.
Памятаеце, што для дадзенага піксела патройны, так што для дадзенай зменнай тыпу RGBTRIPLE,
Вы можаце атрымаць доступ сінія, зялёныя і чырвоныя значэння.
Гэта збіраецца спатрэбяцца, таму што, калі вы можаце атрымаць да іх доступ,
гэта азначае, што вы таксама можаце праверыць іх,
і гэта азначае, што вы таксама можаце змяніць іх.
>> Таму, калі мы вярнуліся ў наш чырвона напрыклад павелічальнае шкло,
У асноўным, гэта дзейнічае як свайго роду фільтр для нас.
Такім чынам, што мы хочам зрабіць, гэта мы хочам, каб фільтраваць усе з троек, якія уваходзячы
Ёсць некалькі розных спосабаў зрабіць гэта.
У прынцыпе, вы можаце мець любы тып фільтра Вы хочаце.
Можа быць, вы хочаце змяніць усе чырвоныя пікселі
ці, можа быць, вы хочаце змяніць іншага колеру пікселя на іншы колер.
Гэта залежыць ад вас.
Памятаеце, што вы можаце праверыць, які колер пікселя
а затым вы можаце змяніць яго, як вы праходзіце.
>> Добра. Дык вось дэтэктыўны раман.
Як толькі вы запусціце дэтэктыўны раман, вы будзеце ведаць, хто вінаваты злачынства быў.
>> Цяпер мы збіраемся ісці змяніць.
Мы будзем яшчэ мець справу з растравых малюнкаў.
Тое, што мы збіраемся рабіць гэта мы будзем мець ўваходныя растравыя
а потым мы збіраемся прайсці ў шэраг, а затым атрымаць выхадны файл растравага
дзе гэта ў асноўным нашы входной_файл маштабуецца с.
Скажам мой файл быў толькі адзін піксель вялікі.
Тады, калі мая п было 3 гады, маштабаванне на 3, то я хацеў бы паўтарыць, што піксель п колькасць разоў,
так 3 разы, а затым і паменшыце яго 3 разы, а таксама.
Такім чынам, вы бачыце, што я яго маштабавання па вертыкалі, і па гарызанталі.
>> А то вось прыклад.
Калі ў вас ёсць п = 2, вы ўбачыце, што першы сініх пікселяў там паўтараецца два разы
гарызантальна, так і вертыкальна ў два разы.
А тое, што працягваецца, і таму ў вас ёсць прамое маштабаванне зыходнага малюнка на два.
>> Дык вось, калі б мы падрабязна псевдокод для гэтага, мы хочам адкрыць файл.
А потым, ведаючы, што калі мы вернемся сюды,
мы бачым, што шырыня выхадны файл будзе адрознівацца ад шырыні INFILE.
Што гэта значыць?
Гэта азначае, што наша інфармацыя загалоўка зменіцца.
І тое, што мы хочам зрабіць, гэта абнавіць інфармацыю загалоўка,
ведаючы, што калі мы чытаем у файлы, калі вы працуеце на copy.c рамкі,
у нас ужо ёсць пераменная, якая паказвае, які памер і таму падобныя рэчы.
Таму, як толькі ў вас ёсць, што тое, што вы можаце зрабіць, гэта змяніць гэтыя канкрэтныя зменныя.
Памятаеце, калі ў вас ёсць структура, як атрымаць доступ да пераменным ў гэтым.
Вы можаце выкарыстоўваць аператар кропкі, правільна?
Такім чынам, тое, выкарыстоўваючы гэта, вы ведаеце, што вам трэба змяніць загаловак інфармацыі.
Такім чынам, вось толькі спіс фактычных элементаў, якія будуць змены ў вашым файле.
Памер файла будзе мяняцца, малюнкі, а таксама шырыні і вышыні.
Дык вось вяртаючыся да карце растравых малюнкаў,
глядзець на гэта загаловак файла ці інфармацыя загаловак, які змяшчае гэтую інфармацыю
, А затым змяніць пры неабходнасці.
Зноў жа, кажуць CP copy.c Змена памеру.
Гэта азначае, што зараз Змена памеру ўтрымоўвае ўсе, што змяшчаецца ўнутры копію
таму што копія дае нам спосаб чытання, каб кожная радок піксель за пікселем.
Толькі цяпер, замест таго, каб проста змяняючы значэння, як мы гэта рабілі ў дэтэктыўны раман,
тое, што мы хочам зрабіць, гэта мы хочам напісаць у некалькі пікселяў
тых часоў, як наша п больш за 1.
>> Тады тое, што мы хочам зрабіць, гэта мы хочам, каб расцягнуць яго па гарызанталі на п,
а таксама расцягнуць яго па вертыкалі на п.
Як мы можам гэта зрабіць?
Скажыце ваша п 2 і ў вас ёсць гэтая дадзенага INFILE.
Курсор пачне ў першым,
і што вы хочаце рабіць, калі п 2, вы хочаце раздрукаваць у 2-х з іх.
Так што вы друкуеце ў 2 з іх.
Тады ваш курсор будзе пераходзіць да наступнага пікселя, які з'яўляецца чырвоны,
і гэта будзе раздрукаваць 2 з тых чырвоных, дадаючы яго на тое, што ён рабіў раней.
Затым курсор перамяшчаецца да наступнага пікселяў і зрабіць у 2-х з іх.
Калі вы паглядзіце на copy.c рамкі, што яна робіць тут
яно стварае новы асобнік RGB тройка, новая пераменная называецца тройка.
А вось калі ён чытае ў ёй, ён чытае з INFILE 1 RGBTRIPLE
і захоўвае яго ўнутры, што трайная зменнай.
І тады ў вас сапраўды ёсць зменная, якая прадстаўляе канкрэтнага пікселя.
Затым, калі вы пішаце, што вы можаце зрабіць, гэта зачыняць FWRITE заяву ў цыкл
, Які запісвае яго ў свае выходной_файл столькі разоў, колькі неабходна.
Гэта досыць проста.
Проста ў асноўным, паўтараюць працэс напісання п колькасць разоў маштабаваць яго па гарызанталі.
>> Але тады мы павінны памятаць, што нашы абіўка будзе мяняцца.
Раней, скажам, у нас было нешта даўжыні 3.
Тады мы проста дадамо ў тым, колькі абіўка? Яшчэ адзін, каб зрабіць яго кратным 4.
Але сказаць, што мы маштабавання дадзенага малюнка, п = 2.
Такім чынам, колькі сініх пікселяў б мы ў канцы? Мы б 6.
1, 2, 3, 4, 5, 6. Добра.
6 не кратна 4. Што бліжэйшага ліку, кратнага 4? Гэта будзе 8.
Такім чынам, мы фактычна будзем мець 2 сімвала абіўка там.
>> Хто-небудзь памятае, калі ў нас ёсць формула для разліку абіўка
і дзе гэта можа быць?
[Неразборліва адказ студэнта] >> Так, copy.c. Права.
Існуе формула ў copy.c палічыць, колькі ў вас ёсць абіўка
дадзенай канкрэтнай шырыні растравых малюнкаў.
Такім чынам, што гэта будзе карысна, калі трэба дадаць пэўную колькасць абіўка
на самай справе высветліць, колькі абіўка вам трэба дадаць.
Але, звярніце ўвагу, аднак, тое, што вы хочаце, каб пераканацца, што вы выкарыстоўваеце правільны памер.
Толькі будзьце асцярожныя, таму што вы ў асноўным будзем мець справу з двума растравых малюнкаў.
Вы хочаце, каб пераканацца, што вы выкарыстоўваеце правільны.
Калі вы разліку абіўка для выхаднога файла, які вы жадаеце выкарыстоўваць шырыню выходной_файл
, А не шырыні папярэдняга.
>> Вялікі. Такое клапоціцца аб расцяжэнні цэлым растравага малюнка па гарызанталі.
Але тое, што мы хочам зрабіць, на самай справе расцягнуць яго як вертыкальна, так.
Гэта будзе крыху больш складана, таму што калі мы скончылі капіяванне радкоў
і пісаць гэты радок, наш курсор будзе ў канцы.
Такім чынам, калі мы чытаем зноў, то яна проста будзе чытаць у наступным радку.
Такім чынам, што мы хочам зрабіць, гэта выгляд знайсці спосаб капіявання гэтых радкоў зноў
ці проста выгляд, што прымае радок, а затым перапісваць яго зноўку.
Як я накшталт згадваў, існуе некалькі розных спосабаў зрабіць гэта.
Што вы можаце зрабіць, гэта, як вы праходзіце праз чытанне і асабліва Scanline
і змяняючы яе па меры неабходнасці, то выгляд крамы ўсе гэтыя пікселі ў масіве.
Тады ў далейшым вы ведаеце, што вам трэба раздрукаваць гэты масіў зноў,
і таму вы можаце проста выкарыстоўваць гэты масіў, каб зрабіць гэта.
Яшчэ адзін спосаб зрабіць гэта можна скапіяваць на адзін радок ўніз,
разумею, што вам неабходна скапіяваць гэта зноў, так на самай справе, навядзіце курсор,
і гэта будзе метадам FSEEK.
Вы можаце перамясціць курсор ўсе шляхі назад і паспрабуйце працэс капіявання зноў.
>> Так што, калі наша маштабавання ліку п, то колькі разоў мы павінны вярнуцца
і перапісаць лінію? >> [Студэнт] п - 1. >> Так, цалкам. п - 1.
Мы зрабілі гэта адзін раз ужо, так што потым мы хочам паўтарыць працэс вяртання
п - 1 колькасць разоў.
Добра. Так што ў вас ёсць функцыі змены памеру.
>> Цяпер мы можам патрапіць у вельмі цікавае, мой каханы PSET, які з'яўляецца аднаўленне.
Замест таго, растравыя малюнкі, на гэты раз мы маем справу з JPEG.
Мы фактычна не даў свой файл, проста з JPEG,
нам даюць у асноўным сырой фармат карт памяці.
І таму яна ўтрымлівае трохі інфармацыі і смецця значэння ў пачатку,
а затым ён пачынае і мае кучу файлаў JPEG.
Тым не менш, мы ўручылі карту, дзе мы выдалілі фатаграфіі;
па сутнасці, мы забыліся, дзе фатаграфіі знаходзяцца ў межах карты.
Дык вось наша задача ў Аднаўленне павінен прайсці праз гэтую карту фармату
і знайсці гэтыя фатаграфіі яшчэ раз.
>> На шчасце, структура файлаў JPEG і картатэкі трохі карысным.
Гэта, безумоўна, магло б быць крыху больш складана, калі б не было ў дадзеным фармаце.
Кожны файл JPEG на самай справе пачынаецца з двух магчымых паслядоўнасцяў, пералічаных вышэй.
У асноўным, калі ў вас ёсць новы файл JPEG,
яна пачынаецца альбо з паслядоўнасцю FFD8 ffe0 ці іншай, FFD8 ffe1.
Іншая карысная рэч, каб ведаць, што выявы ў фармаце JPEG захоўваюцца бесперапынна.
Таму, калі адзін файл JPEG сканчаецца, а другі пачынаецца.
Так што гэта не любыя прамежкавыя значэння там.
Калі вы дабярэцеся да пачатку JPEG, калі вы ўжо чыталі JPEG,
Вы ведаеце, што вы патрапілі ў канец папярэдняга і пачатак наступнага.
>> Для выгляду візуалізаваць гэта, я зрабіў схему.
Яшчэ адна рэч, аб фармаце JPEG, што мы можам чытаць іх у паслядоўнасці 512 байт за адзін раз,
Аналагічна з пачаткам карт.
Мы не трэба правяраць кожны байт, таму што гэта адстой.
Таму замест таго, што мы можам зрабіць на самай справе толькі што прачытаў у 512 байт, у той час,
, А затым, замест праверкі ў паміж тымі, хто гэтыя маленькія кавалачкі,
мы можам проста праверыць пачатку 512 байт.
Па сутнасці, у гэтай карціне, што вы бачыце ў пачатку карты,
ў вас ёсць каштоўнасці, якія на самай справе не якія адносяцца да фактычным фармаце JPEG сябе.
Але тое, што ў мяне ёсць зоркі, каб паказаць адно з двух зыходных паслядоўнасцяў для JPEG.
Таму, калі вы бачыце зоркі, вы ведаеце, што ў вас ёсць файл JPEG.
А потым кожны файл JPEG будзе кратным 512 байт
але не абавязкова тое ж самае некалькі.
Такім чынам, што вы ведаеце, што вы патрапілі іншага JPEG, калі вы націснеце іншую зорку,
іншы, пачынаючы паслядоўнасць байтаў.
А што ў вас тут у вас ёсць файл JPEG чырвонай працягваецца, пакуль вы націснеце зоркі,
пра што сведчыць новы колер.
Вы працягваеце, а затым вы трапляеце іншай зоркі, вы патрапілі іншага JPEG,
Вы працягваеце ўвесь шлях да канца.
Вы знаходзіцеся на апошняй карціны тут, ружовы.
Вы ісці да канца, пакуль не ўпрэцца ў канец файла характар.
Гэта будзе вельмі карысна.
>> Некалькі асноўны вынас тут:
Картатэцы не пачынаецца з JPEG,
але як толькі пачынаецца JPEG, ўсе выявы ў фармаце JPEG захоўваюцца бок аб бок адзін з адным.
>> Некаторыя псевдокод для аднаўлення.
Па-першае, мы збіраемся адкрыць нашу картатэку,
і гэта будзе з дапамогай нашага файлавага ўводу / высновы.
Мы збіраемся паўтарыць наступны працэс, пакуль мы не дасягнулі канца файла.
Мы збіраемся чытаць 512 байт за адзін раз.
І тое, што я сказаў тут, што мы збіраемся захоўваць яго ў буфер,
так у асноўным трымацца за тых 512 байт, пакуль мы дакладна ведаем, што з імі рабіць.
Тады тое, што мы хочам зрабіць, гэта мы хочам праверыць, ці можам мы патрапілі зорка ці не.
Калі мы патрапілі зоркі, калі б мы трапілі аднаго з зыходных паслядоўнасцяў,
Затым мы ведаем, што мы патрапілі ў новы файл JPEG.
Што мы хочам зрабіць, гэта мы збіраемся хочаце стварыць новы файл у нашым каталогу pset4
працягваць рабіць, што файл.
А акрамя таго, калі мы ўжо зрабілі JPEG і раней,
Затым мы хочам скончыць гэты файл і падштурхнуць яе да pset4 тэчку,
дзе мы будзем мець, што файл захоўваецца, таму што калі мы не паказваем, што мы скончылі, што JPEG файлаў,
тады мы будзем у асноўным маюць нявызначаную суму. JPEG, ніколі не скончыцца.
Такім чынам, мы хочам пераканацца, што, калі мы чытаем у ў файл JPEG і пісаць, што,
Мы хочам адмыслова блізка, што для таго, каб адкрыць наступную.
Мы хочам праверыць некалькі рэчаў.
Мы хочам праверыць, знаходзімся мы ў пачатку новага JPEG з нашым буферам
а таксама, калі мы ўжо знайшлі JPEG да
таму што гэта зменіць ваш працэс няшмат.
Так вось пасля таго як вы прайсці ўвесь шлях і вы патрапілі ў канец файла,
тое, што вы хочаце зрабіць, вы хочаце, каб закрыць усе файлы, якія ў дадзены момант адкрыты.
Гэта, верагодна, будзе апошні файл JPEG, што ў вас ёсць,
а таксама картатэкі, што вы займаліся.
>> Апошняе перашкода, якое нам трэба было вырашыць, як на самой справе зрабіць файл JPEG
і як на самой справе штурхаць яго ў тэчку.
PSET патрабуе, каб кожны JPEG, што вы знайшлі б у наступным фармаце,
дзе ў вас ёсць нумар. JPG.
Нумар, нават калі гэта 0, мы называем гэта 000.jpg.
Кожны раз, калі вы знаходзіце JPEG ў праграму,
Вы збіраецеся хочаце назваць яго ў парадак, у якім ён быў знойдзены.
Што гэта значыць?
Мы павінны выгляду адсочваць, як шмат мы знайшлі
і тое, што колькасць кожнага JPEG павінна быць.
Тут мы збіраемся скарыстацца Sprintf функцыі.
Як і ў Printf, якія толькі часткова адбіткі значэння з у тэрмінал,
Sprintf друкуе файл з ў тэчку.
І што ж гэта будзе рабіць, калі ў мяне было Sprintf, назва, а затым радок ёсць,
было б раздрукаваць 2.jpg.
Калі выказаць здагадку, што я зачыніў файлы правільна,
, Які будзе ўтрымліваць файл, які я пісала з.
Але справа ў тым, што код, які я тут
не цалкам задавальняе тое, што PSET патрабуецца.
PSET патрабуе, каб другі файл JPEG павінны быць названыя 002, а не толькі 2.
Таму, калі вы друкуеце з назвы, то, магчыма, вы захочаце змяніць запаўняльнік няшмат.
>> Хто-небудзь памятае, як мы дазволіць лішнія прабелы, калі мы нешта надрукаваць?
Так. >> [Студэнт] Вы ставіце 3 паміж знакам адсотка і 2. >> Так, цалкам.
Вы будзеце ставіць 3 у дадзеным выпадку, таму што мы хочам прастору для 3.
% 3d, верагодна, дасць вам 002.jpg замест 2.
Першы аргумент у Sprintf функцыі на самай справе масіў сімвалаў,
якія мы раней ведалі як радка.
Тыя, воля, выгляд больш падобны на часовае захоўванне, проста захоўваць выніковую радок.
Вы не будзеце сапраўды мець справу з гэтым, але вы павінны ўключыць яго.
>> Ведаючы, што кожнае імя файла мае нумар, які займае тры сімвала,
і потым. JPG, як доўга гэты масіў можа быць?
Выкіньце нумар. Колькі знакаў у загалоўку, у назве?
Такім чынам, ёсць 3 хэштэгу, перыяд, JPG. >> [Студэнт] 7. >> 7. Не зусім.
Мы збіраемся хочам 8, таму што мы хочам, каб забяспечыць нулявы тэрмінатар, а таксама.
>> Нарэшце, каб выцягнуць працэс, што вы будзеце рабіць для аднаўлення,
ў вас ёсць пачатак інфармацыі.
Вы працягваеце, пакуль не знойдзеце пачатку файла JPEG,
і гэта можа быць альбо адзін з двух стартавых паслядоўнасцяў.
Вы працягвайце чытаць. Кожная рыса тут прадстаўляе 512 байт.
Вы працягвайце чытаць, працягвайце чытаць, пакуль вы не сутыкаецеся іншы пуску.
Калі ў вас ёсць, што вы ў канчатковым бягучага JPEG - у дадзеным выпадку, гэта чырвоны,
так што вы хочаце, каб пакончыць з гэтым.
Вы хочаце, каб Sprintf імя, што ў вашай тэчцы pset4,
то вы хочаце, каб адкрыць новую JPEG, а затым працягвайце чытаць
пакуль вы не сутыкаецеся наступным.
Чытайце далей, працягвайце чытанне,
і, нарэшце, у рэшце рэшт, вы збіраецеся дасягнуць да канца файла,
і так што вы хочаце, каб закрыць апошнюю JPEG, што вы працуеце,
Sprintf, што ў вашым pset4 тэчку, а затым паглядзець на ўсе фатаграфіі, якія вы атрымалі.
Тыя малюнкі, на самай справе фатаграфій CS50 персаналу,
і так гэта калі частка бонуса задавальненне ад PSET прыходзіць у
з'яўляецца тое, што вы соревнуетесь у раздзелах знайсці ТФ ў фатаграфіі
і сфатаграфавацца з імі, каб даказаць, што вы зрабілі PSET
і таму вы можаце ўбачыць, якія супрацоўнікі маюць у сваіх карцінах.
І тады вы робіце здымкі з персаналам. Часам вам давядзецца гнаць іх ўніз.
Верагодна, некаторыя з іх будуць спрабаваць ўцячы ад вас.
Вы сфатаграфавацца з імі.
Гэта працягваецца. Гэта не з-за калі PSET звязана.
Тэрміны будуць абвешчаныя ў спецыфікацыі.
Тады разам з часткі, у залежнасці ад часткі прымае самы фатаграфій
з самага супрацоўнікаў пераможа даволі дзіўны прыз.
Гэта свайго роду стымул, каб атрымаць pset4 завершана як мага хутчэй
таму што тады вы можаце прыступіць да справы
паляванне на ўсе розныя CS50 супрацоўнікаў.
Гэта не абавязкова, хоць, так што як толькі вы атрымаеце фатаграфіі,
Затым вы скончыце з pset4.
>> І я скончыў з Пакрокавае кіраўніцтва 4, так што дзякуй усім, хто прыйшоў.
Поспехаў вам у крыміналістыцы. [Апладысменты]
[CS50.TV]