Смекни!
smekni.com

Бібліотека ASM-86 для перегляду графіки в стандартах BMP та PCX (стр. 1 из 2)

Зміст

Вступ

1. Постановка задачі

2. Обґрунтування вибору методів розв’язку задачі

3. Алгоритм програми

4. Реалізація програми

5. Системні вимоги

6. Інструкція для користувача

Висновки

Використана література

Додаток. Лістинг програми

Вступ

Тепер комп’ютери відіграють у житті людини все більшу та більш роль. Раніше, коли ще не було комп’ютерів, чи вони були мало розповсюдженні, все робилося вручну. Коли комп’ютери одержали широке розповсюдження, комп’ютер став допомагати людині, бо він може багато операцій робити набагато швидше, ніж людина.

В наш час дуже популярні графічні редактори, які дозволяють зберігати зображення в популярних графічних форматах. Але інколи потрібна невелика програма, яка дозволяє переглядати графічні формати. Якщо ви хочете написати програму для зображень строго визначеного формату, щоб вона, наприклад, працювала удвічі швидше, ніж "Load from..." у PC Paintbrush, то ви повинні вивчити структуру заголовку та алгоритм стиснення даних для даного формату.


1. Постановка задачі

Розробити на мові програмування ASM-86 бібліотеку, сумісну з мовою програмування Pascal для перегляду графіки в стандартах: BMP, PCX.

2. Обгрунтування вибору методів розв’язку задачі

Необхідно написати, бібліотеку бібліотеку, сумісну з мовою програмування Pascal для перегляду графіки в стандартах: BMP, PCX.

Структура заголовків графіки в стандартах BMP та PCX, а також алгоритми розшифрування даних в цих стандартах приводиться в багатьох книжках, тож з вибором алгоритму у мене не виникло ніяких труднощів.

Формат файлу зображень (.PCX)Файли зображень з розширеннями .PCX починаються з заголовка довжиною 128 байт.Звичайно ви можете ігнорувати цей заголовок, якщо усі ваші зображення будуть мати однаковий дозвіл. Якщо ж ви хочете обробляти зображення з різним дозволом і різною кількістю квітів, вам належить коректно інтерпретувати інформацію, що знаходиться в даному заголовку.Частина файлу, що залишилася, із зображенням складається з закодованих графічних даних. При кодуванні використовується простий алгоритм, заснований на методі довгих серій. Ми залишаємо за собою право змінювати цей алгоритм із метою підвищення ефективності упакування даних. Якщо у файлі запам'ятовується кілька колірних шарів, кожен рядок зображення запам'ятовується по колірних шарах (у загальному випадку червоному-R, зеленому-G, синьому-B і шарую інтенсивності-I) за схемою, приведеної нижче:

Рядок зображення 0:

RRR...

GGG...

BBB...

III...

Рядок зображення 1:

RRR...

GGG...

BBB...

III...

Метод кодування полягає в наступному:

ДЛЯ кожного байта X, прочитаного з файлуЯКЩО обоє старших біта X рівні 1, то<повторювач> = 6 молодшим биткам X<дані> = наступному байту за XІНАКШЕ<повторювач> = 1<дані> = X

Формат заголовка PCX

Зміщений. Позначення Довжина Опис/коментар

0 Manufacturer 1 Постійний прапор 10 = ZSoft .PCX

1 Version 1 Інформація про версію:

0 = Версія 2.5

2 = Версія 2.8 з інформацією про палітру

3 = Версія 2.8 без інформації про палітру

5 = Версія 3.0

2 Encoding 1 1 = .PCX кодування довгими серіями

3 Bits per pixel 1 Число біт на піксел у шарі

4 Window 8 Розміри зображення (Xmin, Ymin) - (Xmax, Ymax) у пікселах включно

12 HRes 2 Горизонтальний дозвіл пристрою, що створює

14 VRes 2 Вертикальний дозвіл пристрою, що створює

16 Colormap 48 Набір колірної палітри (див. далі текст)

64 Reserved 1

65 NPlanes 1 Число колірних шарів

66 Bytes per Line 2 Число байт на рядок у колірному шарі (для PCX-файлів завжди повинне бути парним)

68 Palette Info 2 Як інтерпретувати палітру:

1 = кольорова/чорно-біла,

2 = градації сірого

70 Filler 58 Заповнюється нулями до кінця заголовка

Декодування файлів у форматі PCX

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

[XSIZE = Xmax - Xmin + 1] і [YSIZE = Ymax - Ymin + 1].

Потім обчислите, скільки байтів потрібно для збереження одного незжатого рядка розгорнення зображення:

TotalBytes = NPlanes * BytesPerLine

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

Тепер ви можете почати декодування першого рядка розгорнення - прочитайте перший байт даних з файлу. Якщо два старших біти цього байта рівні 1, то залишилися шість бітів, які показують скільки разів варто повторити НАСТУПНИЙ байт із файлу. Якщо це не так, то цей байт сам є даними з повторювачем рівним 1. Продовжуйте декодування до кінця рядка, ведучи підрахунок кількості байтів, переданих у буфер висновку. Наприкінці кожного рядка розгорнення має місце зупинка алгоритму кодування, але її не існує при переході від одного шару до іншого. Коли рядок сформований цілком, наприкінці кожного шару усередині рядка можливий наявність зайвих даних. Для перебування цього залишку використовуйте значення XSIZE і YSIZE. Якщо дані є багатошаровими, то BytesPerLine показує, де закінчується кожен шар усередині рядка розгорнення.

Продовжуйте декодування рядків, що залишилися. У файлі можлива наявність зайвих рядків з округленням на 8 чи 16 рядків.

Опис інформації про палітру

Інформація про 16-кольорову палітру (EGA/VGA)

Інформація про палітру запам'ятовується в одному з двох різних форматів. У стандартному форматі RGB (IBM EGA, IBM VGA) дані запам'ятовуються в 16 трійках. Кожна трійка складається з байтів зі значеннями червоного (Red), зеленого (Green) і синього (Blue) квітів. Значення можуть знаходитися в діапазоні 0-255, і тому необхідна їхня інтерпретація у формат використовуваного устаткування. Наприклад, на IBM EGA існують 4 можливих рівні RGB для кожного кольору. Оскільки 256/4 = 64, те нижче приведений список відповідності колірних значень і рівнів:

Значення Рівень

0-63 0

64-127 1

128-192 2

193-254 3

Інформація про 256-кольорову палітру VGA

В даний час ZSoft додав можливість збереження у файлі зображення PCX палітри, що перевищує 16 квітів. 256-кольорова палітра форматується й інтерпретується точно так, як 16-кольорова, природно, за винятком того, що вона довша. Палітра (число кольорів x 3 байти довжини) додається в кінець PCX файлу і їй передує байт із десятковим значенням 12. Для визначення палітри VGA BIOS вам досить розділити прочитані значення квітів на 4.

Для доступу до 256-кольорової палітри потрібно:

1. Прочитати в заголовку поле Version. Якщо воно дорівнює 5, палітра повинна бути.

2. Прочитати кінець файлу і відрахувати назад 769 байт. Знайдене вами значення повинне дорівнювати 12, що вказує на присутність 256-кольорової палітри.

3. Алгоритм програми

Алгоритм головної програми:

1. Перехід в графічний режим

2. Виклик процедури виводу графіки в стандарті .PCX.

3. Чекання натиснення клавіші ENTER.

4. Виклик процедури виводу графіки в стандарті .BMP.

5. Чекання натиснення клавіші ENTER.

6. Закінчити програму.

Алгоритм функції виводу графіки в стандарті .BMP.

1.Читання заголовку.

2.Аналіз заголовку

3.Читання палітри

4.Заповнення палітри

5.Читання даних

6.Аналіз даних та вивід на екран

7.Кінець функції.

Алгоритм функції виводу графіки в стандарті .PCX.

1. Читання заголовку.

2. Аналіз заголовку

3. Читання палітри

4. Заповнення палітри

5. Читання даних

6. Аналіз даних та вивід на екран

7. Кінець функції.


4. Реалізація програми

Програма написана на мові ASM-86 з використанням команд процесора 86/286. Вона складається з головної програми, яка написана на мові програмування Pascal, і з бібліотеки, написаної на мові програмування ASM-86, функції якої викликаються в головній програмі.

Функції бібліотеки:

LoadPcx(x,y:integer;s:string);

Де x, y – координати початку виводу картини, s – імя файлу з розширенням PCX.

LoadBmp(x,y:integer;s:string);

Де x, y – координати початку виводу картини, s – імя файлу з розширенням BMP.Бібліотека компілюється за допомогою Turbo Assembler, зв’язується з головною програмою за допомогою TURBO.EXE.

5. Системні вимоги

- IBM сумісний комп’ютер із мікропроцесором Intel 80386 або старшим.

- Операційна система – ДОС

- Пам’ять – 640 К і вище

6. Інструкція для користувача

Для демонстрації бібліотеки написана програма, яка виводить на екран графіки в форматі .BMP, .PCX. Для запуску цієї програми потрібно в командному рядку набрати load_my.exe та натиснути Enter. Програма спочатку виведе на екран картину в форматі .PCX, потім, після натиснення Enter виведе другу картину в форматі .PCX, потім після натиснення Enter програма завершить свою роботу.


Висновки

Отже, на мові ASM-86 створено бібліотеку перегляду графіки в форматі .BMP, .PCX, та були розглянуті структури заголовків та алгоритми перегляду графіків.


Використана література

1. Р.Джордейн “Справочник программиста персональных компьютеров типа IBM PC” М: Мир, 1991р. 2. П.Абель “Мова асемблера для IBM PC та програмування.” М.:Вища школа,1992. 3. “Основи мови” Асемблер” В.I. Криволап. Москва 1997р. ст.309

4. “Ассемблер для початкiвцiв”М.П.Шукiн.Київ 1980р. ст.155

5. “Турбо Асемблер”Л.В.Захаров. Харків 1995 р ст.178

6. “Макро Асемблер”К.С. Кропiйко О.Д. Богатирова.Київ – “Наука” 1991р.

7. Електроний довідник BOOK

8. Електронна документація про формати .PCX та .BMP.


Додаток. Лістинг програми

uses crt;

var graphresult1,graphresult,i:integer; {результат чтения графики}

procedure setvideo(mode:byte);assembler;{устанавливает видеорежимы}

asm

mov ah,0 {функция установки видеорежема}

mov al,mode {номер режима}

int 10h {прерывание для работы с видеорежимами}

end;

{$L pcx.obj} {подключаем нашу библиотеку}

function LoadPcx(x,y:integer;s:string):integer;

external;{обьявляем функции, которые находятся в библиотеке}

function LoadBmp(x,y:integer;s:string):integer;{для чтения файлов .PCX, .BMP}

external;

begin {MAIN}

if paramcount=0 then

begin

setvideo($5f); {устанавливает видеорежим 640x480 256 цветов}

graphresult:=LoadPcx(1,1,'a1.pcx');{вызывает функцию для чтения .PCX

и возвращает результат чтения}