>> [Музика грає]
>> 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, і це було детективний роман.