[Script Info] Title: [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:00.84,0:00:05.64,Default,,0000,0000,0000,,В этом разделе мы возьмем методы, которые мы изучали до сих пор. Это Dialogue: 0,0:00:05.64,0:00:10.21,Default,,0000,0000,0000,,цикл for, конструкцию if и метод для обнаружения цветных областей Dialogue: 0,0:00:10.21,0:00:14.100,Default,,0000,0000,0000,,и соединим их вместе для того чтобы создать реальный киношный сецэффект Dialogue: 0,0:00:14.100,0:00:19.48,Default,,0000,0000,0000,,называемый Blue Screening. И я должен уточнить, что то о чем вы думаете как о видео данных Dialogue: 0,0:00:19.48,0:00:23.90,Default,,0000,0000,0000,,на самом деле сделано из серий обычных картинок, показанных Dialogue: 0,0:00:23.90,0:00:28.49,Default,,0000,0000,0000,,от 20 до 60 раз в секунду. Таким образом, для наших целей мы будем просто делать спецэффекты Dialogue: 0,0:00:28.49,0:00:33.29,Default,,0000,0000,0000,,на стоп-кадрах, и Вы сможете увидеть как они обобщают в кино. Значит, идея состоит в том, что это будет Dialogue: 0,0:00:33.29,0:00:37.56,Default,,0000,0000,0000,,очень простая модель. Картинка, которая у меня - это картинка со знаком стоп. Значит, мы говорили Dialogue: 0,0:00:37.56,0:00:41.55,Default,,0000,0000,0000,,о коде чтобы определить красную область тут внутри. Для эффекта blue screen Dialogue: 0,0:00:41.56,0:00:45.83,Default,,0000,0000,0000,,мы будем имеить вторую картинку, которую я назову фоновой. Dialogue: 0,0:00:45.83,0:00:50.23,Default,,0000,0000,0000,,Идея состоит в том, что мы будем определять красные области так, как делали раньше. Но каждый раз, как Dialogue: 0,0:00:50.23,0:00:54.35,Default,,0000,0000,0000,,я получаю пиксель здесь на красной области, я хочу подумать о что-то вроде Dialogue: 0,0:00:54.35,0:00:59.04,Default,,0000,0000,0000,,соответствующего пикселя из этой второй картинки. И я собираюсь скопировать тот пиксель Dialogue: 0,0:00:59.04,0:01:03.68,Default,,0000,0000,0000,,чтобы поместить его в красную зону тут с пикселями отсюда с другой Dialogue: 0,0:01:03.68,0:01:07.75,Default,,0000,0000,0000,,картинки. В общем, вот немного более детальная диаграмма этого. Значит, я приведу Dialogue: 0,0:01:07.75,0:01:11.96,Default,,0000,0000,0000,,примеры немного позже. Но у нас будет цикл for где мы будем как бы Dialogue: 0,0:01:11.96,0:01:16.38,Default,,0000,0000,0000,,циклировать через эту картинку. И мыполучим выражение, которое определит Dialogue: 0,0:01:16.38,0:01:20.54,Default,,0000,0000,0000,,некоторые пиксели здесь вверху. Значит, давайте представим что мы определили этот пиксель на картинке Dialogue: 0,0:01:20.54,0:01:24.54,Default,,0000,0000,0000,,слева. Тогда этот пиксель имеет некую XY координату и мы не сильно оперировали с Dialogue: 0,0:01:24.54,0:01:28.65,Default,,0000,0000,0000,,XY дотеперь но она, вы знаете, может быть X 200 и Y 100, или другой. Dialogue: 0,0:01:28.81,0:01:33.21,Default,,0000,0000,0000,,Что мы хотим сделать - это получить этих два значения. И потом найти соответсвтующий Dialogue: 0,0:01:33.21,0:01:37.75,Default,,0000,0000,0000,,пиксель вот тут с другой картинки. Значит, наверное в диапазоне 200-100. Dialogue: 0,0:01:37.75,0:01:42.84,Default,,0000,0000,0000,,Тут есть некоторый пиксель, который подходит. Значит как только мы получили эту соответствующую картинку ( Dialogue: 0,0:01:42.84,0:01:47.87,Default,,0000,0000,0000,,соответствующий пиксель с другой картинки). Тогда мы хотим скопировать его чтобы поместить Dialogue: 0,0:01:47.87,0:01:53.08,Default,,0000,0000,0000,,пиксель тут. И вы знаете как это будет работать? Как вы скопируете Dialogue: 0,0:01:53.08,0:01:57.14,Default,,0000,0000,0000,,пиксель? Вы должны подумать вот о чем: "Что определяет пиксель? Что заставляет пиксель выглядеть Dialogue: 0,0:01:57.14,0:02:01.03,Default,,0000,0000,0000,,так, как он выглядит?" И ответ - это всего лишь три числа. Это всего лишь красный, Dialogue: 0,0:02:01.03,0:02:04.96,Default,,0000,0000,0000,,зеленый и синий. Значит мы собираемся написать код чтобы получить значение красного из Dialogue: 0,0:02:04.96,0:02:08.95,Default,,0000,0000,0000,,этого пикселя тут и потом присвоить его как значение красного тут. Аналогично и для Dialogue: 0,0:02:08.95,0:02:13.14,Default,,0000,0000,0000,,зеленого и синего. И присваивая все эти три числа мы собираемся сделать так, что Dialogue: 0,0:02:13.14,0:02:17.33,Default,,0000,0000,0000,,пиксель на этой картинке будет выглядеть точно так же, как пиксель тут на этой Dialogue: 0,0:02:17.33,0:02:22.18,Default,,0000,0000,0000,,стороне. Значит вот некий код, вот наш первый пример кода как это сделать. И вместо того, Dialogue: 0,0:02:22.18,0:02:27.49,Default,,0000,0000,0000,,чтобы описывать эффект, я думаю в этом случае я просто запущу его, чтобы мы увидели Dialogue: 0,0:02:27.49,0:02:32.42,Default,,0000,0000,0000,,его, и потом я поговорю о том, что каждая из строк делает. Значит тут мы видим, как Dialogue: 0,0:02:32.42,0:02:37.60,Default,,0000,0000,0000,,указывалось раньше, знак стоп со всей его красной областью знака стоп. Dialogue: 0,0:02:37.79,0:02:42.97,Default,,0000,0000,0000,,Вместо этого мы выделили пиксели с главной картинки. Теперь дайте мне обьяснить, Dialogue: 0,0:02:43.16,0:02:48.69,Default,,0000,0000,0000,,как части этого работают. Прежде всего, во всех примерах до этого, я думаю Dialogue: 0,0:02:48.69,0:02:52.87,Default,,0000,0000,0000,,мы просто открыли одну картинку, но тут оказывается вы можете иметь много картинок. Поэтому тут Dialogue: 0,0:02:52.87,0:02:56.59,Default,,0000,0000,0000,,я открываю вторую картинку расширения jpeg и сохраняю ее в переменной Dialogue: 0,0:02:56.59,0:03:01.23,Default,,0000,0000,0000,,названной back. И весь этот код который мы видели до этого - я просто повторяю его по этому Dialogue: 0,0:03:01.23,0:03:06.26,Default,,0000,0000,0000,,знаку стоп и определяю красные пиксели. Интересное действие тут, внутри Dialogue: 0,0:03:06.26,0:03:11.17,Default,,0000,0000,0000,,выражения if. Что мы делаем, когда имеем красный пиксель, который разбиваем Dialogue: 0,0:03:11.17,0:03:16.73,Default,,0000,0000,0000,,на три части. Значит эти первые две линии просто назовем pixel.getX и pixel.getY и сохраним Dialogue: 0,0:03:16.73,0:03:22.00,Default,,0000,0000,0000,,результирующие значения в переменных x и y. Не думаю, что я использовал getX Dialogue: 0,0:03:22.00,0:03:26.69,Default,,0000,0000,0000,,и getY дотеперь, но что они делают - они просто идут к пикселю и Dialogue: 0,0:03:26.69,0:03:31.84,Default,,0000,0000,0000,,получаю X или Y с него. Это практически аналогично getRed и getBlue. Dialogue: 0,0:03:32.31,0:03:37.90,Default,,0000,0000,0000,,И я просто собираюсь хранить это в этих переменных x и y. И потом в этой строке я Dialogue: 0,0:03:37.90,0:03:42.68,Default,,0000,0000,0000,,бери этих два значение x и y. По сути я как бы читаю их слева направо тут. Итак Dialogue: 0,0:03:42.68,0:03:47.34,Default,,0000,0000,0000,,я возвращаюсь назад к картинке, и это картинка с листьями. И я вызываю getPixel и я Dialogue: 0,0:03:47.34,0:03:52.12,Default,,0000,0000,0000,,хочу извлечь пиксель отсюда. И потом я должен назначить ему x,y и в этом Dialogue: 0,0:03:52.12,0:03:56.78,Default,,0000,0000,0000,,случае это было сделано тут. Итак по существу, Dialogue: 0,0:03:56.78,0:04:01.43,Default,,0000,0000,0000,,это x и y пикселя из картинки со знаком стоп, неважно какие эти x и y, Dialogue: 0,0:04:01.43,0:04:06.57,Default,,0000,0000,0000,,говорим иди получи этот пиксель в том же x y из картинки с листками. Как только мы получили Dialogue: 0,0:04:06.57,0:04:12.02,Default,,0000,0000,0000,,тот пиксель, я просто собераюсь начать другую переменную названную "pixel два". Dialogue: 0,0:04:12.23,0:04:16.13,Default,,0000,0000,0000,,Итак естественным вопросом было бы чтото вроде: "Не могли бы мы просто назвать его pixel?" Ну, Dialogue: 0,0:04:16.13,0:04:20.13,Default,,0000,0000,0000,,мы не можем назвать его pixel, потому что мы уже используем переменную pixel, которая относится к пикселю Dialogue: 0,0:04:20.13,0:04:23.98,Default,,0000,0000,0000,,из картинки со знаком стоп. Итап pixel two - самое естественное другое Dialogue: 0,0:04:23.98,0:04:29.12,Default,,0000,0000,0000,,название. Отлично, итак на этом шаге, я получил pixel two, который относится к Dialogue: 0,0:04:29.12,0:04:34.16,Default,,0000,0000,0000,,пикселю из фоновой картинки, с другой картинки. И теперь эти три Dialogue: 0,0:04:34.16,0:04:39.00,Default,,0000,0000,0000,,строки делают то, что я описывал как копия до этого. Dialogue: 0,0:04:39.00,0:04:43.44,Default,,0000,0000,0000,,Итак тут говорится: pixel точка, укажи красный (pixel.setRed). Мы такое видели уже 100 раз. И теперь я установлю Dialogue: 0,0:04:43.44,0:04:48.12,Default,,0000,0000,0000,,красное значение пикселя из картинки из знака стоп. Dialogue: 0,0:04:48.12,0:04:52.84,Default,,0000,0000,0000,,И каким я его установлю? Я установлю ему значение pixeltwo.getRed. Dialogue: 0,0:04:52.84,0:04:57.70,Default,,0000,0000,0000,,Итак я получаю пиксель из другой картинки, получая его красное значение, 160 или какое оно там. Dialogue: 0,0:04:57.70,0:05:02.25,Default,,0000,0000,0000,,И теперь я просто установлю это значение в картинку со знаком стоп. Dialogue: 0,0:05:02.25,0:05:07.18,Default,,0000,0000,0000,,Потом повторяя эту процедуру для зеленого и красного - мы просто копируем Dialogue: 0,0:05:07.18,0:05:11.79,Default,,0000,0000,0000,,все три значения. И это по сути копирует сам пиксель. Итак это очень Dialogue: 0,0:05:11.79,0:05:16.88,Default,,0000,0000,0000,,сложно. Я хочу сделать несколько примеров этого. Позвольте мне сделать второй пример. Dialogue: 0,0:05:16.88,0:05:22.11,Default,,0000,0000,0000,,Это картинка ребенка Abby, когда ей примерно 6 месяцев. Радостное маленькое дитя на Dialogue: 0,0:05:22.11,0:05:27.72,Default,,0000,0000,0000,,ее прыгающем стуле. И поздене, когда она станет подростком, она может быть зла на меня за использование Dialogue: 0,0:05:27.72,0:05:33.47,Default,,0000,0000,0000,,этой картинки. Итак я собираюсь в этом случае Dialogue: 0,0:05:33.69,0:05:39.09,Default,,0000,0000,0000,,обратить внимание на зеленые области прыгающего стула. Я хочу как бы скопировать Dialogue: 0,0:05:39.09,0:05:45.06,Default,,0000,0000,0000,,листки чтобы получить как бы природный ребенко-листковой эффект. И в основе нужно Dialogue: 0,0:05:45.06,0:05:50.93,Default,,0000,0000,0000,,всего две вещи в цикле. Вначале я должен Dialogue: 0,0:05:50.93,0:05:56.54,Default,,0000,0000,0000,,указать, что я собираюсь вызвать pixel.getGreen для проверки if. Dialogue: 0,0:05:56.54,0:06:01.68,Default,,0000,0000,0000,,Итак первая проблема была следущая: Получить pixel two, получить соответствующий пиксель. Dialogue: 0,0:06:01.68,0:06:07.22,Default,,0000,0000,0000,,И тут я собираюсь написать это всего в одной строке. Итак я возвращаюсь к другой Dialogue: 0,0:06:07.22,0:06:12.45,Default,,0000,0000,0000,,картинке. Back . get pixel. И я