Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Опис складових структур формату DIB






На початку файла формату DIB знаходиться структура BITMAPFILEHEADER, визначена у Windows у такий спосіб:

 

typedef struct tagBITMAPFILEHEADER { WORD bfType; // містить ASCII коди літер BM DWORD bfSize; // розмір DIB-файла у байтах (ігнорується) WORD bfReserved1; // завжди дорівнює 0 WORD bfReserved2; // завжди дорівнює 0 DWORD bfOffBits; // кількість байтів від початку файла до опису графіки } BITMAPFILEHEADER;

Хоча ця структура знаходиться на початку дискового файла формату DIB, вона не є обов’язковою частиною растрового зображення в пам'яті.

Перший член структури – bfType, ідентифікує файл як формат растрового зображення і має містити ASCII коди двох символів – “ВМ” (дорівнює 4D42 у 16-ковому форматі). Поле є ознакою DIB-файла. Якщо файл не містить зазначеної комбінації, він не розглядається у якості DIB-файла. Другий член – bfSize передбачався як розмір у байтах файла растрового зображення. Однак, через помилку в первинній документації Windows, bfSize має ігноруватися. Член структури bfOffBits містить кількість байтів від початку файла до опису, власне, растрових даних.

Наступною структурою є структура BITMAPINFO, визначена Windows у такий спосіб:

typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1]; } BITMAPINFO;

Як видно, структура BITMAPINFO складається з заголовка, який задається спеціальною BITMAPINFOHEADER та таблиці кольорів у вигляді масиву структури RGBQUAD.

У свою чергу BITMAPINFOHEADER є ще однією структурою, також визначеною Windows, вона має більш складний вміст і визначені нижче:

typedef struct tagBITMAPINFOHEADER { DWORD biSize; // розмір структури в байтах DWORD biWidth; // ширина зображення у пікселях DWORD biHeight; // висота зображення у пікселях WORD biPlanes; // кількість площин зображення (завжди дорівнює 1) WORD biBitCount; // кількість бітів на піксель DWORD biCompression; // тип стиснення (0 – немає, 1– RLE-8, 2 – RLE-4) DWORD biSizeImage; // розмір зображення у байтах DWORD biXPelsPerMeter; // кількість горизонтальних пікселів/метр DWORD biYPelsPerMeter; // кількість вертикальних пікселів/метр DWORD biClrUsed; // кількість кольорів, що використовуються DWORD biClrImportant; // кількість найбільш важливих кольорів} BITMAPINFOHEADER;

Член biSize структури BITMAPINFOHEADER містить її розмір і має дорівнювати 40 байтів. Члени biWidth і biHeight є шириною і висотою растрового зображення у пікселях. Член biPlanes завжди встановлюється у значення 1. biBitCount містить кількість бітів на піксель і приймає значення 1, 4, 8, або 24, що відповідає монохромному, 16-кольоровому, 256-кольоровому та зображенню із 16.7 мільйонів кольорів.

Член biCompression містить тип стискання, що використовується у растровому зображенні, де 0 вказує на відсутність стискання; 1 – на метод стискання RLE-8; 2 – на метод RLE-4. Додатково зазначимо, що DIB формат не є взірцем ефективного використання методів стискання даних. Зазвичай дані у DIB-зображеннях взагалі не стискуються і поле biCompression має значення 0. Власне, якщо б *.bmp -файли мали ефективні методи стискання, можливо такі формати, як GIF та JPEG не були б такими поширеними і популярними.

Поле biSizeImage є членом, що містить розмір растрового зображення в байтах і звичайно використовується для зображень, що реалізують певний метод стискання. biSizeImage завжди враховує, що кількість байтів у кожному рядку зображення є кратною 4. Інколи для гарантування цієї кратності додаються порожні байти. Однак, якщо метою програми не є створення нового растрового зображення з точки зору розробника це поле не є особливо важливим.

Поля biXPelsPerMeter та biYPelsPerMeter містять відповідно горизон-тальну та вертикальну щільність пікселів зображення (вимірювану у пікселях на метр), але звичайно встановлені у значення 0. Члени biClrUsed та biClrImportant містять, відповідно, загальну кількість кольорів, що використовуються у растровому зображенні, і кількість найбільш важливих кольорів. Обидва параметри звичайно встановлені у значення 0.

Як можна помітити, члени структури BITMAPINFOHEADER після поля biBitCount найчастіше містять нульові значення. Таким чином, після зчитування файла за диска, ці члени дуже ймовірно ігноруватимуться. Доволі часто, значення, що містяться у цих членах можуть бути обчислені у непрямий спосіб на основі наявних даних.

Остання структура, яка привертає увагу при розгляді незалежних растрових зображень – структура RGBQUAD, визначена у такий спосіб:

 

typedef struct tagRGBQUAD { BYTE rgbRed; // щільність червоного кольору BYTE rgbGreen; // щільність зеленого кольору BYTE rgbBlue; // щільність синього кольору BYTE rgbReserved; // резервний член } RGBQUAD;

Зміст структури є надзвичайно важливим, незважаючи на простий вигляд. Структура містить інтенсивності червоного, зеленого та синього компонентів кольору. Кожен колір у форматі растрового зображення подається структурою типу RGBQUAD. Таким чином растрове зображення із 16-ма кольорами (4 біти) має таблицю кольорів із 16 структурами типу RGBQUAD структури, одночасно 8-бітне зображення з 256 кольорами матиме таблицю кольорів із 256 RGBQUAD структурами. Виключенням є 24-бітні зображення, які не мають ніякої таблиці кольорів. У структурі файла растрового зображення одразу за заголовком, що визначається BITMAPINFOHEADER, розташовуються – фактичні дані зображення. Розмір цих даних звичайно залежить від розміру зображення.

 

8.3 Створення CDib класу

 

Вже зазначалося, що хоча MFC містить класи багатьох графічних об’єктів, жоден повністю не відповідає формату DIB. Хоча створення спеціального класу CDib теоретично виглядає необов’язковим [2] і програму для відкриття *.bmp-файла можна розробити на основі перелічених у попередньому розділі структур, реальна розробка вимагатиме об’єднання усіх непростих властивостей DIB-файла у єдиний клас. Це надасть можливість об’єднання усіх властивостей формату DIB.

У літературі [2] та MSDN описуються дещо різні варіанти опису класу CDib. Нижче описується клас програми, що забезпечує відкриття *.bmp-файлів на основі структури проектів, описаних у попередніх розділах.

Перш за все слід навести опис самого класу CDib. Його ілюструє приклад 8.1. До складу класу CDib входять покажчики на структури, що є складовими формату DIB: LPBITMAPFILEHEADER m_pBmFileHeader; LPBITMAPINFO m_pBmInfo; LPBITMAPINFOHEADER m_pBmInfoHeader; таблиця кольорів RGBQUAD *m_pRGBTable; та, власне, дані зображення BYTE * m_pDibBits.

Також до складу даних входить параметр кількості кольорів растрового зображення: UINT m_numColors.

 

Приклад 8.1 – Вигляд класу CDib

class CDib: public CObject

{protected: LPBITMAPFILEHEADER m_pBmFileHeader;

LPBITMAPINFO m_pBmInfo;

LPBITMAPINFOHEADER m_pBmInfoHeader;

RGBQUAD* m_pRGBTable;

BYTE* m_pDibBits;

UINT m_numColors;

public: CDib(const char* fileName);

~CDib();

DWORD GetDibSizeImage();

UINT GetDibWidth();

UINT GetDibHeight();

UINT GetDibNumColors();

LPBITMAPINFOHEADER GetDibInfoHeaderPtr();

LPBITMAPINFO GetDibInfoPtr();

LPRGBQUAD GetDibRGBTablePtr();

BYTE* GetDibBitsPtr();

protected: void LoadBitmapFile(const char* fileName);

};

 

Подібно більшості класів, CDib має конструктор і деструктор:

CDib(const char* fileName); ~CDib();

Зазначимо лише, що параметром конструктора є ім’я файла (із розширенням *.bmp), на основі якого будується об’єкт типу CDib.

Окрім, власне, даних, клас CDib містить ряд функцій, важливих з точки зору роботи програми даних. Вони розміщені у розділі public класу і описані у таблиці 8.1:

 

Таблиця 8.1 – Основні функції класу CDib

Тип на назва функції Коментар
DWORD GetDibSizeImage() повертає розмір зображення у байтах
UINT GetDibWidth() повертає ширину зображення у пікселях
UINT GetDibHeight() повертає висоту зображення у пікселях
UINT GetDibNumColors() повертає кількість кольорів у зображенні
LPBITMAPINFOHEADER GetDibInfoHeaderPtr() повертає покажчик на структуру BITMAPINFOHEADER
LPBITMAPINFO GetDibInfoPtr() повертає покажчик на структуру BITMAPINFO
LPRGBQUAD GetDibRGBTablePtr() повертає покажчик на таблицю кольорів зображення
BYTE* GetDibBitsPtr() повертає покажчик на графічні дані зображення
void LoadBitmapFile(const char* fileName) завантажує DIB-файл у непрямий спосіб

Клас CDib має одну функцію у захищеній частині класу – LoadBitmapFile(). Вона викликається у непрямий спосіб і завантажує файл формату DIB.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.