Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
14
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

4.3.5 О цветах

Цветные дисплеи требуют более одного бита для хранения информации о пикселе. Больше битов — больше цветов. Число уникальных цветов равно 2 в степени, равной числу битов. 16-цветные видеоадаптеры требуют 4 бита на пиксель. Эти биты организованы в цветовые плоскости — красная плоскость, зеленая плоскость, голубая плоскость и плоскость интенсивности. Адаптеры с 8, 16 или 24 битами на пиксель имеют одну цветовую плоскость, в которой набор смежных битов представляет цвет каждого пикселя.

Функция GetDeviceCaps дает вам возможность распознать организацию памяти видеоадаптера и число цветов, которые он может отобразить. Такой вызов данной функции возвращает число цветовых плоскостей:

iPlanes = GetDeviceCaps(hdc, PLANES);

Следующий вызов возвращает число битов цвета для представления одного пикселя:

iBitsPixel = GetDeviceCaps(hdc, BITSPIXEL);

Большинство графических устройств, способных отображать цвета, используют или множество цветных плоскостей или множество битов на пиксель, но не и то и другое сразу. Другими словами, один из указанных вызовов будет возвращать значение, равное 1. Число цветов, которые могут быть отображены видеоадаптером, вычисляется по формуле:

iColors = 1 <<(iPlanes * iBitsPixel);

Это значение не всегда совпадает с числом цветов, которое можно получить с помощью параметра NUMCOLORS:

iColors = GetDeviceCaps(hdc, NUMCOLORS);

Например, эти два значения будут различными для большинства плоттеров. Для плоттера значения и PLANES и BITSPIXEL будут равны 1, а величина NUMCOLORS будет зависеть от числа цветных перьев, которые имеются в плоттере. Для монохромных устройств функция GetDeviceCaps возвращает значение, равное 2, при вызове с параметром NUMCOLORS.

Более важно то, что эти два значения могут также отличаться для 256-цветных видеоадаптеров, поддерживающих загружаемые цветовые палитры. Функция GetDeviceCaps с параметром NUMRESERVED возвращает число цветов, зарезервированных Windows, которое равно 20. Оставшиеся 236 цветов могут быть заданы Windows-программой, использующей управление палитрами.

Windows использует беззнаковое 32-разрядное длинное целое для представления цвета. Тип данных для цвета называется COLORREF. Младшие три байта задают красную, зеленую и голубую составляющие, величина которых находится в интервале от 0 до 255, как показано на рис. 4.3. Таким образом, палитра может иметь 224 (примерно 16 миллионов) цветов.

Это беззнаковое длинное целое часто называют "RGB-цвет". Заголовочный файл Windows содержит несколько макросов для работы со значениями RGB. Макрос RGB получает три аргумента, представляющих красную, зеленую и голубую составляющие, и конструирует из них беззнаковое длинное целое:

#define RGB(r, g, b) ((COLORREF)(((BYTE)(r) | ((WORD)(g) << 8)) | ((DWORD)(BYTE)(b)) << 16)))

Таким образом, величина:

RGB(255, 0, 255)

равна 0x00FF00FF, значению RGB для пурпурного цвета (magenta). Когда все три аргумента равны 0, цвет — черный; когда все три равны 255 — белый. Макросы GetRValue, GetGValue и GetBValue извлекают беззнаковые символьные значения соответствующих цветов из значения RGB-цвета. Эти макросы иногда полезны, если вы используете функции Windows, возвращающие значение RGB в вашу программу.

Число цветов, возвращаемое функцией GetDeviceCaps, это число чистых цветов, которые может отобразить устройство. В дополнение к чистым цветам Windows может использовать полутона, представляющие собой пиксельный шаблон из пикселей разных цветов. Не все уникальные комбинации байтов красного, зеленого и голубого цветов формируют разные полутоновые шаблоны. Например, на 16-цветном VGA значения красного, зеленого, голубого должны быть возведены в 4-ю степень для получения различных полутонов. Таким образом, для этих адаптеров вы имеете 218 или 262 144 полутона.

Вы можете определить ближайший чистый цвет для любого цвета, используя функцию GetNearestColor:

rgbPureColor = GetNearestColor(hdc, rgbColor);

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]