Программирование >>  Вывод графики 

1 ... 5 6 7 [ 8 ] 9 10 11 ... 19


Цвета

Этот раздел посвящен способам указания цвета при рисовании.

Цвета в GDI+ представлены экземплярами структур System.Drawing.Color. Обычно однажды создав экземпляр такой структуры, с ним не приходится ничего делать; вы просто передаете его методам, которые требуют параметра - цвета. Мы уже сталкивались с этой структурой, когда задавали цвет фона клиентской области окна в каждом их предыдущих примеров, а также когда устанавливали цвет рисования фигур. Свойство Form.BackColor возвращает экземпляр Color. В этом разделе мы рассмотрим эту структуру более детально. В частности, исследуем несколько различных способов конструирования Color.

Значения Red-Green-Blue (RGB)

Общее количество отображаемых на мониторе цветов поистине огромно - более 16 миллионов. Точнее сказать, их количество равно 2 в степени 24, что равно 16 777 216. Очевидно, что необходим какой-то метод индексации цветов, чтобы можно было указать, какой из них нужно использовать для отображения любого данного пикселя.

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

Это дает нам первый способ сообщить GDI+ значение цвета. Можно указать значения красной, зеленой и синей составляющих, вызвав статическую функцию Color.FromArgb(). Разработчики Microsoft решили не применять конструктор для выполнения этой задачи. Причина в том, что помимо обычных компонентов RGB существуют и другие способы определения цвета. В результате в Microsoft решили, что смысл параметров, передаваемых любому конструктору, может быть открыт для неправильного понимания:

Color redColor = Color.FromArgb(255,0,0);

Color funnyOrangyBrownColor = Color.FromArgb(255,155,100); Color blackColor = Color.FromArgb(0,0,0); Color whiteColor = Color.FromArgb(255,255,255);

Три параметра соответствуют интенсивности красного, зеленого и синего. Эта функция имеет множество других перегрузок, часть из которых также позволяют специфицировать нечто, называемое альфа-сопряжением (alpha-blending - отсюда буква A в имени метода FromArgb()). Анализ альфа-сопряжения не входит в рамки настоящей главы, но говоря кратко, это позволяет задавать полупрозрачный цвет, комбинируя с тем, что уже имеется на экране. Это может давать некоторые симпатичные эффекты и часто используется в играх.



Именованные цвета

Конструирование Color с помощью FromArgb() - это наиболее гибкий прием, поскольку фактически дает возможность указать любой цвет, который может видеть человеческий глаз. Однако если вам нужны простые стандартные, хорошо известные цвета вроде красного или синего, то гораздо проще было бы указать имя требуемого цвета. По этой причине Microsoft также предложила большое количество статических свойств в Color, каждое из которых возвращает именованный цвет. Одно из них мы уже использовали, когда устанавливали белый цвет фона окна в предыдущих примерах:

this.BackColor = Color.White; дает тот же эффект, что и

this.BackColor = Color.FromArgb(255, 255 , 255);

Существует несколько сотен таких цветов. Полный список приведен в документации по SDK. Они включают все простые цвета: Red, White, Blue, Green, Black и т.д., а также такие замечательные цвета, как MediumAquamarine, LightCoral и DarkOrchid. Существует также перечисление KnownColor, которое определяет именованные цвета.

Каждый из именованных цветов представляет точный набор значений RGB, и все они бйли выбраны много лет назад для применения в Internet. Идея заключалась в том, чтобы предоставить удобный набор цветов в рамках спектра, имена которых могут быть распознаны Web-браузерами, и тем самсм избавить разработчиков от необходимости указывать RGB-значения в коде HTML. Еще несколько лет назад эти цвета бсли важны еще и потому, что ранние версии браузеров не отображали аккуратно все цвета, а потому стандартный набор определял цвета, которсе должны бсли корректно отображаться большинством браузеров. В наши дни этот аспект менее важен, поскольку современные Web-браузеры в состоянии правильно отобразить любое RGB-значение. Также доступны безопасные к Web палитры цветов, которые обеспечивают разработчиков полными списками цветов, работающими с большинством браузеров.

Режимы отображения Graphics и безопасная палитра

Хотя в принципе мониторы и могут отображать любой из более чем 16 миллионов цветов RGB, на практике это зависит от того, как настроены свойства дисплея на вашем компьютере. В Windows традиционно доступны три главных цветовых режима (хотя некоторые машины могут предлагать и другие опции, в зависимости от установленного оборудования): true color (реалистичное цветовоспроизведение, 24 бита), high color (высококачественное цветовоспроизведение, 16 бит) и 256 цветов. (На некоторых графических картах в наши дни true color называется 32-битным режимом. Это сделано с целью оптимизации работы оборудования, хотя в этом случае для представления цветов используются лишь 24 бита из 32.)

Только режим true color позволяет отображать все цвета RGB одновременно. Это кажется лучшим выбором, но обходится недешево: для представления полного значения RGB требуется 3 байта - т.е. 3 байта памяти графической карты необходимы для хранения одного отображаемого пикселя. Если на первом месте стоит экономия видеопамяти (ограничение, которое теперь не так часто используется, как следовало бы), то вы можете предпочесть один из других режимов. Режим high-color требует 2 байта на пиксель. Этого достаточно, чтобы выделить 5 бит на каждый компонент RGB. Таким образом, вместо 256 градаций интенсивности красного получаем только 32. То же самое касается синего и зеленого, что в итоге дает нам 65 536 цветов. Этого почти достаточно, чтобы дать видимое на первый взгляд фотографическое качество, хотя полутона и будут несколько беднее.



256-цветный режим дает еще меньше цветов. Однако в этом режиме можно выбрать, какими именно должны быть эти цвета. Это обеспечивается в системе тем, что называется палитрой. Палитра перечисляет 256 цветов, выбранных из 16 миллионов цветов RGB. Указав однажды перечень цветов палитры, можно заставить графическое устройство отображать только эти цвета. Палитра может быть изменена в любой момент, но в каждый момент времени графическое устройство отображает только 256 цветов. Этот режим применяется в тех случаях, когда приоритетом является высокая производительность и объем используемой видеопамяти. Большинство компьютерных игр используют этот режим, и они могут обеспечить великолепно выглядящую графику за счет тщательного выбора палитры.

Вообще говоря, если устройство отображения находится в режиме high-color либо в 256-цветном, и запрашивается определенный цвет RGB, то оно находит ближайший математически соответствующий цвет из множества доступных к отображению. Мы говорим об этом потому, что следует иметь представление о существовании режимов цвета. Если вы рисуете нечто такое, что требует тонкого отображения полутонов, или выводите изображения с фотографическим качеством, а у пользователя не включен режим 24-битного цвета, он может не увидеть образ так, как вы хотели его показать. Поэтому, если эта работа выполняется с GDI+, то вы должны протестировать свое приложение в разных цветовых режимах. (Можно также программно включать определенный цветовой режим, хотя мы не обсуждаем это в настоящей главе из-за недостатка места.)

Безопасная палитра

Выше мы уже упомянули вскользь так называемую безопасную палитру (safety palette), которая очень часто используется в качестве палитры по умолчанию. Принцип ее организации заключается в том, что установлено шесть равномерно распределенных значений для каждого компонента цвета: 0, 52, 102, 153, 204 и 255. Другими словами, красный компонент может иметь любое из этих значений. То же самое и с зеленым и с синим компонентом.

Таким образом, возможные цвета из безопасной палитры включают (0,0,0) - черный, (153,0,0) - насыщенный темно-красный, (0,255,102) - зеленый с небольшой примесью синего и так далее. Это дает в сумме 6 в кубе, т.е. 216 цветов. Идея в том, чтобы создать палитру, включающую цвета, равномерно распределенные в пределах спектра и всех степеней яркости, хотя на практике это не так хорошо работает, потому что математически равномерное распределение компонентов цветов не означает, что так оно будет воспринято человеческим глазом.

Если переключить Windows в 256-цветный режим, то это даст как раз безопасную палитру с добавочными 20 стандартными цветами Windows и еще 20 запасными.

Перья и кисти

В этом разделе рассматриваются два вспомогательных класса, необходимые для рисования фигур. Мы уже сталкивались с классом Pen, который применяли для указания экземпляру Graphics способа рисования линий. Связанный с ним класс - System.Drawing.Brush - позволяет указать экземпляру Graphics способ закрашивания экранных областей. Например, Pen необходим был для рисования границ прямоугольника и эллипса в предыдущих примерах. Если бы нам понадобилось нарисовать эти фигуры как сплошные, нужно было бы указать кисть, чтобы специфицировать, как их следует закрашивать. Один общий аспект этих двух классов состоит в том, что вам вряд ли придется когда-нибудь вызывать их методы. Вы просто конструируете эк-



1 ... 5 6 7 [ 8 ] 9 10 11 ... 19

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика