1 00:00:00,000 --> 00:00:09,500 >> [Музыка играет] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA Чан: Это была мисс Скарлетт с подсвечником. 3 00:00:12,350 --> 00:00:13,560 Детективный роман? 4 00:00:13,560 --> 00:00:15,030 Ну, мы собираемся выяснить. 5 00:00:15,030 --> 00:00:20,870 В настольной игры Clue, вы, возможно, быть уделено физической красный изображение. 6 00:00:20,870 --> 00:00:24,120 И, что изображение очень красный и пятнистые, и ваша задача, чтобы 7 00:00:24,120 --> 00:00:25,490 выявить скрытые сообщения. 8 00:00:25,490 --> 00:00:29,740 И, как правило, вы обеспечены красный увеличительное стекло, или красный экран 9 00:00:29,740 --> 00:00:31,410 показывают, что скрытое послание. 10 00:00:31,410 --> 00:00:33,340 Ну, мы собираемся, чтобы имитировать, что. 11 00:00:33,340 --> 00:00:37,960 >> В детективный роман, вам дают растровое изображение , который выглядит очень пятнистым и красный, 12 00:00:37,960 --> 00:00:43,430 а затем запустить программу детективный роман выявить скрытое сообщение. 13 00:00:43,430 --> 00:00:45,650 >> Так давайте разберем это в шагов. 14 00:00:45,650 --> 00:00:50,390 Во-первых, вы хотите, чтобы открыть файл - признак того, что вы получили. 15 00:00:50,390 --> 00:00:53,880 А потом еще и создать Приговор растровый файл. 16 00:00:53,880 --> 00:00:58,240 Тогда вы хотите обновить растровое изображение заголовок информацию для Приговор OUTFILE. 17 00:00:58,240 --> 00:00:59,920 Подробнее об этом позже. 18 00:00:59,920 --> 00:01:04,319 А потом вы собираетесь читать в ключ, Scanline, пиксель за пикселем, 19 00:01:04,319 --> 00:01:07,320 изменения цвета пикселей, как необходимо, и письмо 20 00:01:07,320 --> 00:01:08,960 те, в приговоре - 21 00:01:08,960 --> 00:01:12,000 пиксель за пикселем в Приговор Scanline. 22 00:01:12,000 --> 00:01:13,780 >> Как мы начинаем идти по этому поводу? 23 00:01:13,780 --> 00:01:16,940 Ну, к счастью, у нас есть copy.c в коде распределения. 24 00:01:16,940 --> 00:01:21,240 И это собирается доказать весьма полезны для нас. 25 00:01:21,240 --> 00:01:29,700 Copy.c открывает файл, считывает, что Заголовок INFILE, а затем обновляет 26 00:01:29,700 --> 00:01:31,070 Заголовок OUTFILE в. 27 00:01:31,070 --> 00:01:37,010 А потом он читает каждый пиксель в Scanline, пиксель за пикселем, а затем 28 00:01:37,010 --> 00:01:42,390 пишет, что пиксель в выходной файл. 29 00:01:42,390 --> 00:01:45,020 >> Итак, ваш первый шаг мог бы в том, чтобы запустить следующее 30 00:01:45,020 --> 00:01:46,420 Команда в терминале - 31 00:01:46,420 --> 00:01:50,270 ср copy.c whodunit.c. 32 00:01:50,270 --> 00:01:55,320 Это создаст копию copy.c имени whodunit.c. 33 00:01:55,320 --> 00:01:58,320 Таким образом, наш первый шаг, чтобы открыть файл, ну, есть точная 34 00:01:58,320 --> 00:02:00,070 копия, что в copy.c. 35 00:02:00,070 --> 00:02:03,360 Поэтому я оставляю вас посмотреть на это. 36 00:02:03,360 --> 00:02:07,860 >> То, что мы имеем дело с таким PSET будет файловый ввод / вывод, в основном принимая файлы, 37 00:02:07,860 --> 00:02:10,229 чтение, письмо, их редактирования. 38 00:02:10,229 --> 00:02:12,650 Как вы впервые открываете файл? 39 00:02:12,650 --> 00:02:16,800 Ну, вы собираетесь объявить файл указатель, а затем вы называете 40 00:02:16,800 --> 00:02:18,670 Функция Еореп. 41 00:02:18,670 --> 00:02:23,150 Перейдите в пути, или имя, что файл, а затем режим, который вы хотите 42 00:02:23,150 --> 00:02:24,700 для открытия этого файла дюйма 43 00:02:24,700 --> 00:02:28,620 Пас в г откроет foo.bmp для чтения. 44 00:02:28,620 --> 00:02:35,670 В то время как Еореп с прохождением в З будут открыт bar.bmp, для записи файла и 45 00:02:35,670 --> 00:02:37,020 на самом деле редактирования. 46 00:02:37,020 --> 00:02:41,970 >> Так что теперь мы открыли файл, наш Следующим шагом является обновление информации заголовка 47 00:02:41,970 --> 00:02:43,230 для OUTFILE. 48 00:02:43,230 --> 00:02:44,610 Что такое информационная заголовок? 49 00:02:44,610 --> 00:02:48,160 Ну, во-первых, мы должны знать, что растровое изображение. 50 00:02:48,160 --> 00:02:51,000 Растровое изображение простой расположение байтов. 51 00:02:51,000 --> 00:02:55,480 И они объявлены в этом файле здесь, bmp.h, с кучей 52 00:02:55,480 --> 00:02:58,610 Информация о том, что растровое изображение на самом деле состоит из. 53 00:02:58,610 --> 00:03:05,730 Но то, что мы действительно заботимся о том, заголовок графического файла, прямо здесь, и 54 00:03:05,730 --> 00:03:08,460 растровое информации заголовка, здесь. 55 00:03:08,460 --> 00:03:13,170 Заголовок состоит из нескольких переменные, которые окажутся очень полезными. 56 00:03:13,170 --> 00:03:18,400 Существует biSizeImage, которая является Общий размер изображения в байтах. 57 00:03:18,400 --> 00:03:20,890 И это включает в себя пикселей и отступы. 58 00:03:20,890 --> 00:03:24,210 Заполнение очень важно, но мы вернемся к этому позже. 59 00:03:24,210 --> 00:03:30,000 >> BiWidth представляет ширину изображения в пикселях минус заполнения. 60 00:03:30,000 --> 00:03:34,220 BiHeight затем также высота изображения в пикселях. 61 00:03:34,220 --> 00:03:38,240 И тогда BITMAPFILEHEADER и BITMAPINFOHEADER, как я уже говорил 62 00:03:38,240 --> 00:03:40,900 ранее, тех, представлены как структуры. 63 00:03:40,900 --> 00:03:45,410 Таким образом, вы не можете получить доступ заголовок файла Сам, но вы хотите, чтобы добраться до 64 00:03:45,410 --> 00:03:47,370 эти переменные внутри. 65 00:03:47,370 --> 00:03:48,170 >> ОК. 66 00:03:48,170 --> 00:03:50,600 Так как же мы обновляем информацию заголовка? 67 00:03:50,600 --> 00:03:54,020 Ну, во-первых, мы должны видеть ли мы нужно изменить любую информацию от 68 00:03:54,020 --> 00:03:58,480 входной_файл, ключ, чтобы выходной_файл, приговор. 69 00:03:58,480 --> 00:04:00,250 Что-нибудь меняется в этом случае? 70 00:04:00,250 --> 00:04:04,320 Ну, на самом деле не, потому что мы собираемся быть только изменяя цвета. 71 00:04:04,320 --> 00:04:07,550 Мы не собираемся быть изменения файла размер, размер изображения, ширина, 72 00:04:07,550 --> 00:04:08,310 или высота. 73 00:04:08,310 --> 00:04:14,010 Так что ты в порядке на данный момент по просто копирование каждого пикселя. 74 00:04:14,010 --> 00:04:14,840 >> ОК. 75 00:04:14,840 --> 00:04:20,720 А теперь давайте посмотрим, как мы на самом деле можете прочитать каждый пиксель из файла. 76 00:04:20,720 --> 00:04:23,640 Еще один файл функция ввода / вывода вступит в игру - 77 00:04:23,640 --> 00:04:24,700 FREAD. 78 00:04:24,700 --> 00:04:28,440 Она занимает в указатель на структуры , который будет содержать байты, 79 00:04:28,440 --> 00:04:30,110 вы читаете. 80 00:04:30,110 --> 00:04:31,890 Таким образом, вы читаете в это. 81 00:04:31,890 --> 00:04:36,090 А потом вы проходите в размере, который является размер каждого элемента, который вы 82 00:04:36,090 --> 00:04:37,360 хотите читать. 83 00:04:37,360 --> 00:04:40,640 Здесь функция SizeOf пригодится. 84 00:04:40,640 --> 00:04:45,570 Затем проходите в числа, которые означает количество элементов 85 00:04:45,570 --> 00:04:47,480 Размер читать. 86 00:04:47,480 --> 00:04:51,180 И, наконец, inptr, который файл указатель, который вы 87 00:04:51,180 --> 00:04:52,530 буду читать с. 88 00:04:52,530 --> 00:04:58,650 Так все эти элементы находятся внутри inptr и они собираются данных. 89 00:04:58,650 --> 00:05:01,660 >> Давайте посмотрим на небольшой пример. 90 00:05:01,660 --> 00:05:07,590 Если я хочу прочитать в данных двух собак, ну, я могу сделать это одним из двух способов. 91 00:05:07,590 --> 00:05:15,250 Я могу либо читать в двух объектов размером собака из моей inptr, или я могу читать 92 00:05:15,250 --> 00:05:19,280 в одном объекте размер двух собак. 93 00:05:19,280 --> 00:05:23,580 Итак, вы видите, что в зависимости от способа что вы устраиваете размер и количество, вам 94 00:05:23,580 --> 00:05:25,840 можно прочитать в то же число байтов. 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> Так что теперь, давайте изменим цвета пиксела, как нам нужно. 97 00:05:33,020 --> 00:05:37,320 Если вы посмотрите на bmp.h снова, то вы увидите, что на дне 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs являются еще одним структура, где они состоят из трех байтов. 99 00:05:42,920 --> 00:05:49,220 Один из них, rgbtBlue, rgbtGreen и rgbtRed. 100 00:05:49,220 --> 00:05:52,480 Таким образом, каждый из них представляет собой сумму из голубой, количество зеленым, а 101 00:05:52,480 --> 00:05:57,250 количество красного внутри этого пикселя, где каждая сумма представлена 102 00:05:57,250 --> 00:05:58,670 шестнадцатеричное число. 103 00:05:58,670 --> 00:06:04,370 >> Так ff0000 будет синий цвет, потому что он идет от синего, 104 00:06:04,370 --> 00:06:05,850 на зеленый, на красный. 105 00:06:05,850 --> 00:06:09,300 А потом все е будет белый. 106 00:06:09,300 --> 00:06:13,440 Давайте взглянем на smiley.bmp, который у вас есть в вашем коде распределения. 107 00:06:13,440 --> 00:06:15,690 Если вы откроете его в просто изображение зритель, то вы будете 108 00:06:15,690 --> 00:06:17,080 просто видите красный смайлик. 109 00:06:17,080 --> 00:06:20,380 Но, принимая более глубокое погружение в, мы будем видеть, что структура 110 00:06:20,380 --> 00:06:22,340 из это всего лишь пикселей. 111 00:06:22,340 --> 00:06:25,880 У нас есть белые пиксели, а затем красные пикселей. 112 00:06:25,880 --> 00:06:31,000 Белый, FFFFFF, а затем все красные пикселей Я окрашены в для вас 113 00:06:31,000 --> 00:06:35,440 здесь, и вы видите, что они 0000ff. 114 00:06:35,440 --> 00:06:39,760 Нулевой синий, нулевой зеленый и полный красный. 115 00:06:39,760 --> 00:06:45,350 А так как смайлик в восемь пикселей в ширину, мы не имеем никакого заполнения. 116 00:06:45,350 --> 00:06:47,360 Хорошо. 117 00:06:47,360 --> 00:06:53,310 >> Так что, если бы я должен был назначить различные значения к RGBTRIPLE, и я хотел 118 00:06:53,310 --> 00:06:58,350 сделать его зеленым, то, что я хотел бы сделать это Я бы объявить RGBTRIPLE, названный 119 00:06:58,350 --> 00:07:02,660 тройной, а затем, чтобы получить доступ каждый байт в пределах этой структуры I 120 00:07:02,660 --> 00:07:04,030 будет использовать оператор точки. 121 00:07:04,030 --> 00:07:08,430 Так triple.rgbtBlue, я могу назначать что в 0. 122 00:07:08,430 --> 00:07:13,460 Зеленый я могу назначить его на полный - любой число, действительно, от 0 до FF. 123 00:07:13,460 --> 00:07:15,470 А потом красный, я также собираюсь сказать 0. 124 00:07:15,470 --> 00:07:19,160 Итак, что дает мне зеленый пиксель. 125 00:07:19,160 --> 00:07:23,030 >> Далее, то, что, если я хочу, чтобы проверить значение чего-то? 126 00:07:23,030 --> 00:07:27,250 Я мог иметь то, что проверяет ли значение rgbtBlue тройной является 127 00:07:27,250 --> 00:07:31,080 и далее, а затем распечатать, "Я чувствую себя синий ", в качестве результата. 128 00:07:31,080 --> 00:07:35,640 Теперь, это не обязательно означает, что пиксель синего цвета, не так ли? 129 00:07:35,640 --> 00:07:40,060 Потому что зеленые и красные значения пикселя также может иметь не-0 значения. 130 00:07:40,060 --> 00:07:43,470 Все, что это значит, и все, что это проверка на это 131 00:07:43,470 --> 00:07:45,610 для полного синего цвета. 132 00:07:45,610 --> 00:07:50,050 Но все пиксели также может иметь частичное цветовые значения, как это 133 00:07:50,050 --> 00:07:52,180 Следующий пример здесь. 134 00:07:52,180 --> 00:07:55,400 >> Это немного сложнее увидеть что этот образ сейчас. 135 00:07:55,400 --> 00:08:00,320 Это выглядит немного больше, как clue.bmp, что вам будет предоставлена. 136 00:08:00,320 --> 00:08:03,600 Теперь, физически, вы можете решить эту проблему, потому что есть много красного, по 137 00:08:03,600 --> 00:08:07,040 подняв красный экран с изображением так которые могут появиться другие цвета. 138 00:08:07,040 --> 00:08:10,968 Так как же нам имитировать это с с? 139 00:08:10,968 --> 00:08:15,640 Ну, мы могли бы удалить все красные с изображения полностью. 140 00:08:15,640 --> 00:08:21,870 И так делать, что мы каждый набор красный значение пикселя в 0. 141 00:08:21,870 --> 00:08:25,020 И поэтому изображение будет выглядеть немного немного, как это, где нас нет никакой красный 142 00:08:25,020 --> 00:08:26,300 бы то ни было. 143 00:08:26,300 --> 00:08:29,390 >> Мы можем увидеть скрытый сообщение об немного более ясно теперь. 144 00:08:29,390 --> 00:08:31,730 Это еще один смайлик. 145 00:08:31,730 --> 00:08:33,870 Или, может быть, мы могли бы использовать другой метод. 146 00:08:33,870 --> 00:08:36,480 Может быть, мы могли бы определить все красные пикселей - 147 00:08:36,480 --> 00:08:41,100 то есть, все пиксели с 0 синий, 0 зеленый, и 0 красный - 148 00:08:41,100 --> 00:08:43,169 и изменить те на белый. 149 00:08:43,169 --> 00:08:45,470 И наше изображение может выглядеть что-то вроде этого. 150 00:08:45,470 --> 00:08:48,250 Немного легче увидеть. 151 00:08:48,250 --> 00:08:51,170 >> Есть много других способов раскрыть Секретное сообщение, а также, 152 00:08:51,170 --> 00:08:53,730 дело с цветовой манипуляции. 153 00:08:53,730 --> 00:08:57,050 Может быть, вы могли бы использовать один из методов что я уже упоминал выше. 154 00:08:57,050 --> 00:08:59,600 И кроме того, вы можете для повышения некоторых цветов 155 00:08:59,600 --> 00:09:02,620 и привлечь виновных вне. 156 00:09:02,620 --> 00:09:06,190 >> Так что теперь мы изменили пиксель цвет, затем мы просто нужно записать их 157 00:09:06,190 --> 00:09:08,500 в к строки развертки, пиксель за пикселем. 158 00:09:08,500 --> 00:09:11,860 И еще раз, вы хотите, чтобы оглянуться назад чтобы copy.c, если вы не скопировали 159 00:09:11,860 --> 00:09:18,170 это уже, и посмотреть на FWRITE Функция, которая принимает данные, указатель 160 00:09:18,170 --> 00:09:23,230 к структуре, содержащей байт что вы читаете из, размера 161 00:09:23,230 --> 00:09:26,610 элементы, количество элементов, а затем outptr - 162 00:09:26,610 --> 00:09:29,450 назначение этих файлов. 163 00:09:29,450 --> 00:09:34,010 >> После написания в пикселях, вы будете также должны написать в обивке. 164 00:09:34,010 --> 00:09:34,970 Что такое обивка? 165 00:09:34,970 --> 00:09:38,670 Ну, каждый rgbt пикселей три байта. 166 00:09:38,670 --> 00:09:43,670 Но, Scanline для растрового изображения Должно быть кратно четырем байтам. 167 00:09:43,670 --> 00:09:47,650 И если количество пикселей не кратно четырем, то нам нужно добавить 168 00:09:47,650 --> 00:09:48,880 это обивка. 169 00:09:48,880 --> 00:09:51,420 Заполнение просто представлена ​​0s. 170 00:09:51,420 --> 00:09:54,380 Итак, как мы пишем, или читать это? 171 00:09:54,380 --> 00:09:59,280 Ну, получается, что вы не можете фактически FREAD обивка, но вы можете 172 00:09:59,280 --> 00:10:00,970 вычислить его. 173 00:10:00,970 --> 00:10:04,400 >> В этом случае, ключ и приговор имеют одинаковую ширину, так 174 00:10:04,400 --> 00:10:05,910 обивка то же самое. 175 00:10:05,910 --> 00:10:09,370 И обивка, как вы увидите в copy.c, рассчитывается 176 00:10:09,370 --> 00:10:11,790 с приведенной ниже формуле - 177 00:10:11,790 --> 00:10:16,690 bi.biWidth раз SizeOf (RGBTRIPLE) будет дать нам, сколько байтов BMP 178 00:10:16,690 --> 00:10:18,280 имеет в каждой строке. 179 00:10:18,280 --> 00:10:21,890 Оттуда, модуло и вычеты с 4 можно рассчитать как 180 00:10:21,890 --> 00:10:25,610 количество байтов должны быть добавлены так, чтобы кратным байт на 181 00:10:25,610 --> 00:10:27,250 каждая строка является четыре. 182 00:10:27,250 --> 00:10:30,490 >> Теперь, когда у нас есть формула для сколько обивка нам нужно, теперь 183 00:10:30,490 --> 00:10:31,610 мы можем записать его. 184 00:10:31,610 --> 00:10:34,080 Теперь, я уже говорил, обивка находится всего 0s. 185 00:10:34,080 --> 00:10:39,730 Так что в этом случае мы просто положить символ, в данном случае 0, в нашей 186 00:10:39,730 --> 00:10:41,710 outptr - наш выходной файл. 187 00:10:41,710 --> 00:10:47,530 Так что может быть просто fputc 0, запятая outptr. 188 00:10:47,530 --> 00:10:52,400 >> Так, в то время как мы читали в наших , файл ввода / вывода следил за нашей 189 00:10:52,400 --> 00:10:57,440 Положение в этих файлах с чем-то называется индикатор позиции файла. 190 00:10:57,440 --> 00:10:59,350 Думайте о нем, как курсор. 191 00:10:59,350 --> 00:11:03,550 В основном, это средства, каждый раз, когда что мы FREAD, но у нас есть 192 00:11:03,550 --> 00:11:05,671 контроль над ним, тоже. 193 00:11:05,671 --> 00:11:11,030 >> Для перемещения индикатор позиции файла, Вы можете использовать функцию FSEEK. 194 00:11:11,030 --> 00:11:15,600 Где inptr представляет файл указатель, который вы ищете в, 195 00:11:15,600 --> 00:11:20,370 сумма количество байт, что вы хотите, чтобы переместить курсор, а затем из 196 00:11:20,370 --> 00:11:23,470 относится к опорной точке откуда курсор находится. 197 00:11:23,470 --> 00:11:26,770 Если вы передаете в SEEK_CUR, что представляет собой ток 198 00:11:26,770 --> 00:11:28,100 положение в файле. 199 00:11:28,100 --> 00:11:31,020 Или вы можете использовать некоторые другие параметры. 200 00:11:31,020 --> 00:11:35,400 Таким образом, мы, возможно, захотите использовать FSEEK пропустить над прокладкой файла в. 201 00:11:35,400 --> 00:11:39,410 И опять же, если вы застряли, есть пример, что в copy.c. 202 00:11:39,410 --> 00:11:43,260 >> Так что теперь мы открыли файл, разгадка, и приговор. 203 00:11:43,260 --> 00:11:46,450 Мы обновили информацию заголовка для наш вердикт, потому что каждый 204 00:11:46,450 --> 00:11:48,730 битовая карта нуждается в заголовок. 205 00:11:48,730 --> 00:11:52,280 Мы то читайте в разгадка'S Scanline, пиксель за пикселем, изменение 206 00:11:52,280 --> 00:11:55,210 каждый цвет по мере необходимости, и писать те, в 207 00:11:55,210 --> 00:11:57,340 Приговор, пиксель за пикселем. 208 00:11:57,340 --> 00:12:01,550 Как только вы открываете приговор, вы можете видеть, кто преступник, или в чем секрет 209 00:12:01,550 --> 00:12:02,850 сообщение. 210 00:12:02,850 --> 00:12:05,550 Меня зовут Zamyla, и это было детективный роман. 211 00:12:05,550 --> 00:12:12,864