Відтворення графічних зображень з файлів ВМР-формату

Автор: Пользователь скрыл имя, 24 Марта 2012 в 23:20, курсовая работа

Описание работы

Мета курсової роботи – практичне закріплення, поглиблення та розширення знань та навичок, набутих у процесі вивчення мови програмування С. З цією метою було поставлено конкретну задачу: розглянути варіанти структур ВМР-формату, ознайомитись з поняттям палітри і її керуванням, алгоритмами стиснення, що застосовуються для ВМР-файлів і користуючись набутою теоретичною базою відтворити невелике зображення ВМР-формату в режимі 12h за допомогою засобів мови програмування С.

Содержание

Вступ…………………………………………………………………………….4
1. Огляд літератури
1.1. Загальна характеристика ВМР-формату………………………….....5
1.2. Варіанти структур ВМР-формату……………………………………6
1.2.1. BITMAPFILEHEADER……………………………………………7
1.2.2. BITMAPINFOHEADER, BITMAPV4HEADER, BITMAPV5HEADER………………………………………………..8
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. Опис алгоритму……………………………………………………………..21
3.1. Загальний алгоритм розв’язку………………………………………21
3.2. Блок-схема загального алгоритму програми ………………………23
4. Програмна реалізація алгоритму ………………………………………….25
5. Інструкція користувачеві програми ………………………………………27
6. Контрольні приклади та аналіз результатів їх реалізації…..…………….28
Висновок………………………………………………………………………..30
Список літератури .…………………………………………………………...31
Додатки…………………………………………………………………………32
Додаток 1. Код програми …………………………………………………32
Додаток 2. Зображення rainbow.bmp ………………

Работа содержит 1 файл

Курсак.doc

— 338.50 Кб (Скачать)

biBitCount – кількість біт на один піксель. На цьому полі зупинимось докладніше. Всі різновиди ВМР умовно можна поділити на два типи: палітрові і безпалітрові [3], тобто, використовується вона у даному форматі чи ні (палітра може бути навіть в безпалітрових форматах, але вона не використовується в них). В безпалітрових форматах ВМР колір вираховується прямо з тих бітів, які йдуть у файлі, починаючи з певної позиції. Вигляд зображення (палітровий чи безпалітровий) залежить від значення biBitCount.

Далі наведена таблиця (Табл. 3) порівняння можливих варіантів вигляду зображення [1,3]:                                                                                         

                                                                                                     Таблиця 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-ма бітами на піксель байтова послідовність

Информация о работе Відтворення графічних зображень з файлів ВМР-формату