Відтворення графічних зображень з файлів ВМР-формату
Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Кафедра автоматизованих систем управління
Курсова робота
з дисципліни «Проблемно-орієнтовані мови програмування»
на тему
ВІДТВОРЕННЯ ГРАФІЧНИХ ЗОБРАЖЕНЬ З ФАЙЛІВ
ВМР-ФОРМАТУ
Виконала:
студентка гр. КН-10
Кітлінська Анастасія
Керівник:
доцент кафедри АСУ
Шпак З.Я.
Львів – 2010
Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Кафедра автоматизованих систем управління
Завдання на курсову роботу
з дисципліни «Проблемно-орієнтовані мови програмування»
Прізвище, ім’я студента | Кітлінська Анастасія | |
Група | КН-10 | |
Тема курсової роботи | Відтворення графічних зображень з файлів ВМР-формату | |
Спеціальна частина завдання:
1. Ознайомитись з варіантами структур ВМР-формату.
2. Ознайомитись з поняттям палітри і керування палітрами.
3. Ознайомитись з алгоритмами стиснення, що застосовуються для ВМР-файлів.
4. Реалізувати відтворення зображення (невеликого розміру) в режимі 12h.
5. Термін завершення роботи – 6 червня 2010 року.
Завдання видано | 6 травня 2010 р. |
Керівник | Шпак З.Я. |
Студент | Кітлінська А.О. |
Зміст
Вступ…………………………………………………………………
1. Огляд літератури
1.1. Загальна характеристика ВМР-формату………………………….....5
1.2. Варіанти структур ВМР-формату……………………………………6
1.2.1. BITMAPFILEHEADER……………………………………
1.2.2. BITMAPINFOHEADER, BITMAPV4HEADER, BITMAPV5HEADER…………………………………………
1.2.3. Збереження даних у форматі BMP. Палітра……………………14
1.3. Типи стиснення даних у зображеннях BMP формату…………….16
1.3.1. Метод стиснення RLE8…………………………………………..17
1.3.2. Метод стиснення RLE4…………………………………………..18
1.4. Графіка в мові програмування С……………………………………19
2. Формулювання задачі………………………………………………………20
3. Опис алгоритму………………………………………………………
3.1. Загальний алгоритм розв’язку………………………………………21
3.2. Блок-схема загального алгоритму програми ………………………23
4. Програмна реалізація алгоритму ………………………………………….25
5. Інструкція користувачеві програми ………………………………………27
6. Контрольні приклади та аналіз результатів їх реалізації…..…………….28
Висновок…………………………………………………………
Список літератури .…………………………………………………………...31
Додатки……………………………………………………………
Додаток 1. Код програми …………………………………………………32
Додаток 2. Зображення rainbow.bmp …………………………………….40
Вступ
Мета курсової роботи – практичне закріплення, поглиблення та розширення знань та навичок, набутих у процесі вивчення мови програмування С. З цією метою було поставлено конкретну задачу: розглянути варіанти структур ВМР-формату, ознайомитись з поняттям палітри і її керуванням, алгоритмами стиснення, що застосовуються для ВМР-файлів і користуючись набутою теоретичною базою відтворити невелике зображення ВМР-формату в режимі 12h за допомогою засобів мови програмування С.
Формат ВМР використовується для збереження даних без втрат якості. Це власний формат Windows, який використовується для цілей системи. Наприклад, саме у цьому форматі зображення включаються у склад виконуючих файлів і виводяться на екран. Будь-яка програма, яка використовує графічний інтерфейс Windows, містить засоби для відкриття, редагування та збереження ВМР-файлів. Цей формат зберігає зображення з достатньою якістю і глибиною кольору, однак має ряд недоліків, наприклад, не дозволяє використовувати корекцію кольору, зберігати шари і інші елементи зображення. Саме тому він використовується досить рідко, в основному як кінцевий формат при підготовці графіки для Windows.
Для здійснення поставленої задачі необхідно докладно розглянути структуру ВМР-формату
1. Огляд літератури
1.1 Загальна характеристика ВМР-формату
ВМР (від англ. Bitmap Picture – бітовий масив) – формат для збереження растрових зображень [1]. Початково формат міг зберігати лише апаратно-залежні растри (англ.. Device Dependent Bitmap, DDB), але з розвитком технологій відображення графічних даних формат ВМР став переважно зберігати апаратно-незалежні растри (англ.. Device Independent Bitmap, DIB).
Формат ВМР початково розроблявся двома корпораціями Intel і Microsoft, і в той час був однаковим для обох операційних систем Intel OS/2 Warp і Microsoft Windows 2.x. Далі фірма Microsoft розширила формат, розширивши структури (при цьому зберігши як зворотню, так і пряму сумісність для нестиснених різновидів) і додавши підтримку компресії.
З форматом ВМР працює велика кількість програм, так як його підтримка інтегрована в операційні системи Windows і OS/2. Файли формату ВМР можуть мати розширення .bmp, .dib і .rle. Крім того, дані цього формату включаються в двійкові файли ресурсів RES і в PE-файли.
Глибина кольору у даному форматі може бути від 1 до 48 біт на піксель, максимальний розмір зображення 65535*65535 пікселів.
В форматі ВМР є підтримка стиснення по алгоритму RLE, однак тепер існують формати з сильнішим стисненням, і через великий об’єм ВМР рідко застосовується в Інтернеті, де для стиснення без втрат використовується PNG і більш старий GIF.
Апаратно-залежні або DDB бітмапи використовуються в Windows для збереження зображень в пам’яті різноманітних графічних пристроїв (відеопам’яті). Фактично такий бітмап являє собою урізану версію апаратно-незалежного. Його дані формуються таким чином, щоб відповідати конкретному графічному режиму, крім того, такий бітмап містить спрощений заголовок. Наприклад, для старого 16 кольорового EGA/VGA відеоадаптера такий бітмап буде являти собою 3-х колірні матриці (для кожного з кольорів), апаратно-незалежний бітмап буде містити всього одну матрицю розрядністю 4 біти на піксель.
Оскільки структура DDB бітмапу змінюється в залежності від пристрою до пристрою, то він, як правило, створюється прямо в пам’яті і не зберігається у файл. Для збереження у файл DDB конвертується у DIB.
1.2 Варіанти структур ВМР-формату
Встановлений формат бітмапу складається зі структури BITMAPFILEHEADER, за якою слідують структури BITMAPINFOHEADER, BITMAPV4HEADER або BITMAPV5HEADER [2]. Далі за головною інформаційною структурою бітмапу йде масив структур RGBQUAD (що називається палітрою). Палітра завершується другим масивом індексів кольорів палітри (фактичні дані бітмапу).
Структуру файлу можна умовно зобразити так (Табл. 1):
Таблиця 1
BITMAPFILEHEADER |
BITMAPINFOHEADER |
RGBQUAD array |
Color-index array |
Складові структури BITMAPFILEHEADER ідентифікують файл, визначають розмір файлу в байтах і визначають положення першого байта даних по бітмап відносно першого байта заголовку.
Складові структур BITMAPINFOHEADER, BITMAPV4HEADER або BITMAPV5HEADER визначають ширину і довжину зображення в пікселях, чи було до зображення застосоване стиснення і якого типу, кількість байтів даних зображення, початкова роздільна здатність зображення, кількість кольорів, використана в зображенні. Структура RGBQUAD визначає інтенсивність значень RGB для кожного кольору з палітри.
У наступній таблиці (Табл. 2) показані байти даних, які зв’язані зі структурами в ВМР-файлі.
Таблиця 2
Структури | Відповідні байти |
BITMAPFILEHEADER | 0x00 0x0D |
BITMAPINFOHEADER | 0x0E 0x35 |
RGBQUAD array | 0x36 0x75 |
Color-index array | 0x76 0x275 |
Розглянемо докладніше окремі компоненти структури.
1.2.1 BITMAPFILEHEADER
На початку розташований заголовок файлу (BITMAPFILEHEADER)[3]. Структура BITMAPFILEHEADER містить інформацію про типе, розмір і представлення даних у файлі [2]. Цей заголовок файлу описаний наступним чином:
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
Тип WORD повинен мати розмір 16 біт, типи DWORD i LONG – 32 біти, тип LONG – знаковий [1].
bfType визначає тип файлу [3]. Тут він повинен бути ВМ. Якщо відкриєте будь-який файл ВМР у текстовому редакторі, то видно, що перші два символи – це ВМ (від слова BitMap). Символи «ВМ» в шістнадцятковій системі числення мають представлення: 0х42 0х4d [1].
bfSize – це розмір самого файлу в байтах. Більшість програм для того, щоб впевнитись, що перед ними справді ВМР, а не «підробка» повинні, по-перше, перевірити, що bfType містить «ВМ» (без лапок), і, по-друге, що bfSize дорівнює розміру файлу.
bfReserved1 и bfReserved2 – зарезервовані і повинні бути нулями.
bfOffBits – одне з найважливіших полів в цій структурі. Воно містить інформацію про те, де починається сам бітовий масив відносно початку файлу (від початку структури BITMAPFILEHEADER [2]), який описує зображення. Тобто, щоб гарантовано потрапити на початок масиву потрібно писати:
fsetpos (hFile, bfh.bfOffBits);
1.2.2 BITMAPINFOHEADER, BITMAPV4HEADER BITMAPV5HEADER
Після заголовку файлу стоїть одна з трьох варіантів структур: BITMAPINFOHEADER, BITMAPV4HEADER або BITMAPV5HEADER [1].
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 – це розмір самої структури BITMAPINFOHEADER, тобто інформація про кожен піксель [3]. Її потрібно ініціалізувати наступним чином : bih.biSize = sizeof (BITMAPINFOHEADER); тут і далі ми вважаємо, що bih оголошена наступним чином: BITMAPINFOHEADER bih;
biWidth – ширина зображення в пікселях [1]. Для Win98/Me і Win200/XP: якщо поле biCompression містить BI_JPEG або BI_PNG – тут вказана ширина розпакованого зображення.
biHeight – задає висоту зображення у пікселях. Якщо містить додатне значення – зображення записане у порядку знизу догори, нульовий піксель в нижньому правому кутку. Якщо значення від’ємне – зображення записане згори донизу, нульовий піксель – у верхньому лівому кутку зображення. Поле biCompression повинно містити значення BI_RGB або BI_BITFIELDS. Таке зображення не може бути стиснуте.
biPlanes – задає кількість площин. Поки що це поле завжди містить 1.
biBitCount – кількість біт на один піксель. На цьому полі зупинимось докладніше. Всі різновиди ВМР умовно можна поділити на два типи: палітрові і безпалітрові [3], тобто, використовується вона у даному форматі чи ні (палітра може бути навіть в безпалітрових форматах, але вона не використовується в них). В безпалітрових форматах ВМР колір вираховується прямо з тих бітів, які йдуть у файлі, починаючи з певної позиції. Вигляд зображення (палітровий чи безпалітровий) залежить від значення biBitCount.
Далі наведена таблиця (Табл. 3) порівняння можливих варіантів вигляду зображення [1,3]:
biBitCount | Палітровий чи безпалітровий формат | К-сть кольорів | Зауваження |
1 | Палітровий | 2 | Монохромне (не обов’язково ч/б) палітрове зображення. Член bmiColors структури BITMAPINFO містить два елементи. Кожний біт зображення представляє один піксель; якщо біт рівний нулеві – піксель має колір першого елемента таблиці bmiColors, інакше – колір другого. |
4 | Палітровий | 16 | Кожний байт описує 2 пікселі. |
8 | Палітровий | 256 | Один із найпоширеніших варіантів і в той же час найпростіших. Палітра займає один кілобайт. Один байт – один колір, при чому його значення – номер кольору у палітрі. |
16 | Безпалітровий | 2^16 або 2^15 | Найзаплутаніший варіант. Він є безпалітровим, тобто кожні два байти (одне слово WORD) у растрі однозначно визначають один піксель. Однак виходить, що бітів 16, а компонентів кольорів – 3 (Red, Green, Blue) і 16 ніяк не ділиться на 3. Тому в цій ситуації виникає два варіанти. Перший – використовувати не 16, а 15 бітів, тоді на кожну компоненту кольору припадає по 5 біт, таким чином ми можемо використати максимум 2^15=32768 кольорів (R-G-B=5-5-5). Але у такому випадку втрачається цілий біт з 16-ти. Так як людське око серед всіх кольорів найкраще сприймає зелений, було вирішено віддати цей 1 біт на зелену компоненту (R-G-B=5-6-5) і тепер ми можемо використовувати 2^16=65536 кольорів. |
24 | Безпалітровий | 2^24 | Теж один із найпростіших форматів. Тут 3 байти визначають 3 компоненти кольору. |
32 | Безпалітровий | 2^32 | Тут 4 байти визначають 3 компоненти. При цьому один байт не використовується, його можна віддати для альфа-каналу(прозорості або яскравості). |
biCompression – вказує на тип стиснення для стиснених зображень. Таблиця цих значень подана нижче (Табл. 4) :
Таблиця 4
Знач. | Ідентифікатор | Компресія |
0 | BI_RGB | Нестиснене зображення. |
1 | BI_RLE8 | Стиснення RLE для 8-бітних зображень. |
2 | BI_RLE4 | Стиснення RLE для 4-бітних зображень. |
3 | BI_BITFIELDS | Зображення не стиснене, палітра містить три 4-байтні маски для червоної, зеленої та синьої компонент. Використовується для 16- і 32-бітних зображень. |
4 | BI_JPEG | Win98/Me/2000/XP: JPEG-стиснення. |
5 | BI_PNG | Win98/Me/2000/XP: PNG-стиснення |
6 | BI_ALPHABITFIELDS | WinCE: зображення не стиснене, палітра містить 4-байтні маски для червоної, зеленої, синьої та прозорої(альфа-канал) компонент кольору. Використовується для 16- і 32-бітних зображень. |
biSizeImage – вказує на розмір зображення у байтах.
biXPelsPerMeter вказує горизонтальне розширення в пікселях на метр для цільового пристрою.
biYPelsPerMeter – вказує вертикальне розширення в пікселях на метр для цільового пристрою.
biClrUsed – вказує кількість індексів кольорів у палітрі, які використовуються. Якщо значення дорівнює нулю – зображення використовує максимально допустиму кількість індексів, відповідно до значення biBitCount и методом стиснення, вказаним в biCompression.
biClrImportant – вказує кількість індексів, необхідних для відображення зображення. Якщо містить нуль – всі індекси однаково важливі.
BITMAPV4HEADER – розширена версія раніше описаної структури, яка описується таким чином:
typedef struct {
DWORD bV4Size;
LONG bV4Width;
LONG bV4Height;
WORD bV4Planes;
WORD bV4BitCount;
DWORD bV4V4Compression;
DWORD bV4SizeImage;
LONG bV4XPelsPerMeter;
LONG bV4YPelsPerMeter;
DWORD bV4ClrUsed;
DWORD bV4ClrImportant;
DWORD bV4RedMask;
DWORD bV4GreenMask;
DWORD bV4BlueMask;
DWORD bV4AlphaMask;
DWORD bV4CSType;
CIEXYZTRIPLE bV4Endpoints;
DWORD bV4GammaRed;
DWORD bV4GammaGreen;
DWORD bV4GammaBlue;
} BITMAPV4HEADER, *PBITMAPV4HEADER;
Поля від початку структури і до bV4ClrImportant включно мають ті самі призначення, як і відповідні поля структури BITMAPINFOHEADER.
bV4RedMask — кольорова маска червоної компоненти кожного пікселя використовується лише коли bV4Compression містить значення BI_BITFIELDS.
bV4GreenMask — кольорова маска зеленої компоненти кожного пікселя використовується лише коли bV4Compression містить значення BI_BITFIELDS.
bV4BlueMask — кольорова маска синьої компоненти кожного пікселя використовується лише коли bV4Compression містить значення BI_BITFIELDS.
bV4AlphaMask — маска, що визначає компоненту альфа-каналу.
bV4CSType — визначає кольоровий простір зображення.
bV4Endpoints — структура CIEXYZTRIPLE, яка вказує x, y и z координати трьох кольорів які відповідають кінцевим точкам (endpoints) кольорового простору визначеного для зображення. Це поле ігнорується, якщо bV4CSType не містить значення LCS_CALIBRATED_RGB.
bV4GammaRed — крива тону червоної компоненти. Ігнорується, якщо bV4CSType не містить значення LCS_CALIBRATED_RGB. Вказується у форматі 16^16.
bV4GammaGreen — крива тону зеленої компоненти. Ігнорується, якщо bV4CSType не містить значення LCS_CALIBRATED_RGB.
bV4GammaBlue — крива тону синьої компоненти. Ігнорується, якщо bV4CSType не містить значення LCS_CALIBRATED_RGB.
BITMAPV5HEADER :
typedef struct {
DWORD bV5Size;
LONG bV5Width;
LONG bV5Height;
WORD bV5Planes;
WORD bV5BitCount;
DWORD bV5Compression;
DWORD bV5SizeImage;
LONG bV5XPelsPerMeter;
LONG bV5YPelsPerMeter;
DWORD bV5ClrUsed;
DWORD bV5ClrImportant;
DWORD bV5RedMask;
DWORD bV5GreenMask;
DWORD bV5BlueMask;
DWORD bV5AlphaMask;
DWORD bV5CSType;
CIEXYZTRIPLE bV5Endpoints;
DWORD bV5GammaRed;
DWORD bV5GammaGreen;
DWORD bV5GammaBlue;
DWORD bV5Intent;
DWORD bV5ProfileData;
DWORD bV5ProfileSize;
DWORD bV5Reserved;
} BITMAPV5HEADER, *PBITMAPV5HEADER;
Для полів від початку структури і до bV5GammaBlue включно будуть описані лише відмінності від попередніх версій — BITMAPINFOHEADER и BITMAPV4HEADER.
bV5CSType — визначає кольоровий простір зображення, може приймати наступні значення:
LCS_CALIBRATED_RGB
LCS_sRGB
LCS_WINDOWS_COLOR_SPACE
PROFILE_LINKED
PROFILE_EMBEDDED
bV5Intent — може приймати наступні значення:
LCS_GM_ABS_COLORIMETRIC
LCS_GM_BUSINESS
LCS_GM_GRAPHICS
LCS_GM_IMAGES
bV5ProfileData — зміщення в байтах від початку структури до початку даних профілю (ім’я файлу профілю, стрічка, що містить виключно символи кодової таблиці 1252 і закінчується нульовим байтом). Ігнорується, якщо bV5CSType містить значення, відмінне від PROFILE_LINKED і PROFILE_EMBEDDED.
bV5ProfileSize — розмір даних профілю у байтах.
bV5Reserved — зарезервовано. Містить нуль.
1.2.3 Збереження даних в форматі BMP. Палітра
Після структур BITMAPFILEHEADER и BITMAPINFOHEADER йде палітра. При чому, якщо формат безпалітровий, її може й не бути, однак не можна на це розраховувати. Палітра являє собою масив структур RGBQUAD які йдуть послідовно одна за одною. Навіть якщо в палітрі використовуються не всі кольори (а тільки, наприклад, 16), то часто все одно під палітру відводять 256 полів.
Одразу за палітрою йде сам растр. Пікселі тут описуються так, як написано у таблиці вище, в залежності від формату, і можуть самі містити значення компонент кольору(для безпалітрових), а можуть бути індексами масиву-палітри. Саме зображення записується по стрічково. Також зображення записано перевернуто. Тобто спочатку записана нижня стрічка, потім передостання і так далі. Якщо розмір стрічки растра не кратний 4-м, то вона доповнюється від 1 до 3 пустими (нульовими) байтами, щоб довжина стрічки залишилась кратною параграфу. Далі наведена таблиця (Табл. 5) з формулами, які показують, скільки байт для якого формату треба дописувати в кінець стрічки. Під змінною Width мається на увазі ширина зображення:
Таблиця 5
biBitCount | Формула на С |
4 | (3 * Width) % 8 |
8 | (3 * Width) % 4 |
16 | (2 * Width) % 4 |
24 | Width % 4 |
В BMP файлах з глибиною кольору 24 біти, байти кожного пікселя зберігаються у порядку BGR (Blue, Green, Red); а глибиною кольору 32 біти - BGRA (Blue, Green, Red, Alpha) [1].
В залежності від кількості кольорів на кожну крапку відводиться від 1 до 48 біт:
1 біт — монохромне зображення (два кольори).
2 біти — 4 можливих кольори (режими роботи CGA).
4 біти — 16-колірне зображення (режими роботи EGA).
8 біт (1 байт) — 256 кольорів останній з режимів, що підтримує індексовані кольори (див. нижче).
16 біт (2 байта) — режим HiColor, 65536 можливих відтінків.
24 біти (3 байта) — TrueColor. В зв’язку з тим, що 3 байти недобре співвідносяться зі степенями двійки (особливо при збереженні даних в пам’яті, де вирівнювання даних по границі слова має значення), замість нього часто використовують 32-бітне зображення. В режимі TrueColor на кожний з трьох каналів (в режимі RGB) відводиться по 1 байту (256 можливих значень), загальна кількість кольорів - 16777216.
32 біти (4 байти) — цей режим практично аналогічний TrueColor, четвертий байт звичайно не використовується, або у ньому розміщується альфа-канал (прозорість).
48 біт (6 байт) — рідко використовується. Формат з підвищеною точністю передачі кольору, підтримується відносно малою кількістю програм та обладнання.
Індексування кольору. При кількості біт від 1 до 8 на кожний піксель може використовуватись спеціальний режим індексованих кольорів. В цьому випадку число, що відповідає кожному пікселю, вказує не на колір, а на номер кольору в палітрі. Завдяки використанню палітри є можливість адаптувати зображення до кольорів, присутніх на зображенні. В такому випадку зображення не обмежене не заданими кольорами, а максимальною кількістю кольорів, які одночасно використовуються.
1.4 Типи стиснення даних в зображеннях BMP формату
Формат ВМР підтримує просте RLE- стиснення зображень з 4-ма та 8-ма бітами на піксель [5]. Зображення з 4-ма бітами на піксель піддаються стисненню, якщо значення поля biCompression структури BITMAPINFOHEADER дорівнює BI_RLE4 (=2), а зображення з 8-ма бітами на піксель стискаються, якщо значення biCompression дорівнює BI_RLE8 (=1). При будь якій іншій глибині кольору стиснення даних в зображення неможливе.
Кодування довжин серій (RLE) – найпростіша технологія стиснення даних. В цьому методі дані зберігаються таким чином, що значення, які повторюються, заміщуються числом, рівним їх кількості. Даний тип стиснення підходить лише для зображень, в яких є багаторазове повторення одних і тих самих кольорів, інакше кодування довжин серій (RLE) може створити файл, розмір якого більший за початковий (зворотне стиснення).
1.3.1 Метод стиснення RLE8
В методі стиснення RLE8 дані, що стискаються, розбиваються на 2-байтові пари. Перший байт рівний кількості повторюваних значень пікселів, а другий байт рівний значенню пікселя, що повторюється. В зображенні з 8-ма бітами на піксель байтова послідовність

- Відтворення основних засобів
- Відтворення основних фондів підприємств
- Відтворення та впізнавання (методики дослідження)
- Відтворювальні цикли та кредити в ринковій економіці
- Відходи паливно-енергетичного комплексу, методи їх утилізації і знешкодження
- Відходи як сировина
- Відчуття та сприйняття в процесі праці
- Відповідальність за порушення трудової дисципліни
- Відповідальність за прострочення сплати аліментів
- Відповідальність платника як засіб боротьби з ухиленням від сплати податків
- Відповідальності у працівників ДСНС України на різних етапах професіоналізації
- Відповідач як суб’єкт цивільно правових відносин , його процесуальна правоздатність і дієздатність
- Відпрацювання стратегії підприємства та стратегії виробництва ПАТ «Київхліб»
- Відрядна форма оплати праці