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

Автор: Пользователь скрыл имя, 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 Кб (Скачать)

08160016

Розгортається в наступну послідовність значень пікселів

001600160016001600160016001600160016

Лічильник повторень рівний нулю використовується в якості керуючого коду. Нульове значення, за котрим слідує інше нульове значення, означає перехід до наступної стрічки в зображенні. Нульове значення, за котрим слідує 1, означає кінець зображення, і нуль, за яким йде байт, який містить значення 2, змінює поточне положення в зображенні. Наступні два байти являють собою значення без знаку, котрі дорівнюють, відповідно, кількості стовбців и стрічок, на які потрібно перейти в нове положення. Цей код дозволяє пропускати велику кількість пікселів з нульовими значеннями. Кодова послідовність

0416151600160016021611160216031600160116

Розгортаються у наступні дві стрічки:

1516151615161516

1116111603160316

Кінець зображення.

Нульовий керуючий код з наступним значенням, яке більше двох, вказує на число літеральних байтів, котрі повинні бути скопійовані в зображення. Літеральні байти йдуть безпосередньо за лічильником. Якщо число лічильника непарне, то після байтів даних зберігається один байт-заповнювач. Цей код використовується для збереження нестиснених даних.

З приведеного опису методу стиснення можна зробити таке заключення: якщо зображення не містить послідовних байтів з однаковим значенням, кінцевий розмір даних перевищить розмір еквівалентних нестиснених даних.

 

1.3.2 Метод стиснення RLE4

Формат RLE4 майже ідентичний формату RLE8. Основна відмінність у тому, що при кодуванні значень байтів кольору, які йдуть за числом-лічильником, містить два значення пікселів. Значення чотирьох старших бітів використовується для кодування першого і всіх наступних непарних пікселів в серії, у той час як чотири молодших біти використовуються для кодування другого і наступних парних пікселів. Таким чином, формат RLE4 дозволяє кодувати серії однакових значень пікселя або два значення, що чергуються. Дана закодована пара

05165616

Розгортається в наступну послідовність 4-бітових значень:

56565

Всі керуючі коди методу RLE4 співпадають з керуючими кодами методу RLE8, за виключенням кодування абсолютних значень. Нульовий керуючий код  з наступним байтом, який більше двох, задає число абсолютних значень пікселів, які розташовуються за керуючим кодом. Кожне з абсолютних значень пакується в 4 біти, при чому старші біти розташовуються на початку. Якщо серія не кратна чотирьом, далі потрібно заповнити так, щоб число абсолютних байтів даних (не пікселів) було кратне двом.

 

 

 

 

1.3 Графіка в мові програмування С

 

Мова йде про графіку у 16-ти бітному С-програмуванні та середовищі MS DOS [4]. Перш за все потрібно ініціалізувати графічні драйвери на комп’ютері, що можна зробити з допомогою заголовного файлу  graphics.h.

Функція initgraph ініціалізує графічний режим на комп’ютері завантаженням графічного драйверу. Також ця функція скидає всі попередні графічні налаштування (колір, палітру, поточну позицію, вікна та інше) до налаштувань за замовчанням, тоді повертає graphresult=0.

Прототип функції:

void initgraph(int far *graphdriver, int far *graphmode, char far *pathtodriver);

 

*graphdriver – число, яке визначає, який графічний драйвер має бути використаний. Можна задати, використовуючи числову константу переліку графічних драйверів.

*graphmode – число, яке визначає потрібний графічний режим. Якщо *graphdriver = DETECT, функція initgraph встановлює найкращий можливий з знайдених драйверів. Можна задати числовою константою.

*pathtodriver – визначає шлях до каталогу, де функція повинна шукати графічний драйвер (*.BGI) спочатку. Якщо його там немає, функція шукає драйвер у поточному каталозі (пошук у поточному каталозі задається числовою константою 0).

Закриття графічного режиму виконує функція closegraph().

У курсовій роботі використовується графічний режим 12h (розширення екрану 640*480, кількість кольорів – 16).

 

 

 

 

2. Формулювання задачі

 

В даній курсовій роботі поставлена така задача: відкрити файл графічного зображення ВМР формату, зчитати всі необхідні дані, відтворити це зображення і закрити файл.

Програма повинна передбачати введення ім’я файлу з командного рядка або запропонувати користувачу самостійно ввести ім’я файлу.

Відтворення зображення повинно бути реалізоване в графічному режимі 12h. Передбачити алгоритми відтворення різних зображень: 16-ти колірних та 256-ти колірних. Також програма повинна надавати інформацію про файл – його розмір в байтах, висоту та ширину у пікселях, кількість кольорів.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.     Опис алгоритму

3.1             Загальний алгоритм розв’язку

Щоб розв’язати поставлену задачу потрібно:  відкрити файл і з нього зчитати та записати в описані раніше в програмі структури файлу bmp-формату (BMPFILEHEADER, BMPINFOHEADER, RGBQUAD) дані про зображення, відтворити дане зображення з растрового масиву, що йде одразу після цих структур, попіксельно та закрити файл. Ім’я файлу задається з командного рядка, або, якщо цього не зроблено, користувач може вказати ім’я власного файлу під час виконання програми.

Зчитування палітри зображення відбувається по-різному, в залежності від кількості кольорів у зображенні. Якщо значення bmpih.biBitCount дорівнює 4 – зображення 16-ти колірне, якщо bmpih.biBitCount дорівнює 8 – зображення 256 колірне. 

На екран виводиться основна інформація про файл – його розмір в байтах, висота, ширина, кількість кольорів. Користувач отримує повідомлення про те, що для відображення зображення потрібно натиснути клавішу Enter.

За допомогою функції OpenGraph відкривається графічний режим, який автоматично встановлює режим 12h.

Після натиснення будь-якої клавіші відбувається відображення зображення попіксельно. Пікселі в растрі описані пострічково знизу вверх – тобто спочатку йде останній рядок, тоді передостанній і так далі. Для відображення потрібно організувати два цикли. Один йде по ширині зображення (стрічці) від 1-го (0-го) пікселя до останнього в стрічці, інший йде по висоті – від останньої стрічки до 1-ої (0-ої).

Відображення також відбувається по-своєму для різних типів зображення. У 16-ти колірному зображенні кожний байт описує два пікселі. Щоб відобразити їх потрібно зчитати один байт в змінну типу short int, тоді побітовим зсуненням та за допомогою маски виокремити значення цих пікселів і занести їх в інші змінні. Через те, що палітра зображення не збігається з системною палітрою, потрібно інвертувати 4 кольори – light blue з light red та yellow з light cyan. Тоді в циклі по ширині крок ітерації повинен дорівнювати двом, адже за один цикл відображається два пікселі.

У 256-ти колірному зображенні один байт описує один піксель, тому його зчитування виконується в одну змінну типу short int, за допомогою якої потім і відбувається відображення цього пікселя. Кроки ітерації тут дорівнюють одиниці.

Після відображення зображення закривається графічний режим та сам файл.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.2 Блок-схема загального алгоритму програми

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                                          

 

 

                

 

 

 

 

 

 

 

 

 

 

 

4. Програмна реалізація алгоритму

Програмну реалізацію алгоритму здійснено мовою С.  Виконавчий файл має назву ВМР.срр, розмір – 8 192 байти, містить 208 рядків. Для роботи програми потрібен один файл формату bmp 16-ти або 256-ти колірного зображення.

Призначення програми – відображення файлу bmp формату. Програма працює лише для 16-ти та 256-ти колірних зображень,  робота з іншими зображеннями обмежується зчитуванням інформації зі структур BMPFILEHEADER та BMPINFOHEADER і виведенням її на екран. Програма працює в текстовому режимі для виведення інформації про файли та графічному режимі для попіксельного відображення на екран. Програма також не працює зі стисненими зображеннями, адже у форматі bmp стиснення використовується вкрай рідко.

Якщо користувач задав ім’я файлу з командного рядка – то відбувається завантаження вказаного файлу, інакше користувачеві надається можливість введення ім’я безпосередньо під час виконання програми.

У програмі крім main використовується лише одна функція OpenGraph, яка відкриває графічний режим 12h для відтворення зображення на екрані.

У таблиці (Табл. 6) наведені всі змінні, які використовуються у програмі:

 

Ідентифікатор змінної

Тип

Розмір

Локальна чи глобальна

Використання

argc

int

2

Глобальна

Кількість параметрів командного рядка

argv[]

char *

 

Глобальна

Вказівник на вказівник на параметри командного рядка

file

FILE *

 

Глобальна

Вказівник на потік, пов’язаний з файлом з зображенням

fname[50]

char

1*51

Глобальна

Ім’я файлу, в разі його відсутності в командному рядку

bmpfh

BMPFILEHEADER

 

Глобальна

Структура, в яку зчитуються головні дані файлу

bmpih

BMPINFOHEADER

 

Глобальна

Структура, в яку зчитуються головні дані про зображення файлу

rgb[255]

RGB

1*256

Глобальна

Структура, в яку зчитується палітра зображення

col

int

2

Глобальна

Кількість кольорів в палітрі

m

int

2

Глобальна

Кількість кольорів в палітрі rgb

pix

short int

1

Локальна

Колір одного пікселя зображення

c

short int

1

Локальна

Колір першої складової pix (пікселя зображення для 16-ти колірного зображення)

n

short int

1

Локальна

Колір другої складової pix (пікселя зображення для 16-ти колірного зображення),

x

int

2

Локальна

Кількість пікселів по ширині

y

int

2

Локальна

Кількість пікселів по висоті

rivn

int

2

Локальна

Кількість пустих пікселів, які потрібно додати до ширини зображення

graphdr

int

2

Локальна

Визначає графічний драйвер для використання

graphmode

int

2

Локальна

Визначає тип графічного режиму

error

int

2

Локальна

Визначає, чи відбулись помилки при відкритті графічного режиму

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5. Інструкція користувачеві програми

 

Перед початком програми потрібно встановити поточним каталог, в якому знаходиться необхідний файл. Для введення файлу з командного рядка потрібно, щоб програма та файл знаходились в одному каталозі. Якщо ім’я файлу не задане з командного рядка – користувачеві надається можливість ввести файл безпосередньо під час виконання програми. Але обов’язково потрібно вказувати повне ім’я (шлях) файлу. Якщо ім’я вказане неправильно, програма завершує свою роботу.

Після введення ім’я файлу і його успішного відкриття на екран виводиться загальна інформація про зображення. Для відображення зображення користувач повинен натиснути Enter або будь-яку іншу клавішу.

Якщо зображення 16-ти або 256-ти колірне далі відбувається відкриття графічного режиму та попіксельне відображення зображення на екран, інакше відбувається вихід із програми. В разі відображення зображення програма очікує натискання будь-якої клавіші для завершення роботи.

 

 

 

 

 

 

 

 

 

 

 

 

 

6. Контрольні приклади та аналіз результатів їх реалізації

 

Для роботи програми потрібен лише один файл – зображення в форматі bmp.  Під час виконання користувач може задати файл в командному рядку. Якщо цього не зроблено, користувач має можливість ввести повне ім’я (шлях) файлу безпосередньо під час виконання програми:

 

Рисунок 6.1  Екранограма введення ім’я файлу, якщо він не заданий з командного рядка.

 

 

Якщо ім’я файлу задано неправильно, відбувається завершення роботи, інакше на екрані з’являється повідомлення з інформацією про зображення:

Рисунок 6.2 Екранограма повідомлення з інформацією про файл

 

Після натиснення будь-якої клавіші відбувається попіксельне відображення зображення на екрані:

6.3 Екранограма відтворення зображення.

Відображення 256-ти колірного зображення відбувається зі спотвореними кольорами, адже в режимі 12h можна відобразити лише 16 кольорів.

У даному прикладі використовується файл rainbow.bmp, який містить 16-ти колірне зображення.

Після натиснення будь-якої клавіші програма завершує свою роботу.

Висновок

 

В ході написання даної курсової роботи, я розглянула варіанти структур зображень bmp формату, ознайомилась з поняттям палітри та алгоритмами стиснення  файлів bmp зображень. Була розроблена програма, яка зчитує інформацію з bmp файлу у відповідні структури, відображає базові дані про зображення, а для 16-ти та 256-ти колірних зображень виконує попіксельне відтворення цього зображення.

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