Реферат: Вирізання картинок з екрану та запис їх в BMP форматі (для графіки) і TXT форматі (для тексту)

Міністерствоосвіти та науки України

КіровоградськийДержавний Технічний університет

Кафедрапрограмного забезпечення

КУРСОВА РОБОТА

з дисципліни

«Програмуваннямовою ASM-86»

на тему:

«Вирізаннякартинок з екрану та запис їх в BMP форматі (для графіки) і TXT форматі (для тексту)»


Зміст

 

Завдання

Вступ

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

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

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

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

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

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

Висновок

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

Лістинг програми


Вступ

Прироботі буває необхідно «перехопити» текстову або графічну інформацію, якувиводять на екран різні програми, в текстовий або графічний файл для подальшоїобробки. Для такої мети використовують резидентні програми.

Дляроботи нам знадобиться опис заголовку ВМР-файла. Його можна знайти в додатку (влістингу файла grabber.inc).



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

Розробитирезидентну програму на асемблері, яка дозволить перехопити зміст текстового таграфічного екрану у файл (відповідно TXT і BMP).

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

Длятого, щоб записувати зміст екрану, будемо читати його з відеопам’яті. Дляроботи з файлами можна використовувати функції ОС (з переривання 21h). Але привикористанні функцій ДОС з обробника переривань виникає проблеманереентерабельності ДОС (тобто не можна викликати сервіс ДОС під час роботибудь-якої її функції). Тому використовується перехоплення не документованогопереривання ДОС 28h, яке викликається в той момент, коли система вільна. В цей часможна викликати функції.

Графічнихрежимів дуже багато. Для реалізації виберемо режим 3 (текстовий) і 13h (графічний –режим 320х200х256 кольорів).

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

1.Встановити обробники переривань 5 і 28h.

2.Залишити резидент в пам'яті.

Обробкапереривання 5.

1.Встановити змінну, яка сигналізує про натиснення клавіші, в 1.

Обробкапереривання 28.

1.Визначити режим екрану.

2.Відкрити файл на запис.

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

4. Уразі графіки заповнити структуру заголовка ВМР-файла, записати палітру і всіграфічні дані у файл. Графіка записується, починаючи з лівого нижнього кутаекрану.

5.Закрити файл.

6.Стоп

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

Після запуску програмавстановлює обробник на переривання 5 (клавіша Print Screen) та 28h (переривання при якомувідбувається збереження екрану). Потім вона залишається резидентною в пам’яті.

Принатисканні клавіші Print Screen встановлюється ознака про її натиснення. КолиДОС звільняється і виконує переривання 28, то при встановленій ознацівідбувається збереження екрану. Створюється або обнулюється файл, визначаєтьсяпоточний режим екрану і спосіб запису, з разі текстового режиму у файлзаписується зміст відеопам’яті у вигляді рядків, а у разі графічного –заповнюється структура BMP файлу, визначається палітра, і все це разом зізмістом графічної області відеопам’яті записується у файл. Після цього файлзакривається і обробка завершується.

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

Процесор: 80286 абостарший.

Пам’ять:640 К або більше

Екран:CGA або вище длятексту, VGA і вище для графіки

ОС: MS-DOS 4.0 або вище


6.Інструкція користувачаДля початку роботипрограми треба запустити файл GRABBER.COM. Програма встановить свою резидентну частину і завершиться. Для зберіганнятекстового або графічного екрану треба натиснути клавішу Print Screen. У разі текстового режиму у поточному каталозі з’явиться файл dump.txt зі змістом екрану, а у разі графічного режиму320х200х256 – файл dump.bmp. Для вивантаження програми з пам’яті можна використати функції оболонки VC.

Висновок

Отже,завдяки виконанню роботи продемонстровано методи створення резидент нихпрограм, використання функцій MS-DOS в обробнику переривань завдяки недокументованому перериванню 28, розглянута структура графічних файлів форматуВМР.


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

 

1. Том Сван «ОсвоениеTurbo Assembler»

2. Роберт Журден «Справочник программиста наперсональном компьютере фирмы IBM»

3. Абель П. «МоваАсемблера для IBM PC та програмування»


Лістингпрограми

grabber.asm

modeltiny

286

includegrabber.inc

code

org100h

start:

jmpinital

old_int28_treaterdd 0

ready_to_writedb 0

filename_bmpdb 'dump.bmp', 0

filenamedb 'dump.txt', 0

handledw 0

data db0

col dw0

row dw0

bmp_headerBITMAPFILEHEADER <>

bmp_infoBITMAPINFOHEADER <>

bmp_rgbRGBQUAD <>

;–

; створенняBMP файлу

create_file_bmpproc

; створитифайл

mov ah,3ch

xorcx, cx

movdx, offset filename_bmp

pushds

pushcs

popds

int21h

popds

movword ptr cs: [handle], ax; хендл на файл

ret

create_file_bmpendp

; створенняфайлу

create_fileproc

; створитифайл

mov ah,3ch

xorcx, cx

movdx, offset filename

pushds

pushcs

popds

int21h

popds

movword ptr cs: [handle], ax; хендл на файл

ret

create_fileendp

;–


; закриттяфайлу

close_fileproc

mov ah,3eh

movbx, word ptr cs: [handle]

int21h

ret

close_fileendp

;–

; перехопитирежим 320x200x256 (13h)

mode_13hproc

callcreate_file_bmp

; запистаблицi заголовка bmp

movword ptr cs: [bmp_header.bfType], 4d42h

movword ptr cs: [bmp_header.bfReserved1], 0

movword ptr cs: [bmp_header.bfReserved2], 0

movword ptr cs: [bmp_header.bfSize], 0fe36h

movword ptr cs: [bmp_header.bfSize+2], 0

movword ptr cs: [bmp_header.bfOffbits], 0436h

movword ptr cs: [bmp_header.bfOffbits+2], 0

; запистаблицi iнформацiї

movword ptr cs: [bmp_info.biSize], 28h

movword ptr cs: [bmp_info.biWidth], 140h

movword ptr cs: [bmp_info.biHeight], 0c8h

movword ptr cs: [bmp_info.biSize+2], 0

movword ptr cs: [bmp_info.biWidth+2], 0

movword ptr cs: [bmp_info.biHeight+2], 0

movword ptr cs: [bmp_info.biPlanes], 1

movword ptr cs: [bmp_info.biBitCount], 8

movword ptr cs: [bmp_info.biCompression], 0

movword ptr cs: [bmp_info.biSizeImage], 0

movword ptr cs: [bmp_info.biXPelsPerMeter], 0b40h

movword ptr cs: [bmp_info.biYPelPerMeter], 0b40h

movword ptr cs: [bmp_info.biClrUsed], 100h

movword ptr cs: [bmp_info.biClrImportant], 0

movword ptr cs: [bmp_info.biCompression+2], 0

movword ptr cs: [bmp_info.biSizeImage+2], 0

movword ptr cs: [bmp_info.biXPelsPerMeter+2], 0

movword ptr cs: [bmp_info.biYPelPerMeter+2], 0

movword ptr cs: [bmp_info.biClrUsed+2], 0

movword ptr cs: [bmp_info.biClrImportant+2], 0

; записBITMAPFILEHEADER

movcx, size bmp_header

mov ah,40h

movbx, word ptr cs: [handle]

pushds

pushcs

popds

movdx, offset bmp_header

int21h

popds

;======================================================

; записBITMAPINFOHEADER

movcx, size bmp_info

mov ah,40h

movbx, word ptr cs: [handle]

pushds

pushcs

popds

movdx, offset bmp_info

int21h

popds

;======================================================

; отриманняi запис палiтри

mov cx,256

xorsi, si

SAVE_P:

pushcx

; дiстаємопалiтру

mov dx,03c8h

movax, si

incsi

outdx, al

incdx

in al,dx

shl al,2

movbyte ptr cs: [bmp_rgb.rgbBlue], al

in al,dx

shl al,2

movbyte ptr cs: [bmp_rgb.rgbGreen], al

in al,dx

shl al,2

movbyte ptr cs: [bmp_rgb.rgbRed], al

movbyte ptr cs: [bmp_rgb.rgbRserved], 0


; пишемопалiтру – 1 колiр

movcx, size bmp_rgb

mov ah,40h

movbx, word ptr cs: [handle]

pushds

pushcs

popds

movdx, offset bmp_rgb

int21h

popds

popcx

loopSAVE_P

;======================================================

; теперзаписуємо графiчнi данi

pushes

pushds

pushcs

popds

mov dx,0a000h

moves, dx

movbx, word ptr cs: [handle]

movdx, offset data

mov cx,200

rows_b:

; ///////////

movword ptr cs: [row], cx

pushcx

mov cx,320

cols_b:; ///////////

pushax

mov ax,320

subax, cx

movword ptr cs: [col], ax

popax

pushcx

mov cx,1

; обчисленнязмiщення

pushdx

pushax

pushbx

mov ax,320

movbx, word ptr cs: [row]

mulbx

addax, word ptr cs: [col]

movsi, ax

popbx

popax

popdx


moval, es: [si]

movbyte ptr cs: [data], al

mov ah,40h

int21h

popcx

add si,2

loopcols_b

; ///////////

popcx

; ///////////

looprows_b

popds

popes

callclose_file

ret

mode_13hendp

;–

; перехопититекстовий режим

mode_textproc

callcreate_file

pushes

pushds

pushcs

popds

mov dx,0b800h

moves, dx

xorsi, si

movbx, word ptr cs: [handle]

movdx, offset data

mov cx,25

rows:

; ///////////

pushcx

mov cx,80

cols:; ///////////

pushcx

mov cx,1

moval, es: [si]

movbyte ptr cs: [data], al

mov ah,40h

int21h

popcx

add si,2

loopcols

; ///////////

; запис10,13

mov cx,1

movbyte ptr cs: [data], 10

mov ah,40h

int21h

movbyte ptr cs: [data], 13

mov ah,40h

int21h

popcx

; ///////////

looprows

popds

popes

callclose_file

ret

mode_textendp

;–

int28_treater:;обробник int 28h

pusha

pushf

; перевiркачи є виклик до роботи

cmpbyte ptr cs: [ready_to_write], 1

jneexit_28

; обнулитипоказник

movbyte ptr cs: [ready_to_write], 0

; починаєтьсяобробка


mov ah,0fh

int10h

; вal – режим

cmp al,3

jnecase_2

callmode_text; text_mode_3

jmpexit_28

case_2:

cmp al,13h

jnecase_3

callmode_13h; 320x200x256_13h

jmpexit_28

case_3:

; вихiд

exit_28:

popf

popa

jmpdword ptr cs: [old_int28_treater]

;–

int5_treater:;обробник клавiшi PrintScreen

movbyte ptr cs: [ready_to_write], 1

iret

rezident_end:

;–

; ГОЛОВНАТОЧКА ВХОДУ У ПРОГРАМУ

greetingdb 10,10,10,10,13,'Press PRINT_SCREEN to grab text screen or graphic!', 10,10,10,'$'

inital:

pushcs

popds

movdx, offset greeting

mov ah,9h

int21h

; посадкарезидента на int 5h

xorax, ax

movds, ax

cli

movax, offset int5_treater

movword ptr ds: [5h*4], ax

pushcs

popax

movword ptr ds: [5h*4+2], ax

sti

; посадкарезидента на int 28h

movax, word ptr ds: [28h*4]

movword ptr cs: [old_int28_treater], ax

movax, word ptr ds: [28h*4+2]

movword ptr cs: [old_int28_treater+2], ax

cli

movax, offset int28_treater

movword ptr ds: [28h*4], ax

pushcs

popax

movword ptr ds: [28h*4+2], ax

sti

; Залишитисьрезидентно

movdx, offset rezident_end

shr dx,4

add dx,16

mov ah,31h

xoral, al

int21h

endstart

ФАЙЛз описом структур     grabber.inc

BITMAPFILEHEADERstruc

bfTypedw 0; // тип файла (для битового образа – BM)

bfSizedd 0; // размер файла в dword

bfReserved1dw 0; // не используется

bfReserved2dw 0; // не используется

bfOffbitsdd 0; // смещение данных битового образа от

; //заголовка в байтах

BITMAPFILEHEADERends

;======================================================

BITMAPINFOHEADERstruc

biSizedd 0; // число байт, занимаемых структурой

; //BITMAPINFOHEADER

biWidthdd 0; // ширина битового образа в пикселах

biHeightdd 0; // высота битового образа в пикселах

biPlanesdw 1; // число битовых плоскостей устройства

biBitCountdw 0; // число битов на пиксель

biCompressiondd 0; // тип сжатия

biSizeImagedd 0; // размер картинки в байтах

biXPelsPerMeterdd 0; // горизонтальное разрешение устройства,

; //пиксел/м

biYPelPerMeterdd 0; // вертикальное разрешение устройства,

; //пиксел/м

biClrUseddd 0; // число используемых цветов

biClrImportantdd 0; // число «важных» цветов

BITMAPINFOHEADERends

;======================================================

RGBQUADstruc

rgbReddb 0; // интенсивность красного

rgbGreendb 0; // интенсивность зеленого

rgbBluedb 0; // интенсивность голубого

rgbRserveddb 0; // не используется

RGBQUADends

еще рефераты
Еще работы по информатике, программированию