Основы компьютерной графики
Пиксели и координаты
В компьютерной графике для указания местоположения графического объекта используются математические координаты, однако, поверхность отображения устройства вывода — это реальный физический объект. Следовательно, необходимо помнить о различии между физическими и логическими пикселями.
Физические пиксели
Физические пиксели — это реальные точки, отображаемые на устройстве вывода Физические пиксели — наименьшие физические элементы поверхности отображения, которые можно обрабатывать аппаратным или программным способом. Так принято считать, хотя на практике устройства отображения могут формировать отдельный пиксель из нескольких более мелких элементов. В большинстве аналоговых устройств на базе цветной электроннолучевой трубки при отображении используется несколько по-разному окрашенных точек, которые человеческий глаз, находящийся на достаточном от них расстоянии, воспринимает как единый, однородно окрашенный пиксель.
Поскольку физические пиксели занимают определенную площадь поверхности отображения, то на расстояния между двумя соседними пикселями вводятся ограничения. Если вы зададите устройству отображения слишком высокую разрешающую способность (т.е. слишком большое количество пикселей на единицу поверхности отображения), то качество изображения снизится из-за наложения или слияния соседних пикселей.
Логические пиксели
В противоположность физическим пикселям, логические пиксели подобны математическим точкам – они имеют местоположение, но не занимают физического пространства. Таким образом, при отображении значений логических пикселей из растровых данных в физические пиксели экрана должны учитываться реальные размер и расположение физических пикселей. Иначе, например, плотный и ярко окрашенный растр при отображении на слишком большой монитор может утратить эти качества, поскольку пиксели окажутся разбросанными по всему экрану
Пиксельная глубина и устройства отображения
Чем больше количество битов, используемых для представления пикселя, тем больше количество возможных цветов пикселя. Однако для хранения таких пиксельных значений требуется значительный объем памяти.
Наиболее современные устройства вывода могут отображать от двух до шестнадцати с лишним миллионов цветов одновременно; при этом для хранения одного пикселя требуются соответственно от одного до двадцати четырех битов. Двухуровневые, или однобитовые, устройства отображения для представления пикселя используют один бит; при этом пиксель может быть окрашен в один из двух цветов. Наиболее известными однобитовыми устройствами отображения являются монохромные мониторы и черно-белые принтеры. Изображения, которые хорошо визуализируются в черно-белом исполнении (чертежи, тексты и иллюстративные вставки некоторых типов), обычно хранятся в виде однобитовых данных.
Человеческий глаз способен различать (но не воспринимать одновременно) около 224 (16777216) цветов. Фактически количество цветов, которое может зафиксировать человеческий глаз, весьма индивидуально и, кроме того, зависит от условий освещенности, состояния здоровья и внимания. В любом случае каждый из нас способен различать достаточно много цветов (обычно, более нескольких тысяч). Об устройствах, которые способны достичь или даже превысить возможности цветовосприятия человеческого глаза, говорят, что они отображают truecolor. На практике этот термин характеризует устройства, использующие 24 бита на пиксель, хотя ранее он использовался и для устройства вывода, способного отображать 215 (32768) и 216 (65536) цветов.
Для дисплеев, способных отображать 215 или 216 цветов, больше подходит термин hicolor. Иногда для таких устройств применяется термин fullcolor (полноцветный).
Цветовые пространства
Чтобы передать цвет, нужно задать несколько значений (обычно три), определяющих интенсивность каждого и s основных цветов (цветовых каналов), которые смешивают для получения составных цветов. Составной цвет задается упорядоченным набором значений. Конкретный цвет представляет собой точку на графическом отображении всех возможных цветов. Поэтому иногда говорят, что цвет — это точка в цветовом пространстве.
Наиболее распространенным способом передачи цвета является модель RGB. В этой модели цвета красный, зеленый и синий считаются основными, т.е. несоставными. Цвет задается посредством RGB-триплета — (R, G, В) Цветовые триплеты иногда интерпретируются как проценты, хотя фактически это не так. Цвета модели RGB можно было бы охарактеризовать следующим образом:
(0%, 0%, 0%) Черный
(100%, 100%, 100%) Белый
(100%, 0%, 0%) Красный
(50%, 50%, 50%) Светло-серый
и т.д.
Каждый из этих RGB-триплетов позволяет определить точку в пространстве RGB.
При сохранении цветовых данных в файле более практично задавать цветовые компоненты не в процентах, а в виде числовых величин. Если для каждого цветового компонента отводится 1 байт (8 битов), то диапазон допустимых величин составляет 0—255. Поскольку обычно цвета определяются 24 битами (3 байтами), то вполне разумно присвоить каждому из трех байтов значение одного из компонентов цветовой модели. Например, в модели RGB для каждого цвета используются 3 байта, а цвета обычно сохраняются в виде RGB-триплетов с диапазоном от 0 до 255, причем, значение О соответствует нулевой интенсивности, а значение 255 — максимальной.
RGB = ([0-2551, [0-255]/ [0-255])
Следовательно, в предыдущем примере пиксельные значения должны иметь следующий вид:
(0, 0, 0) Черный
(255, 255, 255) Белый
(255, 0, 0) Красный
(127, 127, 127) Светло-серый
Иногда создатели формата или программы извращают "естественный" смысл определения цветов: RGB (О, О, О) у них становится белым, a RGB (255, 255, 255) - черным. К счастью, это случается редко. RGB и другие цветовые модели рассматриваются в разделе "Как представляются цвета".
Часто набор цветов, который задается пиксельными значениями, записанными в файле, отличается от того, который может быть отображен на конкретном устройстве вывода. Задача согласования наборов цветов обычно решается программой визуализации, которая осуществляет преобразования цветов, заданных в файле, в цвета устройства отображения. Если количество цветов, заданных пиксельными значениями в файле (источнике), значительно меньше количества цветов, которые может отображать устройство вывода (адресат), то проблем обычно не возникает. В этом случае программа визуализации выбирает для каждого цвета источника соответствующий цвет адресата. В противном случае могут возникнуть определенные трудности. Рассмотрим следующие примеры.
Данные с четырьмя битами на пиксель (соответствующие 16 цветам) отображаются на устройстве, способном поддерживать 24-битовые данные (соответствующие более чем 16 миллионам цветов). Устройство вывода способно отобразить намного больше цветов, чем нужно для визуализации изображения из файла. Таким образом, цвета растровых данных будут без труда воспроизведены на выводящем устройстве при условии, что цвета исходного растра и устройства-адресата равномерно распределены среди всех возможных цветов.
Бывает так, что устройство вывода способно отобразить меньшее количество цветов, чем определено в исходных данных. Примером может служить воспроизведение данных с восемью битами на пиксель (соответствующих 256 цветам) на устройстве, способном отображать 4-битовые данные (соответствующие 16 цветам). В этом случае цвета, определенные в растре, не могут быть представлены 4-битовым устройством. Следовательно, программа визуализации должна выполнить определенную работу, сопоставляя наборы цветов источника и адресата: количество цветов, имеющихся в исходных данных, должно быть приведено в соответствие с тем количеством, которое способно отобразить устройство-адресат.
Этот процесс, называемый квантованием, сопровождается потерей данных. Если исходное изображение содержит много цветов, то квантование может привести к появлению нежелательных эффектов — артефактов квантования. Примерами артефактов квантования являются муар и возникновение новых контуров и цветов в конечном изображении. Тем не менее, артефакты квантования находят применение: один из типов процесса квантования, называемый сверткой, иногда используется для удаления "шумов" с изображения, хотя и может изменить цветовой баланс результирующего изображения по сравнению с исходным.
Очевидно, что пиксельные значения записываются в файл с учетом цвета. Рассмотрим некоторые аспекты задания цвета пикселя.
Однобитовые данные могут принимать значения 0 или 1 и представляют двухцветные изображения. Следовательно, сопоставить пиксельные значения в файле можно только с двумя цветами экрана. Чаще всего действующие соглашения однозначно определяют, какое значение какому цвету соответствует, хотя в некоторых случаях это сделать достаточно сложно. Кроме того, в процессе работы это соглашение может быть изменено программой визуализации
Пиксельные данные, содержащие более одного бита на пиксель, обычно представляются набором индексов в палитре цветов, хотя в некоторых случаях применяется непосредственное представление цвета в соответствии со схемой определения цветов
Определение цвета с помощью палитры
Палитра, называемая также картой цветов, картой индексов, таблицей цветов или таблицей перекодировки, представляет собой одномерный массив цветовых величин. Одним из синонимов термина палитра является таблица перекодировки С помощью палитры цвета задаются косвенно, посредством указания их позиций в массиве При использовании этого метода данные могут быть записаны в файл в виде последовательности индексов (обычно небольших целых чисел), что позволяет значительно сократить объем пиксельных данных о растровых изображениях, для обработки которых применяется такой способ представления цветов, говорят, что в них использовалась косвенная, или псевдоцветная запись.
Например, 4-битовые пиксельные данные могут быть использованы для представления изображений, содержащих 16 цветов. Эти 16 цветов обычно определены в палитре, которая почти всегда включается в тот же самый файл. Каждое пиксельное значение рассматривается как индекс в этой палитре и содержит одно из чисел в диапазоне 0—15 Программа визуализации, читая из файла пиксельное значение, использует его как индекс палитры, что позволяет получить из этой палитры то значение цвета, которое и будет использовано для окрашивания пикселя на устройстве вывода
Палитра представляет собой массив цветовых величин, заданных с максимально возможной точностью. На практике каждый элемент палитры обычно занимает 24 бита, или 3 байта, хотя с учетом возможных будущих расширений и зависимости от аппаратного обеспечения элементы палитры иногда сохраняются в 32 битах, или 4 байтах Любопытно отметать, что цветовые модели, многие из которых существуют с начала компьютерной эры, часто базируются на трех первичных цветах, следовательно, использование трех байтов для хранения данных в них также возможно.
Из изложенного следует, что объем памяти в байтах, занимаемый палитрой, в три или четыре раза больше, чем максимальное количество определяемых ею цветов. К примеру, объем памяти, занимаемой палитрой, которая задает 4-битовый цвет, определяется следующим образом:
3 байта на цвет * 16 цветов = 48 байтов
или
4 байта на цвет * 16 цветов = 64 байта
— в зависимости от того, три или четыре байта используются для хранения каждого цвета.
Аналогично 8-битовые пиксельные данные могут быть использованы для представления изображений, состоящих из 256 цветов. Каждое пиксельное значение будет принадлежать диапазону 0—255, представляя собой индекс в 256-цветной палитре. Объем памяти, занимаемый такой палитрой, составит:
3 байта на цвет * 256 цветов = 768 байтов
или
4 байта на цвет * 256 цветов == 1024 байта
Предположим, что в цветовой модели, используемой вашим форматом изображения, значение (255, О, О) соответствует красному цвету. Определим примерную палитру в виде массива из 16 элементов.
( 0, 0, 0)
(255, 255, 255)
(255, 0, 0)
( 0, 255, 0)
( 0, 0, 255)
(255, 255, 0)
( 0, 255, 255)
(255, 0, 255)
(128, 0, 0)
( 0, 128, 0)
( 0, 0, 128)
(128, 128, 0)
( 0, 128, 128)
(128, 0, 128)
(128, 128, 128)
(255, 128, 128)
Поскольку в этой палитре значение (255,0,0) имеет третий элемент, то для записи этого цвета мы можем использовать значение 2 (естественно, если отсчет индексов этого массива начинается с 0), предположив в соответствии с принятым соглашением, что это значение будет интерпретировано как индекс данного массива. Следовательно, всякий раз, для того чтобы задать красный цвет в пиксельных данных, мы можем сохранять значение 2. Аналогичным образом мы будем поступать и в отношении всех остальных цветов, из которых состоит данное изображение.
Цветовая информация может занимать большой объем памяти. В некоторых случаях применение палитр значительно повышает эффективность использования памяти при сохранении цветов; в других случаях более эффективно прямое сохранение цветов.
В больших и сложных форматах изображений косвенное сохранение цветов с использованием палитр экономит память за счет сокращения объема данных, записываемых в файл. Например, если вы применяете формат, сохраняющий трехбайтовую цветовую информацию для каждого пикселя (наиболее распространенный случай), и используете 256 цветов, то пиксельные значения растра размером 320х200 пикселей потребуют 192000 (320 * 200 * 3) байтов памяти. Если это же изображение сохранить с использованием палитры из 256 3-байтовых элементов, то для каждого пикселя в растре потребуется только один байт, содержащий значение индекса в диапазоне от 0 до 255. В результате освободятся два из трех байтов, требуемых для каждого пикселя, и соответственно необходимый объем памяти сократится до 64000 (320 * 200 * 1) байтов.
В действительности мы должны учитывать еще и объем памяти, требуемый для сохранения самой палитры — 768 (256 * 3) байтов. В результате для сохранения данных такого файла потребуется 64768 байтов, что приблизительно в три раза меньше, чем в случае прямого сохранения цветов. Однако следует обратить внимание на то, что если объем растровых данных в файле невелик, то включение палитры может привести к обратному результату — требуемый объем памяти возрастет, если объем, необходимый для включения палитры, превысит сэкономленный.
Косвенное задание цветов с использованием палитры имеет несколько очевидных преимуществ. Во-первых, если вам нужно знать реальное количество цветов, сохраненных в изображении (256-цветное изображение не всегда содержит 256 цветов), то достаточно прочесть палитру и определить, какие из ее элементов используются иди повторяют другие. В большинстве форматов неиспользуемые элементы обычно установлены в 0.
С помощью палитр чрезвычайно удобно изменять цвета изображений. Например, если вы хотите заменить при визуализации изображения все красные пиксели зелеными, то вам достаточно просто изменить в палитре значение, определяющее красный цвет, на значение, определяющее зеленый.
Тем не менее, что использование палитры оправдано не во всех случаях. Ведь для сохранения ее самой требуется дополнительный объем памяти. Например, для размещения палитры, определяющей 32768 цветов, потребуется как минимум 98304 байта памяти. Исходя из этого, изображение, содержащее более 256 цветов, обычно сохраняется в формате без использования палитры, где каждое пиксельное значение прямо задает один цвет.
Применение палитр значительно упрощает решение проблемы, связанной с ограниченным количеством цветов на некоторых устройствах отображения. Однако если устройство не нуждается в помощи такого рода. то использование формата, основанного на палитре, усложняет процесс вывода изображения. Действительно, если устройство отображения может обеспечить truecolor, то, очевидно, целесообразнее применять формат, поддерживающий точное задание цвета, даже если изображение состоит всего из нескольких цветов. Как правило, для хранения изображения, которое включает тысячи и миллионы цветов, лучше применять формат, поддерживающий точное задание цвета, поскольку при использовании формата, основанного на палитре, может случиться так, что размер памяти для ее хранения превысит размер данных растрового изображения.
Прежде чем продолжить обсуждение проблемы сохранения цветов в файле, мы хотим немного отклониться от темы и вкратце обсудить вопрос определения цветов. Разговор о палитрах мы закончим в разделе "... И назад к палитрам", приведенном далее в этой главе.
Термин truecolor используется при работе с изображениями, в которых применяется большое количество цветов. Что мы подразумеваем здесь под понятием "большое количество"? Принимая во внимание нынешние цены на жесткие диски, а также то, что некоторые пользователи уже имеют в своем распоряжении более 1 Гб дискового пространства, мы, тем не менее, считаем, что большинство людей рассматривает объем в 100-200 Кб как сравнительно большой. Если вспомнить, что для сохранения палитры из 256 цветов потребуется не более 1 Кб памяти, а для сохранения палитры из 32768 и более цветов — как минимум около 100 Кб, то станет очевидным, что количество цветов 256 не считается "большим", а вот 32768, 65536 и 16,7 миллионов для большинства пользователей уже "большое". При этом мы рассматривали только объем памяти, необходимый для сохранения самой палитры, — а ведь еще есть данные изображения!
Вместо того, чтобы включать в файл палитры такого большого объема, можно представить пиксельные значения в виде явно заданных цветовых величин. На практике эти значения состоят из трех частей, каждая из которых представляет основной цвет в используемой цветовой модели, например в RGB. Пиксельные значения изображений, использующих 32768 или 65536 цветов, обычно сохраняются в двух смежных байтах (или 16 битах) файла, поскольку практически все компьютеры обрабатывают байты как минимально адресуемую единицу памяти. Программа визуализации должна в этом случае читать такие 16-битовые пиксельные значения и раскладывать их на 5-битовые цветовые составляющие:
16 битов = 2 байта = (8 битов, 8 битов) = (1, 5, 5, 5) = (1, R, G, В)
Каждый 5-битовый компонент может принимать значения из диапазона 0—32. В случае 32768-цветного RGB-изображения используются только 15 битов, а один бит отбрасывается или применяется для других целей. Для 65536-цветньи RGB-изображений 16-битовые пиксельные значения раскладываются асимметрично, чтобы использовать и этот лишний бит. Ниже приведен один из вариантов такого разложения:
16 битов = 2 байта = (8 битов, 8 битов) = (6, 5, 5) = (R, G, В)
На практике обычно используется следующее разложение:
16 битов = 2 байта = (8 битов, 8 битов) = (5, 6, 5) = (R, G, В)
При таком разложении лишний бит используется для зеленой составляющей, поскольку человеческий глаз более чувствителен к зеленому цвету, чем к красному или синему. Порядок следования цветовых составляющих произвольный, а порядок и обработка цветовых составляющих в пиксельном значении разные в различных форматах. Из этого следует, что составляющие 16-битового пиксельного значения могут быть интерпретированы и как (G, В, R), и как (R, G, В), и как (В, R, G). Задание цветов RGB в последовательности (R, G, В) представляется более предпочтительным, поскольку в данном случае цвета упорядочены в соответствии со своими электромагнитными частотами, определяющими их место в физическом спектре.
24-битовые пиксельные значения сохраняются либо в 3 байтах
24 бита = 3 байта = (8 битов, 8 битов, 8 битов) = (R,G,B)
либо в 4 байтах
24 бита = 4 байта = (8 битов, б битов, 8 битов, 8 битов) = (R, G, В, неиспользуемый)
Равномерное распределение памяти для цветовых составляющих модели (один байт на каждую составляющую) является наиболее распространенным.
Типы палитр
Говоря о палитрах, необходимо учитывать их особенности.
Одноканальная палитра предусматривает только одну цветовую величину для каждого элемента, причем эта цветовая величина явно указывает цвет пикселя. Каждый элемент одноканальной палитры может быть представлен, например, в таком виде:
(G) = (223)
Многоканальная палитра предусматривает две и более отдельные цветовые величины для каждого цветового элемента. Например, каждый элемент трехканальной палитры, использующей красный, зеленый и синий цвета, может быть представлен следующим образом:
(R, G, В) = (255, 128, 78)
В данном случае величина R определяет значение для первого канала, величина G — для второго, а В — для третьего канала. Если изображение состоит из четырех цветовых составляющих, как в случае цветовой системы CMYK, то используется четырехканальная цветовая таблица, и т.д.
Пиксельно-ориентированные палитры хранят все данные о цветах пикселей в виде последовательности битов в каждом элементе массива. Как мы уже отмечали, в палитре RGB каждый элемент представляет собой триплет цветовых величин, что соответствует способу сохранения в файле пиксельных значений.
В плоскостно-ориентированной палитре цветовые составляющие пикселя разделены; величины, соответствующие определенному цветовому каналу, сохраняются вместе, и палитра в этом случае как бы состоит из трех одноканальных палитр — по одной для каждого цветового канала. Этим определяется и способ записи пиксельных значений в файле (в виде множества цветовых плоскостей):
(RRRRR...GGGGG...ВВВВВ) ИЛИ (ВВВВВ...GGGGG...RRRRR)
Следовательно, маленькая палитра может выглядеть так:
(R) (R) (R) (G) (G) (G) (В) (В) (В) ИЛИ (В) (В) (В) (G) (G) (G) (R) (R) (R)
Хотя подобная палитра больше напоминает одну палитру, состоящую из трех цветовых плоскостей, но лучше ее визуализировать в виде трех отдельных палитр, каждая из которых состоит из одной цветовой плоскости.
Из изложенного очевидно, что и одноканальные, и многоканальные палитры могут быть как пиксельно, так и плоскостно-ориентированными. Перечислим их возможные варианты:
· Одноканальная пиксельно-ориентированная палитра содержит одно пиксельное значение на элемент.
• Многоканальная пиксельно-ориентированная палитра также хранит по одному пикселю на элемент, но каждый пиксель содержит два или более цветовых канала данных.
• Одноканальная плоскостно-ориентированная палитра хранит один пиксель на индекс и один бит на плоскость
• Многоканальная плоскостно-ориентированная палитра содержит одно значение цветового канала на элемент.
Количество элементов палитры определяется по формуле 2n (где я — размер пиксельного значения в файле) и обычно соответствует максимальному количеству цветов заданного изображения. Например, 8-битовое пиксельное значение может представлять 256 (28) различных цветов и поддерживается 256-элементной палитрой. Если изображение состоит из меньшего, чем палитра, количества цветов, то все неиспользованные элементы палитры должны иметь нулевые значения. Некоторые форматы, особенно CGM и TGA, могут при необходимости изменять количество элементов палитры Если TGA-изображение состоит только из 57 цветов, то оно может быть представлено палитрой, состоящей из 57 элементов
Также интересно отметить, что используемые элементы палитры не всегда следуют один за другим, не всегда упорядочены и не всегда начинаются с первого индексного значения. Двухцветное изображение с 256-цветной палитрой (да, бывает и такое) может использовать цвета, обозначенные в палитре индексами 0 и 1, 0 и 255, 254 и 255 или даже 47 и 156 Местоположение применяемых элементов палитры задается программой, записывающей изображение в файл, и, следовательно, тем программистом, который создавал эту программу.
Примеры палитр
Рассмотрим несколько примеров палитр. Простейшей является двухцветная или монохромная, палитра:
/* BYTE - 8-битовый символ */
typedef struct_MonoPalette
{
BYTE color[2] ;
} MONO_PALETTE;
MONO_PALETTE Mono = { {0х00, 0х01} };
В этом примере двухэлементный массив содержит цветовые величины 0х00 и 0х01 в элементах 0 и 1 соответственно. Все пиксельные значения в файле являются индексами. Пиксель со значением 0 рассматривается как индекс цвета, представленного значением 0х00. Аналогично пиксель со значением 1 рассматривается как индекс цвета, заданного значением 0х01. Поскольку в данном случае растр состоит только из двух цветов и цвет каждого пикселя может быть представлен 1 битом, то удобнее сохранять эти значения непосредственно в растре в виде битовых величин. Это действительно проще, однако некоторые форматы ориентированы только на применение палитр и поэтому требуют, чтобы таковые имелись даже для монохромных растров.
В следующем примере рассмотрим 16-элементную палитру, используемую в качестве полутоновой:
/* BYTE — это 8-Оитовый символ */
typedef struct_GrayPalette
{
BYTE Color[16) ;
} GRAY_PALETTE;
GRAY_PALETTE Gray =
{
{0х00,
0х14,
0х20,
0х2с,
0х38,
0х45,
0х51,
0х61,
0х71,
0х82,
0х92,
0ха2,
0xb6,
0xcb,
0хеЗ,
0xff}
};
Обратите внимание на то, что в обоих примерах каждый цветовой элемент в палитре представлен одной величиной. следовательно, эти палитры одноканальные. Проще использовать трехканальную палитру, в которой каждый полутон будет представлен соответствующим триплетом RGB:
typedef struct _RGB
{
BYTE Red; /*3начение красного канала*/
BYTE Green; /*3начение зеленого канала*/
BYTE Blue; /*3начение синего канала*/
} RGB;
RGB Gray[16] =
{
(0х00, 0х00, 0х00),
(0х14, 0х14, 0х141,
(0х20, 0х20, 0х20),
(0х2с, 0х2с, 0х2с),
(0х38, 0х38, 0х38),
(0х45, 0х45, 0х45),
(0х51, 0х51, 0х51),
(0х61, 0х61, 0х61),
(0х71, 0х71, 0х71),
(0х82, 0х82, 0х82),
(0х92, 0х92, 0х92),
(0ха2, 0ха2, 0ха2),
(0xb6, 0xb6, 0xb6),
(0xcb, 0xcb, 0xcb),
(0хе3, 0хе3, 0хе3),
(0xff, 0xff, 0xff)
};
Выше приведен пример пиксельно-ориентированной многоканальной палитры. Для хранения информации о цветах в плоскостно-ориентированном виде ее можно преобразовать следующим образом:
TYPEDEF struct _PlanePalette
{
BYTE Redt16]; /* Значение красной плоскости */
BYTE Green[161; /* Значение зеленой плоскости */
BYTE Blue[16]; /* Значение синей плоскости */
} PLANE_PALETTE;
PLANE_PALETTE Planes =
{
(0х00, 0х14, 0х20, 0х2с, 0х38, 0х45, 0х51, 0х61, /* Красная плоскость */
0х71, 0х82, 0х92, 0ха2, 0xb6, 0xcb, 0хеЗ, 0xff),
(0х00, 0х14, 0х20, 0х2с, 0х38, 0х45, 0х51, 0х61, /* Зеленая плоскость */
0х71, 0х82, 0х92, 0ха2, 0xb6, 0xcb, 0хеЗ, 0xff),
(0х00, 0х14, 0х20, 0х2с, 0х38, 0х45, 0х51, 0х61, /* Синяя плоскость */
0х71, 0х82, 0х92, 0ха2, 0xb6, 0xcb, 0хеЗ, 0xff)
};
И, наконец, еще один пример — широко используемая палитра IBM VGA. Эта 256-цветная палитра состоит из встроенной 16-цветной палитры EGA, 16-элементной полутоновой палитры и 24-цветной палитры с девятью вариантами насыщенности и интенсивности для каждого цвета. Обратите внимание на то, что последние восемь элементов не используются и, следовательно, имеют нулевое значение:
struct _VgaPalette
{
BYTE Red;
BYTE Green;
BYTE Blue;
} VGA_PALETTE;
VGA_PALETTE VgaColors[256] =
{
/* EGA Color Table */
(0х00 | 0х00 | 0х00) | (0х00 | 0х00 | 0хаа) |
(0х00 | 0хаа | 0х00) | (0х00 | 0хаа | 0хаа) |
(0хаа | 0х00 | 0х00) | (0хаа | 0х00 | 0хаа) |
(0хаа | 0х55 | 0х00) | (0хаа | 0хаа | 0хаа) |
(0х55 | 0х55 | 0х55) | (0х55 | 0х55 | 0xff) |
(0х55 | 0xff | 0х55) | (0х55 | 0xff | 0xff) |
(0xff | 0х55 | 0х55) | (0xff | 0х55 | 0xff) |
(0xff | 0xff | 0х55) | (0xff | 0xff | 0xff) |
/* Gray Scale Table */