Битовые образы, зависящие от устройства.

 

 

Вид данного битового образа организован так, чтобы облегчить вывод графической информации (битов) на конкретное физическое устройство. Наиболее часто используемые форматы в этом случае – организация набора цветовых битов на пиксель или набора цветовых плоскостей.

 

 

В первом случае каждому пикселю на экране ставится в соответствие некоторое количество бит. Например, если монитор может отобразить 256 цветов, то используется 8 байт на один пиксель. Для каждой скан-линии (строки растра) первый байт представляет цвет самого левого пикселя, второй байт – следующего пикселя и т.д. Подобная организация видеопамяти, бала, например в CGA – мониторах.

 

 

Пример второго вида организации битовых образов – это EGA и VGA - мониторы, которые в большинстве стандартов поддерживают плоскостное представление изображения. Цветной битовый образ для 16-цветного VGA использует 4 цветовые плоскости для представления 16 цветов. Массив битов начинается с верхней скан-линии. Цветовые плоскости для каждой скан-линии хранятся последовательно: красная плоскость - первой, зеленая плоскость – второй, затем голубая плоскость и плоскость интенсивности. Каждая плоскость имеет свой адрес в оперативной памяти.

 

 

На основе вышеизложенного можно сделать вывод, что в каждом конкретном случае зависимый битовый образ организован по-разному. И если, программа создает сама битовый образ (например, на основе функций CreateBitmap , CreateBitmapInderect ), то она должна сама определять тип, количество цветовых плоскостей. Формат данных функций следующий:

 

 

HBITMAP MyBitmap 1, MyBitmap 2;

 

 

BITMAP MyStruct ;

 

 

MyBitmap 1=CreateBitmap( nWidth , nHeight , cPlanes , cBitsPerPel , lpvBits );

 

 

MyBitmap 2=CreateBitmap Inderect (& MyStruct );

 

 

где nWidth – ширина создаваемого битового образа,

 

 

nHeight - высота создаваемого битового образа,

 

 

cPlanes - количество битовых плоскостей,

 

 

cBitsPerPel - число битов на один пиксель,

 

 

lpvBits - указатель на битовый образ.

 

 

Структура BITMAP содержит перечисленные данные непосредственно.

 

 

Однако, более легким вариантом является создание совместимого битового образа на основе контекста устройства. Это можно сделать при помощи функции:

 

 

HBITMAP MyBitmap ;


 

 

MyBitmap = CreateCompatibleBitmap ( hdc , xWidth , yHeght );

 

 

где hdc – описатель контекста устройства, остальные два параметра определяют ширину и высоту создаваемого битового образа. Созданный таким образом битовый образ будет иметь структуру, определяемую характеристиками устройства.

 

 

Теперь перейдем к вопросу вывода зависимого битового образа на конкретное устройство. Для данного вида графической информации не существует функций, осуществляющих непосредственный вывод в контекст устройства (подобных SetDIBitsToDevice и StretchDIBits для независимых битовых образов ) на основе описателя битовых образов ( HBITMAP ). Для их вывода используется следующий механизм: Битовый образ, выбранный в одном контексте, может быть скопирован в другой контекст. Таким образом, в процессе участвуют два контекста: первый (обычный), в который необходимо скопировать битовый образ, и второй – в котором содержится изображение. Второй контекст, в данном случае, необходимо создать; создается он в памяти и не соответствует конкретному устройству вывода. Он так и называется – контекст памяти. Для того, чтобы дальнейшая работа по копированию битовых образов происходила без проблем, оба контекста должны быть совместимыми, или, говоря другими словами, контекст памяти необходимо создать на основе контекста устройства. Это делается при помощи следующей функции:

 

 

HDC hdcMem ;

 

 

hdcMem = CreateCompatibleDC ( hdc );

 

 

где hdc – описатель контекста, куда будет вестись вывод изображения.

 

 

Второй этап заключается в выборе битового образа в контекст памяти по тому же образу, каким любой объект GDI выбирается в контекст устройства:

 

 

SelectObject ( hdcMem , MyBitmap );

 

 

И только после этого можно скопировать битовый образ в контекст устройства:

 

 

BitBlt ( hdc , xDest , yDest , xWidth , yHeight , hdcMem , xSrc , ySrc , dwROP );

 

 

где xDest , yDest , xWidth , yHeight – определяют координаты прямоугольника на контексте устройства, в который осуществляется вывод изображения, xSrc , ySrc – определяют начальное положение угла источника, с которого начинается вывод, а dwROP – идентификатор знакомой нам растровой операции.

 

 

После окончания работы с контекстом памяти, его необходимо удалить:


– 109 –

 

 

DeleteDC ( hdcMem );

 

 

Существует и аналог масштабируемого вывода для зависимых битовых образов:

 

 

StretchBlt ( hdc , xDest , yDest , xDestWidth , yDestHeight , hdcMem , xSrc , ySrc , xDSrcWidth , ySrctHeight , dwROP ),

 

 

в которой напрямую указываются размера выводимого изображения и размеры приемника.

 

 

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

 

 

Метафайлы

 

 

Метафайлы являются примером другого способа представления графической информации - векторного. В растровом изображении каждой точке некоторой области (листа бумаги, экрана монитора) соответствует некоторое число, определяющее цвет этой точки. В векторной графики существует некоторый набор примитивов (прямых линий, кривых, прямоугольников, закрашенных областей, текста и т.п.), которые задаются непосредственно в виде записей. Например, для точки необходимо хранить две координаты (х и у), для линии – информацию о двух конечных точках линии, для окружности – координаты центра и радиус. Данные записи составляют содержимое метафайла.

 

 

При отображении метафайла на экране, поочередно выбираются записи, в которых содержатся имя графического примитива и его параметры. Для каждого типа примитива вызывается соответствующая функция GDI , которая и рисует примитив на основе его параметров.

 

 

Поскольку метафайл описывает изображение в терминах команд графического вывода, изображение может быть промасштабировано без потери разрешения. С битовыми образами это невозможно: при увеличении битового образа биты будут просто повторяться горизонтально или вертикально, при уменьшении – выбрасываться на основе какого-либо алгоритма.

 

 

Метафайлы могут быть преобразованы в битовый образ без потери информации. Обратное преобразование практически невозможно в общем случае.

 

 

Для создания метафайла сначала создается контекст метафайла:

 

 

HDC hdcmf;

 

 

hdcmf = CreateMetaFile(“name.wmf”);

 

 

где “name.wmf” – имя файла на диске. Если данный параметр функции равен NULL , то метафайл создается в памяти.


 

 

После этого, вы можете рисовать на контексте метафайла точно так же, как и на контексте любого другого устройства. Например,

 

 

LineTo(hdcmf,20,20,80,80);

 

 

Rectandle(hdcmf, 10,10,50,60);

 

 

После закрытия метафайла

 

 

HMETAFILE hmf;

 

 

hmf = CloseMetaFile(hdcmf);

 

 

его в любой момент можно проиграть на любом другом контексте:

 

 

PlayMetaFile(hdc,hmf);

 

 

После окончания работы с метафайлом, его необходимо удалить из памяти:

 

 

DeleteMeteFile(hmf);

 

 

Данная функция удаляет метафайл из памяти. Если же этот метафайл был создан на диске, то выполнение данной функции приведет к тому, что из памяти он удалится, а на диске останется. Прочитать метафайл с диска можно при помощи функции:

 

 

hmf=GetMetaFile(“name.wmf”);








Дата добавления: 2016-11-22; просмотров: 662;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.02 сек.