Основные типы графических режимов, условия и принципы их использования. Функции VGA и VESA BIOS. Простые форматы графических файлов, их содержание и специфика. Формат BMP для несжатого RGB-изображения. Особенности формата PCX для 256-цветов изображений.
С целью увеличения скорости вывода изображения на экран приходится работать непосредственно с аппаратурой контроллера, и программисты вынуждены разбираться со множеством хитростей и трюков, которые были использованы разработчиками оборудования. В настоящее время старые режимы (начиная от монохромных и кончая 16-цветными) вышли из употребления: вывод информации в этих режимах осуществляется очень медленно (вследствие неудачной реализации механизма работы с памятью). Прежде чем можно будет начать работу в каком-либо режиме, необходимо вначале перевести систему в этот режим. Для видеоконтроллеров разделение операций на аппаратные и программные является абсолютно жестким: любые переключения режимов должны выполняться при помощи функций BIOS видеоконтроллера или фирменных драйверов, а выводить информацию нужно напрямую в видеопамять. Графические режимы VGA за прошедшее с момента создания (1987 год) этого типа видеоконтроллеров время сильно устарели, а текстовые используются двадцать лет и продолжают успешно применяться (благодаря простоте выполнения операций в этих режимах).
Введение
графический изображение программирование видеоконтроллер
Развитие аппаратного обеспечения АТ-совместимых персональных компьютеров напоминает рост кораллового рифа: новые компоненты оборудования устанавливаются поверх старых, которые постепенно выходят из употребления (отмирают). Такой способ проектирования имеет один существенный недостаток: архитектура системы все больше и больше захламляется устаревшими, практически не используемыми компонентами. Особенно ясно захламленность системы видна на примере видеоконтроллеров: в каждой новой конструкции сохраняются компоненты всех предшествующих.
С целью увеличения скорости вывода изображения на экран приходится работать непосредственно с аппаратурой контроллера, и программисты вынуждены разбираться со множеством хитростей и трюков, которые были использованы разработчиками оборудования. Чтобы не перегружать читателей бесполезной информацией, в данной главе мы рассмотрим только такие свойства и особенности видеоконтроллеров, которые необходимо учитывать в процессе программирования.
1. Основные типы графических режимов
Современные видеоконтроллеры поддерживают разнообразные текстовые и графические режимы, различающиеся разрешением, палитрой используемых цветов, частотой кадровой развертки и т.д. Текстовые режимы различают по разрешению (числу отображаемых символов по горизонтали и вертикали) и цветовой палитре (возможен монохромный или 16-цветный режим).
Для графических режимов основным признаком классификации является количество одновременно отображаемых цветов и, соответственно, количество двоичных разрядов, необходимых для хранения одной точки изображения. Различают следующие типы графических режимов: 1) монохромный (1 - битное кодирование цвета точки);
2) 4-цветный CGA (2-битное кодирование);
3) 16-цветный EGA/VGA (4-битное кодирование);
4) 256-цветный SVGA (8-битное кодирование);
5) HICOLOR (16-битное кодирование);
6) TRUECOLOR (24-битное или 32-битное кодирование).
При этом принципы работы с видеопамятью для каждого из основных типов видеорежимов настолько отличаются друг от друга, что в современных видеоконтроллерах используется для каждого из этих типов отдельный аппаратный блок. В настоящее время старые режимы (начиная от монохромных и кончая 16-цветными) вышли из употребления: вывод информации в этих режимах осуществляется очень медленно (вследствие неудачной реализации механизма работы с памятью). Поэтому ниже будут рассматриваться только текстовый 16-цветный режим и современные графические режимы.
Прежде чем можно будет начать работу в каком-либо режиме, необходимо вначале перевести систему в этот режим. Однако сделать это не так-то просто. Категорически не рекомендуется начинающим программистам ставить эксперименты по прямому управлению режимами работы видеоконтроллера через его регистры: некорректная установка параметров может вывести из строя монитор. Особенно велик риск для распространенных в нашей стране удешевленных моделей мониторов: снижение цены достигается за счет упрощения конструкции, в частности - ослабления защиты.
Для видеоконтроллеров разделение операций на аппаратные и программные является абсолютно жестким: любые переключения режимов должны выполняться при помощи функций BIOS видеоконтроллера или фирменных драйверов, а выводить информацию нужно напрямую в видеопамять. Переключать видеорежимы только с помощью «родного» программного обеспечения самого контроллера приходится по причине слабой стандартизированности устройств этого типа: с тех пор, как фирма IBM потеряла контроль над рынком персональных компьютеров, разработчики периферийного оборудования в буквальном смысле творят, что хотят. Даже внутри одной фирмы могут существовать несколько разных групп устройств (линий), в каждой из которых применяется собственная внутренняя архитектура. С большим трудом ассоциация VESA сумела стандартизировать функции управления режимами работы видеоконтроллеров.
Устанавливать необходимый видеорежим следует один раз при запуске прикладной программы на весь период ее выполнения. Переключать режимы в процессе работы крайне нежелательно: при этом наблюдаются разнообразные видеоэффекты, которые могут сильно раздражать пользователя (сбой синхронизации, «снег», мерцание и т.д.). Даже такая безобидная операция, как полное гашение экрана монитора на время переключения видеорежима, может быть неприятной для оператора: в течение нескольких секунд он будет не в состоянии контролировать работу системы.
Следовательно, видеорежим должен позволять выполнять все требуемые в программе операции - если требуется вывод и текстовой, и графической информации, то нужно сразу установить графический режим. Существует два основных способа программной установки видеорежима, которые мы рассмотрим ниже: с помощью функций VGA BIOS и с помощью функций VESA BIOS.
2. Функции VGA BIOS
Графические режимы VGA за прошедшее с момента создания (1987 год) этого типа видеоконтроллеров время сильно устарели, а текстовые используются двадцать лет и продолжают успешно применяться (благодаря простоте выполнения операций в этих режимах). Поэтому в настоящее время интерес для программистов представляет только небольшая подгруппа функций из стандартного набора VGA BIOS, предназначенная для работы в текстовом режиме: 1) установка режима;
2) управление положением и размером курсора;
3) переключение страниц;
4) управление шрифтами.
Для вызова функций VGA BIOS используется прерывание Int 10h. Набор функций очень большой, но в целом - устаревший. Ниже рассматриваются только те функции, применение которых до сих пор является целесообразным.
3. Функции VESA BIOS
Программистам приходится иметь дело с прерываниями VESA BIOS в тех случаях, когда система функционирует под управлением любой типовой однозадачной (например, MS-DOS) или самодельной многозадачной (например, Linux) операционной системы, так как фирмы-изготовители поставляют драйверы только для Windows.
Стандарт VESA унифицировал некоторые наиболее важные операции при работе с видеоконтроллером - установку видеорежимов и управление видеопамятью. Начиная с версии 2.0, данный стандарт поддерживает работу с линейным буфером видеопамяти. Полное описание стандарта VESA 3.0 на английском языке [96] можно свободно загрузить из Интернета с сервера ассоциации VESA.
Обращение к VESA BIOS выполняется по прерыванию 10h с номером функции 4Fh. После выполнения вызова в регистре АХ будет возвращен код результата (статус возврата). В AL будет находиться основной код возврата: если AL = 4Fh - вызов успешно выполнен, если AL 4Fh - вызванная функция не поддерживается данной версией BIOS. В АН будет записан код, поясняющий результат: 1) 0 - вызов функции успешно выполнен;
2) 1 - вызов не выполнен;
3) 2 - функция не поддерживается в данной аппаратной конфигурации;
4) 3 - вызов функции невозможен в данном видеорежиме.
4. Простые форматы графических файлов
Задача вывода изображений на экран тесно связана с двумя другими задачами - сохранения изображений на диске в виде файлов и считывания изображений с диска. Существует множество различных форматов графических файлов, однако эти форматы отличаются обычно значительной сложностью. Далее мы рассмотрим два самых простых формата файлов - формат BMP (для несжатого RGB-изображения) и формат PCX для 256-цветных режимов.
5. Формат BMP для несжатого RGB-изображения
Формат файла BMP для несжатого RGB-изображения показан в таблице 1. Это самый простой из всех форматов, он воспринимается большинством графических редакторов, но порождает файлы гигантских размеров, поскольку одна точка изображения кодируется тремя байтами данных, по байту на каждый из цветовых компонентов (аналогично формату TRUECOLOR24).
Формат файла BMP для несжатого RGB-изображения
Смещение Размер Значение Описание
OOH WORD 4D42h (BM) Признак файла BMP
02h DWORD 3XLXH 54 Полный размер файла в байтах
06b WORD 0 Не используется
08h WORD 0 Не используется
OAH DWORD 54 (36h) Смещение области данных изображения от начала файла
OEH DWORD 40 (28h) Размер описателя изображения
12h DWORD L Ширина изображения в пикселах
16h DWORD H Высота изображения в пикселах
1Ah WORD 1 Число битовых плоскостей
1Ch WORD 24 (18h) Число битов на пиксел
1Eh DWORD 0 Метод сжатия
22h DWORD 3XLXH Размер изображения в байтах
26 h DWORD 0 Разрешение по горизонтали в пикселах на метр
Создание файла BMP начинается с заполнения заголовка. Как видно из таблицы, в формате RGB большая часть полей заголовка заполняется строго определенными значениями (константами), никак не зависящими от вида и размеров изображения. Переменными параметрами являются только ширина изображения L, высота изображения Н, размер изображения в байтах (равен умноженному на три произведению ширины и высоты) и полный размер файла в байтах (является суммой размера изображения и размера заголовка). Допустим, нужно сохранить изображение размером 1024x768 точек. Тогда ширина L=1024, высота Н=*768, размер изображения равен 2 359 296 байт, а размер файла - 2 359 350 байтов.
Другой неприятной особенностью формата BMP является перевернутый (по отношению к экрану монитора) порядок записи строк в файл - первой записывается самая нижняя строка изображения. Проявляет себя этот недостаток только в том случае, если изображение по высоте превышает размеры экрана, а его просмотр нужно начинать с левого верхнего угла - чтобы добраться до верхней строки, приходится прокручивать файл до самого конца. Использование метода Родена обеспечивает под управлением DOS доступ ко всей оперативной памяти, что позволяет нейтрализовать недостатки формата BMP (большой объем файлов и перевернутый порядок строк).
6. Формат PCX для 256-цветных изображений
Если необходимо экономить дисковое пространство, то для 256 - цветных изображений лучше использовать формат PCX со сжатием по алгоритму Run Length Encoding (RLE). Файл PCX состоит из трех частей: заголовка, сжатого изображения и таблицы палитры.
Вообще говоря, данные в файлах PCX могут храниться в несжатом виде - в этом случае байт признака уплотнения данных в заголовке файла имеет значение 0. Неупакованный PCX формат может использоваться, например, для хранения черно-белых фотографий в формате 256 оттенков серого.
Однако в целях сокращения объема файла обычно применяется сжатие по RLE. Способ кодирования RLE предполагает выделение последовательностей пикселов одинакового цвета и запоминание количества повторений в специальном байте-счетчике. Каждая строка изображения кодируется отдельно, причем правила кодирования следующие: 1) отдельная точка со значением кода цвета менее COH будет просто представлена своим кодом;
2) отдельная точка со значением кода цвета, которое больше или равно COH, записывается в виде пары кодов, первым из которых будет байт счетчика со значением Clh, а вторым - собственно байт кода цвета точки;
3) горизонтальный отрезок из N (не более 63) одноцветных точек будет представлен парой кодов, первым из которых будет байт счетчика со значением N COH, а вторым - байт кода цвета.
Если в байте версии файла PCX установлено значение 5, то последние 769 байт файла хранят структуру, содержащую байт - признак формата регистров ЦАГ1 и следующую за ним таблицу палитры (768 байт). Если в байте признака формата регистров записано значение OAH, то используется 6-разрядное кодирование основных цветовых компонентов, а если значение OCH - 8-разрядное кодирование. Таблицу нужно загрузить в регистры ЦАП видеоконтроллера при помощи подфункции 12h функции 10h прерывания Int 10h в соответствии со значением байта признака формата. Каждая из 256 строк таблицы состоит из трех байтов, содержащих значения компонентов соответствующего цветового оттенка в порядке, используемом функцией загрузки палитры: красный, зеленый, синий.
Палитра PCX в 256-цветном режиме часто не совпадаете используемой по умолчанию палитрой VGA, что создает дополнительные сложности при просмотре изображений - если кроме картинки вы хотите вывести какой-то поясняющий текст, то он поменяет цвет при смене палитры. Поэтому, несмотря на то, что в файле кодирование 256-цветное, при его создании и последующем просмотре удобнее всего использовать графические режимы TRUECOLOR. При обмене информацией между программами при помощи РСХ - файлов возможны ситуации трех основных видов: 1) требуется передавать изображение только между своими программами, входящими в один пакет;
2) требуется принять изображение, созданное чужой программой;
3) нужно передать (транспортировать) изображение из своей программы в чужую.
При обмене файлами изображений внутри одного программного пакета никаких особых сложностей нет: можно использовать любую цветовую палитру. Вообще говоря, для транспортировки данных вы даже можете создать на основе принципа RLE свой собственный метод сжатия информации, нестандартный, но оптимальный в вашем конкретном случае.
При приеме файлов из чужих программ приходится либо устанавливать ту палитру, которая приходит вместе с файлом (что приводит к искажению цветов в вашей программе), либо производить перекодировку цветов изображения из чужой палитры в свою (что приводит к искажению изображения), либо работать в режиме TRUECOLOR (что связано с проблемами совместимости видеоконтроллеров).
При транспортировке файлов из своего пакета программ в чужой следует учитывать, что многие редакторы изображений корректно работают только с восьмибитовым форматом цветовых компонентов, то есть значение байта признака формата регистров ЦАП должно быть равно ОСИ, а данные в таблице палитры должн ы соответствовать этому формату. Например, если нужно передать в MS Photo Editor файл, созданный в стандартном 256-цветном VGA-режиме DOS, то после считывания палитры из регистров ЦАП нужно перед записью таблицы в файл сдвинуть в ней каждый байт данных влево на два разряда.
Если требуется реализовать режим фотографии с 256 градациями серого цвета, то соответствующую таблицу палитры нужно вначале сформировать. Генерация таблицы выполняется по примитивному алгоритму: в первую строку записываются три байта со значением ноль, а в каждой следующей строке значения для всех компонент увеличиваются на 1 (получаем в результате в первой строке черный цвет, а в последней - белый).
Ситуация, когда приходится иметь дело с графическим редактором, работающим только с конкретной палитрой, возникает довольно редко. Однако если такая необходимость есть, то приходится заимствовать таблицу палитры вместе с байтом формата ЦАП. Для этого нужно создать файл (для любого произвольного изображения) в чужом пакете, «взять» из него последние 789 байт и либо записать в виде загружаемого двоичного файла, либо перекодировать в текстовый include-файл. Все изображения, которые вы предназначаете для работы с таким редактором, должны создаваться с использованием заимствованной палитры.
Список литературы
1. Авдеев, В.А. Периферийные устройства: интерфейсы, схемотехника, программирование/В.А. Авдеев. - М.: Изд-во ДМК Пресс, 2009. - 492 с.
2. Гук, М. Аппаратные средства IBM PC. Энциклопедия. 3-е изд./ М. Гук. - СПБ.: Изд-во Питер, 2006. - 234 с.
3. Гук, М. Интерфейсы устройств хранения: ATA, SCSI и другие. Энциклопедия/ М. Гук. - СПБ.: Изд-во Питер, 2007. - 742 с.
4. Лапин, А.А. Интерфейсы: выбор и реализация. /А.А. Лапин. - М,: Изд-во Техносфера, 2005. - 508 с.
Размещено на
Вы можете ЗАГРУЗИТЬ и ПОВЫСИТЬ уникальность своей работы