Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 Простые графические спецэффекты.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
4.68 Mб
Скачать

1.2. Приёмы программирования графических спецэффектов

В данном круге задач может потребоваться набор типовых технических приёмов. Здесь упомянуты некоторые из них.

1.2.1. Хранение изображения в памяти

Прямоугольное растровое изображение можно хранить в оперативной памяти в виде двумерного массива, каждая ячейка которого хранит цвет точки изображения.

Рис.2. Растровое изображение. Для задания цвета точки монохромного ("чёрно-белого") изображения используется численное значение, задающее интенсивность свечения пиксела. Для этого достаточно использовать 1 байт, принимающий значения от 0 до 255. Монохромное изображение можно отобразить как чёрно-белое, где цвета точек являются различными оттенками серого цвета. Значение 0 соответствует чёрному цвету, а 255 максимально яркому белому цвету. Для задания цветного изображения используется модель RGB (аббревиатура от Red, Green, Blue). В этой модели цвет пиксела задаётся как сумма трёх цветовых компонент - красного, зелёного и синего. Интенсивность каждой компоненты кодируется одним байтом (численным значением от 0 до 255). Цветное изображение можно понимать как результат наложения трёх монохромных изображений, соответствующих трём компонентам RGB.

Иногда используется дополнительный специальный четвёртый байт, принимающий специальное служебное значение. Например, им можно пометить так называемый "прозрачный" цвет, который считается "прозрачным" при наложении изображения поверх другого изображения. Рис.3. RGB

Итак, для хранения изображения нужно выделить в памяти двумерный массив M[x][y], где x - ширина изображения (число точек по горизонтали), а y - высота изображения (число точек по вертикали). Элемент массива является структурой данных, которая занимает четыре байта. Изображение размером 1024 x 768 точек будет занимать ровно 3 мегабайта памяти. Для современных компьютеров это незначительная величина, и можно хранить в памяти одновременно множество таких изображений. Как правило, в любой программной среде есть графическая библиотека, содержащая готовые функции по выделению памяти для хранения изображений и для их вывода на экран. Далее показан программный код, позволяющий работать с изображениями, хранящимися в памяти компьютера.

1.2.2. Цветовые преобразования

Цветовое преобразование изображения заключается в изменении цвета каждого его пикселя. Новый цвет пикселя зависит только от старого значения его цвета. Эти преобразования изменяют различные характеристики цвета. В данном разделе мы более подробно расскажем о понятии цвета, опишем различные характеристики цвета, и укажем, как работать с этими характеристиками. Цвет, как таковой, является физиологическим зрительным ощущением, которое определяется спектральным составом света, а также зависит от индивидуальных факторов, которые мы не будем рассматривать в данной работе. Мы будем говорить о цвете как об электромагнитной волне определённой частоты (тона) и интенсивности (яркости).

Оптический спектр и тон цвета

Главной характеристикой цвета является его оптический спектр. Разные цвета качественно различаются именно из-за различного спектрального состава света, попадающего в глаз. Спектральный состав - это весь набор частот электромагнитных волн, входящих в луч света. Свет, попадающий в глаз, может иметь достаточно сложное происхождение. Он может исходить непосредственно из источника света, а может быть отражённым. При отражении света каким-либо предметом его спектр меняется, поскольку определённая часть спектра поглощается. Поэтому все предметы (все материалы) имеют свои цвета, обусловленные их спектром поглощения.

Рис.4. Оптический спектр

Спектр отражает физическую природу света, но на спектре нельзя найти все цвета, а напротив, произвольный цвет получается совмещением нескольких участков спектра. Например, белый цвет отсутствует на спектре, но сам содержит весь спектр целиком. Кроме того, иногда два луча света с разным спектральным составом выглядят как один и тот же цвет. В человеческом глазу есть три вида рецепторов, и каждый вид рецепторов воспринимает свой цвет - синий, красный, или зелёный. На этом явлении и основан подход RGB, которым мы пользуемся для представления цвета в компьютере. Но хотя есть всего три вида рецепторов, человеческая психика каким-то образом порождает ощущения огромного разнообразия цветов. Тон цвета - понятие, используемое художниками. Тон определяется характером распределения излучения в спектре видимого света, причем, главным образом, положением пика излучения, а не его интенсивностью и характером распределения излучения в других областях спектра. Именно тон определяет название цвета, например «красный», «синий», «зеленый». Пик излучения - это та частота электромагнитной волны, которая имеет максимальную интенсивность по сравнению с другими частотами. Человек ощущает именно тот цвет, который соответствует пику излучения, попадающего в глаз.

Рис.5. Оптический спектр

Цветоощущение на концах полосы спектра одинаковое - на обоих концах спектра красный цвет. Если спектр искусственно продолжить, окрасив красным часть невидимого излучения, то можно свернуть его в кольцо, совместив два конца одинакового цвета. Мы получили цветовой круг, на который поместим теперь угловую шкалу в 360 градусов. Исходя из понятия о пике излучения, тон задаётся точной численной величиной в градусах, принимая значение от 0 до 360.

Рис.6. Цветовой круг

Яркость и светлота

Яркость - это физическая величина, характеризующая поток света. В физике она определяется как "поток, посылаемый в данном направлении единицей видимой поверхности в единичном телесном угле". Это энергетическая характеристика, которая относится не к цвету, а к энергии светового луча. Яркость выражается численным значением от 0 и до бесконечности.

Дадим формулу, которая связывает яркость с моделью RGB: Яркость = 0.3 * R + 0.59 * G + 0.11 * B Такая формула вытекает из особенностей человеческого зрения. Светлота - это уже другая, не физическая, а художественная характеристика. Это субъективная яркость участка изображения отнесенная к субъективной яркости поверхности, воспринимаемой человеком как белая. Светлота - это относительная характеристика. Если смотреть на изображение на листе бумаги, то при разной его освещённости сравнительное ощущение по разному раскрашенных участков изображения будет одинаковым в сравнении друг с другом и просто с не закрашенными участками белого листа.

Важно отметить именно относительность восприятия. Если посмотреть на лист изображение на бумаге при свете лампы и при ярком солнечном свете, количество отраженного света от участка изображения будет различаться, однако относительно самого светлого участка поверхности — незапечатанной бумаги, воспринимаемая яркость будет одной и той же. Можно сказать, что светлотой называют степень близости цвета к белому. Любой оттенок при максимальном увеличении светлоты становится белым.

Рис.7. Светлота

Светлота выражается численным значением от 0 до 10. На иллюстрации - шкала светлоты с примерами различных цветов. Отметим, что прямая взаимосвязь яркости и светлоты имеет сложный нелинейный характер, и выражается громоздкой формулой. Эта нелинейность связана с особенностями человеческого зрения.

Насыщенность цвета

Насыщенность цвета - это интенсивность определенного тона, то есть степень визуального отличия какого-либо цвета от равного ему по светлоте серого цвета. Насыщенный цвет можно назвать сочным, глубоким, менее насыщенный — приглушенным, приближенным к серому. Полностью ненасыщенный цвет будет оттенком серого. В физическом плане насыщенность цвета определяется характером распределения излучения в спектре видимого света. Наиболее насыщенный цвет образуется при существовании пика излучения на одной длине волны, в то время как более равномерное по спектру излучение будет восприниматься как менее насыщенный цвет. Белый цвет и его все оттенки, то есть серый цвет - вообще не имеет пика излучения, но сам содержит весь оптический спектр. Художники знают, что при смешении красок снижение насыщенности будет наблюдаться при добавлении белых, серых и черных красок. Также существует понятие "дополнительного цвета". Если смешать какой либо цвет с его дополнительным цветом, мы получим серый цвет.

Насыщенность цвета выражается численным значением в интервале [0;1]. Серый цвет соответствует значению 0, а значение 1 соответствует цвету, состоящему из одной линии спектра.

Рис.8. Насыщенность цвета

HSL и HSV

Подход RGB исходит из строения человеческого глаза. Он прост и удобен, и охватывает все существующие цвета, но при этом он не привязан к диаграмме спектра. Мы рассмотрим другие способы задания цвета - HSL и HSV. Эти способы связаны с оптическим спектром, и используют такие характеристики цвета, которые интуитивно понятны и привычны для художников.

HSL означает Hue, Saturation, Lightness - тон, насыщенность, яркость.

HSV означает Hue, Saturation, Value - тон, насыщенность, светлота.

На иллюстрации - изображения, заданные посредством HSL и HSV.

Работа с HSL и HSV позволяет изменять вышеперечисленные цветовые характеристики напрямую, просто изменяя их численные значения, что намного удобней RGB. Рис.9. HSL и HSV

HSL и HSV очень похожи, и выбор между ними зависит от конкретной задачи и от того, как в той или иной задаче работает мышление. Например, при визуализации огня лучше работать с HSL, поскольку свечение огня как физического явления целесообразно передать через физическую характеристику - яркость. Яркость будет условно соответствовать температуре горящего огня.

HSL и HSV работают с двумя цветовыми пространствами, которые можно изобразить в виде цилиндрических диаграмм.

Рис.10. HSL и HSV

Рис.11. HSV

Чтобы обдумывать работу с цветом в разрабатываемом графическом спецэффекте, можно смотреть на данные иллюстрации, и осмыслять интересующие переходы цветов через цветовое пространство HSL или HSV. Чтобы работать в этих пространствах, потребуется умение конвертировать данные о цвете из RGB в HSL/HSV и наоборот. Для этого существуют специальные формулы, которые мы привели здесь. Отметим, что при работе с данными моделями лучше не использовать хранение величин S и V в виде одного байта (значения 0 ... 255), потому что это ведёт к существенным потерям при конвертации из RGB. Лучше всего использовать числа с плавающей точкой, а конечный результат конвертировать в RGB. После введения в эксплуатацию HSL и HSV для нас становится очевидным и очень простым осуществление ряда элементарных эффектов - например, изменение насыщенности и яркости. Достаточно просто непосредственно изменить соответствующие параметры, переведя изображение в HSL и HSV. Далее показан код для работы с моделью HSL.

Замена цветов

Грубо говоря, данное преобразование заключается в замене одних цветов на другие. Чтобы сохранить при этом плавность переходов цветов, нужно использовать специально заданные функции преобразования цветов. Функции преобразования цветов могут работать с каждой компонентой (R,G,B) в отдельности, или же со компонентами вместе. Например, нам нужно обратить цвета. Для этого достаточно обратить интенсивность каждой компоненты по формуле f(I)=I_max - I. Мы просто "разворачиваем" значение компоненты, меняя местами светлое и тёмное. Проведя это в отдельности с каждой компонентой, мы получим эффект, показанный на иллюстрации.

Рис.12. Обращение цветов

Можно провести более тонкую замену, заменив одни цветовые тона на другие. Для этого можно перейти к работе в модели HSL или HSV, и построить функцию, которая бы преобразовывала параметр Hue, задающий спектральную частоту света. Например, мы развернём спектр задом наперёд, применив функцию f(H)=360-H.