Растровое изображение – класс TBitmap

 

В Windows предусмотрены две основные формы хранения изображений: растровая (bitmap) и векторная (metafile). Класс TBitmap соответствует растровому (битовому) образу – цифровому представлению изображения.

На практике битовые образы используются для хранения высококачественных изображений (фотографий, видео). За хорошее качество приходится платить объемом используемой памяти. Потребности в памяти возрастают в прямой пропорции с размерами изображения и глубиной цвета. Другой недостаток растровых образов заключается в сложности качественного масштабирования картинки. Любое изменение размера битового образа требует либо дублирования строк и столбцов, либо их удаления, что неблагоприятным образом сказывается на качестве изображения.

В Windows поддерживается два формата хранения растровых изображений: ппаратно-зависимая битовая карта (Device Depended Bitmap, DDB) и аппаратно-независимая битовая карта (Device Independent Bitmap, DIB). Формат инкапсулирован в классе TBitmap в свойстве:

propertyHandleType: TBitmapHandleType;

typeTBitmapHandleType = (bmDIB, bmDDB);

 

Формат DDB применялся в первых версиях Windows (до 3.0) и был хорош для маленьких картинок с небольшим количеством цветов. Недостаток аппаратно-зависимой битовой карты заключается в сложности вывода изображения на графических устройствах с иной цветовой организацией. На смену DDB пришел формат DIB, который содержит цветовую таблицу, отражающую соответствие двоичного представления пикселов цветам RGB. Чаще всего файлы в формате DIB имеют расширение .bmp, реже – .dib. Черно-белый (монохромный) битовый образ требует всего 1 бит для хранения информации об одном пикселе. Для перехода в монохромный режим установите в true свойство:

propertyMonochrome: Boolean;

 

На рис. 10.11 изображен монохромный растровый рисунок в формате DIB размерностью 16×6 пикселов. Эту картинку можно представить в виде рядов битов (скан-линий).

propertyScanLine[Row: Integer]: Pointer;

 

В скан-линии черному пикселу соответствует нулевое значение, белому пикселу – единица. Группы по 8 бит записываются в шестнадцатеричной системе счисления. В памяти строки битовой карты упорядочиваются снизу вверх, и после заголовка файла хранится нижняя строка.

Хранение цветного изображения несколько сложнее и требует дополнительных битов. Количество цветов, представляемых в битовом образе, соответствует 2 в степени «число бит на пиксел»: 16 цветов – 4 бита на пиксел, 256 цветов – 8, High Color – 15 или 16, True Color – 24 бита на пиксел. Массив битов цветного растрового изображения (например, глубиной в 16 цветов) выглядит следующим образом. Каждая скан-линия включает 4 цветовых плоскости в следующей последовательности: красная, зеленая, синяя и плоскость интенсивности.

propertyPixelFormat: TPixelFormat;

typeTPixelFormat = (pfDevice, pf1bit, pf4bit, pf8bit, pf15bit, pf16bit, pf24bit,

pf32bit, pfCustom);

 

Формат pfCustom предназначен для реализации программистом собственных графических объектов – потомков класса TBitmap. Как видно из рис. 10.1, класс TBitmap построен на основе класса TGraphic и унаследовал все объявленные в предке свойства и методы. TBitmap инкапсулирует битовый образ Windows (HBitmap), включая палитру (HPalette). Объект TBitmap обладает двумя дескрипторами (карты и цветовой палитры):

 

propertyHandle: HBitmap;

propertyPalette: HPalette;

 

Дескриптор карты используется для доступа к функциям GDI. Дескриптор

палитры предназначен для чтения или изменения цветовой палитры. Два

очень похожих метода возвращают дескрипторы карты и палитры.

functionReleaseHandle: HBitmap;

functionReleasePalette: HPalette;

 

Эти методы используются для передачи дескриптора другому объекту или процедуре. После этого битовая карта обнуляет дескриптор. Возможность разделения дескриптора между объектами объясняется наличием механизма кэширования. Но как только вы вновь обратитесь к дескриптору битовой карты, разделение одной картинки между несколькими объектами заканчивается. Объект TBitmap получит собственную копию дескриптора. Для этой цели предназначены методы:

 

procedureDormant;

procedureFreeImage;

 

Процедура Dormant() создает в памяти растровый рисунок в формате DIB, уничтожая разделяемые дескрипторы битовой карты. Процедура FreeImage() освобождает дескриптор TBitmap для дальнейшего использования и внесения изменений. Помимо унаследованных от класса TGraphic возможностей загрузки изображения из файла, потока и буфера обмена, класс TBitmap поддерживает загрузку из файла ресурсов.

procedureLoadFromResourceID(Instance: THandle; ResID: Integer);

procedureLoadFromResourceName(Instance: THandle; constResName: string);

 

Параметр Instance хранит идентификатор файла. Выбор битовой карты из ресурса осуществляется либо при помощи параметра ResID (идентификатор ресурса), либо параметра ResName (имя элемента ресурса). Несколько подробнее вопрос работы с ресурсами рассмотрен в разделе «Создание библиотеки ресурсов» главы 19 «Динамически подключаемые библиотеки».

Отказавшись от использования цветовой палитры, можно значительно ускорить прорисовку изображения, но при этом качество картинки ухудшается:

propertyIgnorePalette: Boolean;

 

Для того чтобы сделать растровый рисунок прозрачным, нужно указать цвет

фона битовой карты:

propertyTransparentColor: TColor;

 

и установить в состояние tmFixed свойство:

propertyTransparentMode: TTransparentMode;

typeTTransparentMode = (tmAuto, tmFixed);

 

Если свойство Transparent установлено в автоматический режим (tmAuto), то за фоновый цвет битовой карты будет приниматься цвет ее первого пиксела. Для использования битовой карты в качестве маски для других битовых карт предусмотрено свойство:

propertyMaskHandle: HBitmap;

и методы Mask() и ReleaseMaskHandle(). Метод Mask() конвертирует битовую карту в монохромную картинку, заменив TransparentColor на белый цвет, а все остальные цвета на черный.

 

procedureMask(TransparentColor: TColor);

functionReleaseMaskHandle: HBitmap;

 

Свойство MaskHandle содержит дескриптор, обеспечивающий доступ к функциям GDI, заменяя все небелые пикселы на черные. Белые пикселы превращаются в точки фона. Задача функции ReleaseMaskHandle() аналогична задачам рассмотренных ранее методов ReleaseHandle() и ReleasePalette().

 








Дата добавления: 2016-03-15; просмотров: 1116;


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

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

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

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