Чтение онлайн

на главную - закладки

Жанры

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

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

слегка неровными.

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

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

Палитра безопасности

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

При использовании 256-цветного режима Windows палитрой по умолчанию является палитра безопасности с добавленными 20 стандартными цветами Windows и 20 свободными цветами.

Перья и кисти

В этом разделе мы сделаем обзор двух вспомогательных классов, которые нужны для рисования фигур. Мы уже встречали класс Pen, используемый для сообщения экземпляру

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

Рассмотрим

сначала кисти, а затем — перья.

Программисты, использовавшие ранее GDI, могут заметить из первых примеров, что перья используются в GDI+ другим способом. В GDI обычная практика состояла в вызове функции API Windows с именем

SelectObject
, которая обычно связывает перо с контекстом устройства. Оно используется затем во всех операциях рисования, пока контекст устройства не будет связан с другим пером, снова вызывая метод
SelectObject
. Тот же принцип сохраняется для кистей и других объектов, таких как шрифты или битовые изображения. С помощью GDI+, как упоминалось ранее, компания Microsoft перешла к модели без состояния, в которой нет пера по умолчанию или другого вспомогательного объекта. Вместо этого с каждым вызовом метода просто определяется подходящий вспомогательный объект, который будет использоваться для определенного метода.

Кисти

GDI+ имеет несколько различных видов кистей, мы объясним простейшие из них, чтобы знать о принципах. Каждый тип кисти представлен экземпляром класса, производным из

System.Drawing.Brush
(этот класс является абстрактным, поэтому нельзя создать экземпляры объектов
Brush
как только объекты производных классов). Простейшая кисть указывает, что область должна быть заполнена сплошным цветом. Этот вид кисти представлен экземпляром класса
System.Drawing.SolidBrush
, который можно создать таким образом:

Brush solidBeigeBrush = new SolidBrush(Color.Beige);

Brush solidFunnyOrangyBrownBrush = new SolidBrush(Color.FromArgb(255, 155, 100)

Альтернативно, если кисть является одним из именованных цветов Интернета, то можно создать кисть более просто с помощью другого класса

System.Drawing.Brushes
.
Brushes
является одним из тех классов, экземпляры которых реально никогда не создаются (он имеет закрытый конструктор, чтобы не дать возможности это сделать). Большое число статических свойств возвращает кисть специального цвета.
Brushes
используется так:

Brush solidAzureBrush = Brushes.Azure;

Brush solidChocolateBrush = Brushes.Chocolate;

Следующий уровень сложности представляет штриховая кисть, которая заполняет область, рисуя некоторый шаблон-узор. Этот тип кисти находится в пространстве имен

Drawing2D
, представленном классом
System.Drawing.Drawing2D.HatchBrush
. Класс
Brushes
не сможет помочь в случае штриховой кисти, необходимо будет создать одну из них явно, задавая стиль штриховки и два цвета — цвет переднего плана и цвет фона (но можно опустить цвет фона, в таком случае по умолчанию используется черный цвет). Стиль штриховки задают с помощью перечисления
System.Drawing.Drawing2D.HatchStyle
. Существует большое число доступных значений
HatchStyle
, поэтому проще всего обратиться к документации MSDN для получения полного списка. Типичными стилями, например, являются
ForwardDiagonal
,
Cross
,
DiagonalCross
,
SmallConfetti
и
ZigZag
. Ниже приведены примеры создания штриховой кисти

Brush crossBrush = new HatchBrush(HatchStyle.Cross, Color.Azure);

// фоновый цвет для CrosstBrush будет черный

Brush brickBrush = new HatchBrush(HatchStyle.DiagonalBrick, Color.DarkGoldenrod.Color.Cyan);

Сплошные и штриховые кисти — единственные кисти, доступные в GDI. GDI+ добавляет пару новых стилей кисти:

□ Кисть

System.Drawing.Drawing2D.LinearGradientBrush
заполняет область цветом, который изменяется на экране.

Поделиться:
Популярные книги

Сумеречный стрелок

Карелин Сергей Витальевич
1. Сумеречный стрелок
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок

Я подарю тебе ребёнка

Малиновская Маша
Любовные романы:
современные любовные романы
6.25
рейтинг книги
Я подарю тебе ребёнка

Идеальный мир для Лекаря 7

Сапфир Олег
7. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 7

Вперед в прошлое 2

Ратманов Денис
2. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 2

70 Рублей

Кожевников Павел
1. 70 Рублей
Фантастика:
фэнтези
боевая фантастика
попаданцы
постапокалипсис
6.00
рейтинг книги
70 Рублей

Попаданка в академии драконов 2

Свадьбина Любовь
2. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
6.95
рейтинг книги
Попаданка в академии драконов 2

Я все еще граф. Книга IX

Дрейк Сириус
9. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я все еще граф. Книга IX

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

Адвокат Империи 3

Карелин Сергей Витальевич
3. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Адвокат Империи 3

Истребитель. Ас из будущего

Корчевский Юрий Григорьевич
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Истребитель. Ас из будущего

Жена на пробу, или Хозяйка проклятого замка

Васина Илана
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Жена на пробу, или Хозяйка проклятого замка

Найденыш

Шмаков Алексей Семенович
2. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Найденыш

Эволюционер из трущоб. Том 3

Панарин Антон
3. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
6.00
рейтинг книги
Эволюционер из трущоб. Том 3

Я тебя верну

Вечная Ольга
2. Сага о подсолнухах
Любовные романы:
современные любовные романы
эро литература
5.50
рейтинг книги
Я тебя верну