
- •Введение
- •1 Аналитический обзор состояния вопроса
- •1.1 Краткие сведения о dll
- •1.2 Общие сведения о bmp - файлах
- •1.3 Dib и ddb файлы
- •1.4 Обзор структуры файла
- •1.4.3 Палитра
- •1.4.4 Данные изображения
- •1.5 Дамп памяти
- •2 Постановка задачи
- •3 Проектирование программного обеспечения
- •3.1 Выбор среды разработки динамической библиотеки
- •3.2 Проектирование структуры Dll
- •3.3 Макет интерфейса
- •3.4 Проектирование алгоритмов
- •4.4 Реализация алгоритма сохранения данных в файл
- •5 Тестирование программного обеспечения
- •5.1 Сравнение выводимых данных
- •5.2 Тест на корректность работы диалогов
- •Заключение
- •Список использованной литературы
- •Список листов графической части
- •Приложение а
- •Приложение б
1.2 Общие сведения о bmp - файлах
BMP (от англ. Bitmap Picture) — формат хранения растровых изображений.
С форматом BMP работает огромное количество программ, так как его поддержка интегрирована в операционные системы Windows и OS/2. Файлы формата BMP могут иметь расширения .bmp, .dib и .rle. Кроме того, данные этого формата включаются в двоичные файлы ресурсов RES и в PE-файлы.
Глубина цвета в данном формате может быть 1, 2, 4, 8, 16, 24, 32, 48 бит на пиксел, максимальные размеры изображения 65535×65535 пикселов. Однако, глубина 2 бит официально не поддерживается.
В формате BMP есть поддержка сжатия по алгоритму RLE, однако теперь существуют форматы с более сильным сжатием, и из-за большого объёма BMP редко используется в Интернете, где для сжатия без потерь используются PNG и более старый GIF[9].
1.3 Dib и ddb файлы
Аббревиатура DIB означает аппаратно-независимый растр (англ. Device Independent Bitmap, DIB). При использовании этого формата программист может получить доступ ко всем элементам структур, описывающих изображение, при помощи обычного указателя. Но эти данные не используются для непосредственного управления экраном, так как они всегда хранятся в системной памяти, а не в специализированной видеопамяти. Формат пикселя в оперативной памяти может отличаться от того формата, который должен заноситься в видеопамять для индикации точки такого же цвета. Например, в DIB-формате может использоваться 24 бита для задания пикселя, а графический адаптер в этот момент может работать в режиме HiColor с цветовой глубиной 16 бит. При этом ярко-красная точка в аппаратно-независимом формате будет задаваться тремя байтами 0x0000ff, а в видеопамяти — словом 0xF800. При копировании картинки на экран система будет тратить дополнительное время на преобразование кодов цвета из 24-битного формата в формат видеобуфера.
DDB означает аппаратно-зависимый растр (англ. Device Dependent Bitmap, DDB). Этот формат всегда содержит цветовые коды, совпадающие с кодами видеобуфера, но храниться он может как в системной, так и в видеопамяти. В обоих случаях он содержит только коды цвета в том формате, который обеспечит пересылку изображения из ОЗУ в видеопамять при помощи простого копирования[7].
1.4 Обзор структуры файла
BMP-файл состоит из четырёх частей:
Заголовок файла (BITMAPFILEHEADER);
Заголовок изображения (BITMAPINFOHEADER, может отсутствовать);
Палитра (может отсутствовать);
Само изображение[6];
1.4.1 BITMAPFILEHEADER
Эта структура содержит информацию о типе, размере и представлении данных в файле.
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; // тип файла, символы «BM» (в HEX: 0x42 0x4d).
DWORD bfSize; // размер всего файла в байтах.
WORD bfReserved1; // зарезервированы, должны содержать нули.
WORD bfReserved2; // зарезервированы, должны содержать нули.
DWORD bfOffBits; // содержит смещение в байтах от начала структуры BITMAPFILEHEADER до непосредственно битов изображения.
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
Тип WORD должен иметь размер 16 бит, типы DWORD и LONG — 32 бита, тип LONG — знаковый, порядок байтов подразумевается little endian.
1.4.2 BITMAPINFOHEADER
Наиболее простой вариант заголовка. Приложения для Windows NT3.51 и более ранних могут использовать только эту структуру.
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
biSize — размер структуры в байтах.
biWidth — ширина изображения в пикселах. Для Win98/Me и Win2000/XP: если поле biCompression содержит BI_JPEG или BI_PNG, здесь указана ширина распакованного изображения.
biHeight — высота изображения в пикселах. Если содержит положительное значение — изображение записано в порядке снизу вверх, нулевой пиксел в нижнем левом углу. Если значение отрицательное — изображение записано сверху вниз, нулевой пиксел в верхнем левом углу изображения. Поле biCompression должно содержать значение BI_RGB или BI_BITFIELDS. Такое изображение не может быть сжато.
biPlanes — содержит единицу.
biBitCount — указывает количество бит на пиксел. Может принимать следующие значения:
0 — имеет смысл для Win98/Me/2000/XP/. Число бит на пиксел определяет формат JPEG или PNG.
1 — изображение монохромное. Член bmiColors структуры BITMAPINFO содержит два элемента. Каждый бит изображения представляет один пиксел; если бит равен нулю — пиксел имеет цвет первого элемента таблицы bmiColors, иначе — цвет второго.
4 — шестнадцатицветное изображение. Пикселы определяются 4-х битными индексами, каждый байт изображения содержит информацию о двух пикселах — старшие 4 бита для первого, оставшиеся — для второго.
8 — в палитре содержится до 256 цветов, каждый байт изображения хранит индекс в палитре для одного пиксела.
16 — если поле biCompression содержит значение BI_RGB, файл не содержит палитры. Каждые два байта изображения хранят интенсивность красной, зелёной и синей компоненты одного пиксела. При этом старший бит не используется, на каждую компоненту отведено 5 бит: 0RRRRRGGGGGBBBBB.
Если поле biCompression содержит значение BI_BITFIELDS, палитра хранит три четырёхбайтовых значения, определяющих маску для каждой из трёх компонент цвета. Каждый пиксел изображения представлен двухбайтным значением, из которого с помощью масок извлекаются цветовые компоненты. Для WinNT/2000/XP — последовательности бит каждой компоненты должны следовать непрерывно, не перекрываясь и не пересекаясь с последовательностями других компонент. Для Win95/98/Me — поддерживаются только следующие маски: 5-5-5, где маска синей компоненты 0х001F, зелёной 0x03E0, красной 0x7C00; и 5-6-5, где маска синей компоненты 0x001F, зелёной 0x07E0, красной 0xF800.
24 — палитра не используется, каждая тройка байт изображения представляет один пиксел, по байту для интенсивности синего, зелёного и красного канала соответственно.
32 — Если поле biCompression содержит значение BI_RGB, изображение не содержит палитры. Каждые четыре байта изображения представляют один пиксел, по байту для интенсивности синего, зелёного и красного канала соответственно. Старший байт каждой четвёрки не используется.