-
В этом разделе мы возьмем методы, которые мы изучали до сих пор. Это
-
цикл for, конструкцию if и метод для обнаружения цветных областей
-
и соединим их вместе для того чтобы создать реальный киношный сецэффект
-
называемый Blue Screening. И я должен уточнить, что то о чем вы думаете как о видео данных
-
на самом деле сделано из серий обычных картинок, показанных
-
от 20 до 60 раз в секунду. Таким образом, для наших целей мы будем просто делать спецэффекты
-
на стоп-кадрах, и Вы сможете увидеть как они обобщают в кино. Значит, идея состоит в том, что это будет
-
очень простая модель. Картинка, которая у меня - это картинка со знаком стоп. Значит, мы говорили
-
о коде чтобы определить красную область тут внутри. Для эффекта blue screen
-
мы будем имеить вторую картинку, которую я назову фоновой.
-
Идея состоит в том, что мы будем определять красные области так, как делали раньше. Но каждый раз, как
-
я получаю пиксель здесь на красной области, я хочу подумать о что-то вроде
-
соответствующего пикселя из этой второй картинки. И я собираюсь скопировать тот пиксель
-
чтобы поместить его в красную зону тут с пикселями отсюда с другой
-
картинки. В общем, вот немного более детальная диаграмма этого. Значит, я приведу
-
примеры немного позже. Но у нас будет цикл for где мы будем как бы
-
циклировать через эту картинку. И мыполучим выражение, которое определит
-
некоторые пиксели здесь вверху. Значит, давайте представим что мы определили этот пиксель на картинке
-
слева. Тогда этот пиксель имеет некую XY координату и мы не сильно оперировали с
-
XY дотеперь но она, вы знаете, может быть X 200 и Y 100, или другой.
-
Что мы хотим сделать - это получить этих два значения. И потом найти соответсвтующий
-
пиксель вот тут с другой картинки. Значит, наверное в диапазоне 200-100.
-
Тут есть некоторый пиксель, который подходит. Значит как только мы получили эту соответствующую картинку (
-
соответствующий пиксель с другой картинки). Тогда мы хотим скопировать его чтобы поместить
-
пиксель тут. И вы знаете как это будет работать? Как вы скопируете
-
пиксель? Вы должны подумать вот о чем: "Что определяет пиксель? Что заставляет пиксель выглядеть
-
так, как он выглядит?" И ответ - это всего лишь три числа. Это всего лишь красный,
-
зеленый и синий. Значит мы собираемся написать код чтобы получить значение красного из
-
этого пикселя тут и потом присвоить его как значение красного тут. Аналогично и для
-
зеленого и синего. И присваивая все эти три числа мы собираемся сделать так, что
-
пиксель на этой картинке будет выглядеть точно так же, как пиксель тут на этой
-
стороне. Значит вот некий код, вот наш первый пример кода как это сделать. И вместо того,
-
чтобы описывать эффект, я думаю в этом случае я просто запущу его, чтобы мы увидели
-
его, и потом я поговорю о том, что каждая из строк делает. Значит тут мы видим, как
-
указывалось раньше, знак стоп со всей его красной областью знака стоп.
-
Вместо этого мы выделили пиксели с главной картинки. Теперь дайте мне обьяснить,
-
как части этого работают. Прежде всего, во всех примерах до этого, я думаю
-
мы просто открыли одну картинку, но тут оказывается вы можете иметь много картинок. Поэтому тут
-
я открываю вторую картинку расширения jpeg и сохраняю ее в переменной
-
названной back. И весь этот код который мы видели до этого - я просто повторяю его по этому
-
знаку стоп и определяю красные пиксели. Интересное действие тут, внутри
-
выражения if. Что мы делаем, когда имеем красный пиксель, который разбиваем
-
на три части. Значит эти первые две линии просто назовем pixel.getX и pixel.getY и сохраним
-
результирующие значения в переменных x и y. Не думаю, что я использовал getX
-
и getY дотеперь, но что они делают - они просто идут к пикселю и
-
получаю X или Y с него. Это практически аналогично getRed и getBlue.
-
И я просто собираюсь хранить это в этих переменных x и y. И потом в этой строке я
-
бери этих два значение x и y. По сути я как бы читаю их слева направо тут. Итак
-
я возвращаюсь назад к картинке, и это картинка с листьями. И я вызываю getPixel и я
-
хочу извлечь пиксель отсюда. И потом я должен назначить ему x,y и в этом
-
случае это было сделано тут. Итак по существу,
-
это x и y пикселя из картинки со знаком стоп, неважно какие эти x и y,
-
говорим иди получи этот пиксель в том же x y из картинки с листками. Как только мы получили
-
тот пиксель, я просто собераюсь начать другую переменную названную "pixel два".
-
Итак естественным вопросом было бы чтото вроде: "Не могли бы мы просто назвать его pixel?" Ну,
-
мы не можем назвать его pixel, потому что мы уже используем переменную pixel, которая относится к пикселю
-
из картинки со знаком стоп. Итап pixel two - самое естественное другое
-
название. Отлично, итак на этом шаге, я получил pixel two, который относится к
-
пикселю из фоновой картинки, с другой картинки. И теперь эти три
-
строки делают то, что я описывал как копия до этого.
-
Итак тут говорится: pixel точка, укажи красный (pixel.setRed). Мы такое видели уже 100 раз. И теперь я установлю
-
красное значение пикселя из картинки из знака стоп.
-
И каким я его установлю? Я установлю ему значение pixeltwo.getRed.
-
Итак я получаю пиксель из другой картинки, получая его красное значение, 160 или какое оно там.
-
И теперь я просто установлю это значение в картинку со знаком стоп.
-
Потом повторяя эту процедуру для зеленого и красного - мы просто копируем
-
все три значения. И это по сути копирует сам пиксель. Итак это очень
-
сложно. Я хочу сделать несколько примеров этого. Позвольте мне сделать второй пример.
-
Это картинка ребенка Abby, когда ей примерно 6 месяцев. Радостное маленькое дитя на
-
ее прыгающем стуле. И поздене, когда она станет подростком, она может быть зла на меня за использование
-
этой картинки. Итак я собираюсь в этом случае
-
обратить внимание на зеленые области прыгающего стула. Я хочу как бы скопировать
-
листки чтобы получить как бы природный ребенко-листковой эффект. И в основе нужно
-
всего две вещи в цикле. Вначале я должен
-
указать, что я собираюсь вызвать pixel.getGreen для проверки if.
-
Итак первая проблема была следущая: Получить pixel two, получить соответствующий пиксель.
-
И тут я собираюсь написать это всего в одной строке. Итак я возвращаюсь к другой
-
картинке. Back . get pixel. И я