[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 буде наш вихідний файл.
Таким чином, він збирається створити нову растрових зображень схожий на ключі один
крім як в зручному для читання форматі, де ми можемо побачити сховане повідомлення.
>> Оскільки ми збираємося мати справу з редагування і роботи з растровими зображеннями якийсь,
ми збираємося виду занурення в в структурі цих растрових файлів.
Ми пішли на це небагато в лекції, але давайте подивимося на них ще трохи.
Растрові зображення, по суті тільки розташування байтів
де ми вказали, які байти означає, що.
Так от ніби як карту растрових зображень
кажуть, що вона починається з деякого файли заголовків, починає з деякою інформацією в там.
Ви бачите, що близько Байт номер 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]