[Музика грає] ZAMYLA Чан: Це була міс Скарлетт з підсвічником. Детективний роман? Ну, ми збираємося з'ясувати. У настільної гри Clue, ви, можливо, бути приділена фізичної червоний зображення. І, що зображення дуже корисний і плямисті, і ваше завдання, щоб виявити приховані повідомлення. І, як правило, ви забезпечені червоний збільшувальне скло, або червоний екран показують, що приховане послання. Ну, ми збираємося, щоб імітувати, що. У детективний роман, вам дають растрове зображення , Який виглядає дуже плямистим і червоний, а потім запустити програму детективний роман виявити приховане повідомлення. Так давайте розберемо це в кроків. По-перше, ви хочете, щоб відкрити файл - ознака того, що ви отримали. А потім ще й створити Вирок растровий файл. Тоді ви хочете оновити растрове зображення заголовок інформацію для Вирок OUTFILE. Детальніше про це пізніше. А потім ви збираєтеся читати в ключ, Scanline, піксель за пікселем, зміни кольору пікселів, як необхідно, і лист ті, у вироку - піксель за пікселем в Вирок Scanline. Як ми починаємо йти з цього приводу? Ну, на щастя, у нас є copy.c в коді розподілу. І це збирається довести досить корисні для нас. Copy.c відкриває файл, зчитує, що Тема INFILE, а потім оновлює Тема OUTFILE в. А потім він читає кожен піксель в Scanline, піксель за пікселем, а потім пише, що піксель у вихідний файл. Отже, ваш перший крок міг би в тому, щоб запустити наступне Команда в терміналі - ср copy.c whodunit.c. Це створить копію copy.c імені whodunit.c. Таким чином, наш перший крок, щоб відкрити файл, ну, є точна копія, що в copy.c. Тому я залишаю вас подивитися на це. Те, що ми маємо справу з таким PSET буде файловий ввід / вивід, в основному приймаючи файли, читання, письмо, їх редагування. Як ви вперше відкриваєте файл? Ну, ви збираєтеся оголосити файл покажчик, а потім ви називаєте Функція Еореп. Перейдіть в дорозі, або ім'я, що файл, а потім режим, який ви хочете для відкриття цього файлу дюйма Пас в г відкриє foo.bmp для читання. У той час як Еореп з проходженням в З будуть відкритий bar.bmp, для запису файлу і насправді редагування. Так що тепер ми відкрили файл, наш Наступним кроком є ​​оновлення інформації заголовка для OUTFILE. Що таке інформаційна заголовок? Ну, по-перше, ми повинні знати, що растрове зображення. Растрове зображення простий розташування байтів. І вони оголошені в цьому файлі тут, bmp.h, з купою Інформація про те, що растрове зображення насправді складається з. Але те, що ми дійсно дбаємо про те, заголовок графічного файлу, прямо тут, і растровое інформації заголовка, тут. Заголовок складається з декількох змінні, які виявляться дуже корисними. Існує biSizeImage, яка є Загальний розмір зображення в байтах. І це включає в себе пікселів і відступи. Заповнення дуже важливо, але ми повернемося до цього пізніше. BiWidth представляє ширину зображення в пікселях мінус заповнення. BiHeight потім також висота зображення в пікселях. І тоді BITMAPFILEHEADER і BITMAPINFOHEADER, як я вже говорив раніше, тих, представлені як структури. Таким чином, ви не можете отримати доступ заголовок файлу Сам, але ви хочете, щоб дістатися до ці змінні всередині. ОК. Так як же ми оновлюємо інформацію заголовка? Ну, по-перше, ми повинні бачити чи ми потрібно змінити будь-яку інформацію від вхідний_файл, ключ, щоб вихідний_файл, вирок. Що-небудь змінюється в цьому випадку? Ну, насправді не, тому що ми збираємося бути тільки змінюючи кольору. Ми не збираємося бути зміни файлу розмір, розмір зображення, ширина, або висота. Так що ти в порядку на даний момент по просто копіювання кожного пікселя. ОК. А тепер давайте подивимося, як ми насправді можете прочитати кожен піксель з файлу. Ще один файл функція введення / виведення вступить в гру - FREAD. Вона займає в покажчик на структури , Який буде містити байти, ви читаєте. Таким чином, ви читаєте в це. А потім ви проходите в розмірі, який є розмір кожного елемента, який ви хочете читати. Тут функція SizeOf знадобиться. Потім проходите в числа, які означає кількість елементів Розмір читати. І, нарешті, inptr, який файл покажчик, який ви буду читати с. Так всі ці елементи знаходяться всередині inptr і вони збираються даних. Давайте подивимося на невеликий приклад. Якщо я хочу прочитати в даних двох собак, ну, я можу зробити це одним із двох способів. Я можу або читати в двох об'єктів розміром собака з моєї inptr, або я можу читати в одному об'єкті розмір двох собак. Отже, ви бачите, що залежно від способу що ви влаштовуєте розмір і кількість, вам можна прочитати в те ж число байтів. Так що тепер, давайте змінимо кольору пікселя, як нам потрібно. Якщо ви подивитеся на bmp.h знову, то ви побачите, що на дні RGBTRIPLEs є ще одним структура, де вони складаються з трьох байтів. Один з них, rgbtBlue, rgbtGreen і rgbtRed. Таким чином, кожен з них являє собою суму блакиті, кількість зеленим, а кількість червоного всередині цього пікселя, де кожна сума представлена шістнадцяткове число. Так ff0000 буде синій колір, тому що він йде від синього, на зелений, на червоний. А потім все е буде білий. Давайте поглянемо на smiley.bmp, який у вас є у вашому коді розподілу. Якщо ви відкриєте його в просто зображення глядач, то ви будете просто бачите червоний смайлик. Але, приймаючи більш глибоке занурення в, ми будемо бачити, що структура з це всього лише пікселів. У нас є білі пікселі, а потім червоні пікселів. Білий, FFFFFF, а потім все червоні пікселів Я пофарбовані в для вас тут, і ви бачите, що вони 0000ff. Нульовий синій, нульовий зелений і повний червоний. А так як смайлик у вісім пікселів в ширину, ми не маємо ніякого заповнення. Добре. Так що, якщо б я мав призначити різні значення до RGBTRIPLE, і я хотів зробити його зеленим, то, що я хотів би зробити це Я б оголосити RGBTRIPLE, названий потрійний, а потім, щоб отримати доступ кожен байт в межах цієї структури I буде використовувати оператор точки. Так triple.rgbtBlue, я можу призначати що в 0. Зелений я можу призначити його на повний - будь число, дійсно, від 0 до FF. А потім червоний, я також збираюся сказати 0. Отже, що дає мені зелений піксель. Далі, те, що, якщо я хочу, щоб перевірити значення чогось? Я міг мати те, що перевіряє Чи має значення rgbtBlue потрійний є і далі, а потім роздрукувати, "Я відчуваю себе синій ", в якості результату. Тепер, це не обов'язково означає, що піксель синього кольору, чи не так? Тому що зелені та червоні значення пікселя також може мати трохи-0 значення. Все, що це означає, і все, що це перевірка на це для повного синього кольору. Але всі пікселі також може мати часткове колірні значення, як це Наступний приклад тут. Це трохи складніше побачити що цей образ зараз. Це виглядає трохи більше, як clue.bmp, що вам буде надана. Тепер, фізично, ви можете вирішити цю проблему, тому що є багато корисного, по піднявши червоний екран з зображенням так які можуть з'явитися інші кольори. Так як же нам імітувати це з с? Ну, ми могли б видалити всі червоні із зображення повністю. І так робити, що ми кожного набір червоний значення пікселя в 0. І тому зображення буде виглядати трохи трохи, як це, де нас немає ніякої червоний б то не було. Ми можемо побачити прихований повідомлення про трохи більш ясно тепер. Це ще один смайлик. Або, може бути, ми могли б використовувати інший метод. Може бути, ми могли б визначити всі червоні пікселів - тобто, всі пікселі з 0 синій, 0 зелений, і 0 червоний - і змінити ті на білий. І наше зображення може виглядати щось на зразок цього. Трохи легше побачити. Є багато інших способів розкрити Секретне повідомлення, а також, справа з колірною маніпуляції. Може бути, ви могли б використовувати один з методів що я вже згадував вище. І крім того, ви можете для підвищення деяких квітів і притягнути винних поза. Так що тепер ми змінили піксель колір, потім ми просто потрібно записати їх в до рядка розгорнення, піксель за пікселем. І ще раз, ви хочете, щоб озирнутися назад щоб copy.c, якщо ви не скопіювали це вже, і подивитися на FWRITE Функція, яка приймає дані, покажчик до структури, яка містить байт що ви читаєте з, розміру елементи, кількість елементів, а потім outptr - призначення цих файлів. Після написання в пікселях, ви будете також повинні написати в оббивці. Що таке оббивка? Ну, кожен rgbt пікселів три байта. Але, Scanline для растрового зображення Повинно бути кратна чотирьом байтам. І якщо кількість пікселів НЕ кратно чотирьом, то нам потрібно додати це оббивка. Заповнення просто представлена ​​0s. Отже, як ми пишемо, або читати це? Ну, виходить, що ви не можете фактично FREAD оббивка, але ви можете обчислити його. У цьому випадку, ключ і вирок мають однакову ширину, так оббивка те ж саме. І оббивка, як ви побачите в copy.c, розраховується з наведеної нижче формулою - bi.biWidth раз SizeOf (RGBTRIPLE) буде дати нам, скільки байтів BMP має в кожному рядку. Звідти, модулів і відрахування з 4 можна розрахувати як кількість байтів повинні бути додані так, щоб кратним байт на кожна рядок є чотири. Тепер, коли у нас є формула для скільки оббивка нам потрібно, тепер ми можемо записати його. Тепер, я вже говорив, оббивка знаходиться всього 0s. Так що в цьому випадку ми просто покласти символ, в даному випадку 0, в нашій outptr - наш вихідний файл. Так що може бути просто fputc 0, кома outptr. Так, в той час як ми читали в наших , Файл введення / виведення стежив за нашою Положення в цих файлах з чимось називається індикатор позиції файлу. Думайте про нього, як курсор. В основному, це кошти, кожен раз, коли що ми FREAD, але у нас є контроль над ним, теж. Для переміщення індикатор позиції файлу, Ви можете використовувати функцію FSEEK. Де inptr представляє файл покажчик, який ви шукаєте в, сума кількість байт, що ви хочете, щоб перемістити курсор, а потім з відноситься до опорної точці звідки курсор знаходиться. Якщо ви передаєте в SEEK_CUR, що являє собою струм положення у файлі. Або ви можете використовувати деякі інші параметри. Таким чином, ми, можливо, захочете використовувати FSEEK пропустити над прокладанням файлу в. І знову ж, якщо ви застрягли, є приклад, що в copy.c. Так що тепер ми відкрили файл, розгадка, і вирок. Ми оновили інформацію заголовка для наш вердикт, тому що кожен бітова карта потребує заголовок. Ми то читайте в розгадка'S Scanline, піксель за пікселем, зміна кожен колір у міру необхідності, і писати ті, в Вирок, піксель за пікселем. Як тільки ви відкриваєте вирок, ви можете бачити, хто злочинець, або в чому секрет повідомлення. Мене звуть Zamyla, і це було детективний роман.