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