В этом разделе мы возьмем методы, которые мы изучали до сих пор. Это
цикл 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. И я