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

Вирізання картинок з екрану та запис їх в 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 (клавіша PrintScreen) та 28h (переривання при якому відбувається збереження екрану). Потім вона залишається резидентною в пам’яті.

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


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


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

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


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


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


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

Висновок


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


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


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


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


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


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


grabber.asm


model tiny


286


include grabber.inc


code


org 100h


start:


jmp inital


old_int28_treater dd 0


ready_to_write db 0


filename_bmp db 'dump.bmp', 0


filename db 'dump.txt', 0


handle dw 0


data db 0


col dw 0


row dw 0


bmp_header BITMAPFILEHEADER <>


bmp_info BITMAPINFOHEADER <>


bmp_rgb RGBQUAD <>


;–


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


create_file_bmp proc


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


mov ah, 3ch


xor cx, cx


mov dx, offset filename_bmp


push ds


push cs


pop ds


int 21h


pop ds


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


ret


create_file_bmp endp


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


create_file proc


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


mov ah, 3ch


xor cx, cx


mov dx, offset filename


push ds


push cs


pop ds


int 21h


pop ds


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


ret


create_file endp


;–


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


close_file proc


mov ah, 3eh


mov bx, word ptr cs: [handle]


int 21h


ret


close_file endp


;–


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


mode_13h proc


call create_file_bmp


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


mov word ptr cs: [bmp_header.bfType], 4d42h


mov word ptr cs: [bmp_header.bfReserved1], 0


mov word ptr cs: [bmp_header.bfReserved2], 0


mov word ptr cs: [bmp_header.bfSize], 0fe36h


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


mov word ptr cs: [bmp_header.bfOffbits], 0436h


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


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


mov word ptr cs: [bmp_info.biSize], 28h


mov word ptr cs: [bmp_info.biWidth], 140h


mov word ptr cs: [bmp_info.biHeight], 0c8h


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


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


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


mov word ptr cs: [bmp_info.biPlanes], 1


mov word ptr cs: [bmp_info.biBitCount], 8


mov word ptr cs: [bmp_info.biCompression], 0


mov word ptr cs: [bmp_info.biSizeImage], 0


mov word ptr cs: [bmp_info.biXPelsPerMeter], 0b40h


mov word ptr cs: [bmp_info.biYPelPerMeter], 0b40h


mov word ptr cs: [bmp_info.biClrUsed], 100h


mov word ptr cs: [bmp_info.biClrImportant], 0


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


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


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


mov word ptr cs: [bmp_info.bi

YPelPerMeter+2], 0


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


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


; запис BITMAPFILEHEADER


mov cx, size bmp_header


mov ah, 40h


mov bx, word ptr cs: [handle]


push ds


push cs


pop ds


mov dx, offset bmp_header


int 21h


pop ds


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


; запис BITMAPINFOHEADER


mov cx, size bmp_info


mov ah, 40h


mov bx, word ptr cs: [handle]


push ds


push cs


pop ds


mov dx, offset bmp_info


int 21h


pop ds


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


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


mov cx, 256


xor si, si


SAVE_P:


push cx


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


mov dx, 03c8h


mov ax, si


inc si


out dx, al


inc dx


in al, dx


shl al, 2


mov byte ptr cs: [bmp_rgb.rgbBlue], al


in al, dx


shl al, 2


mov byte ptr cs: [bmp_rgb.rgbGreen], al


in al, dx


shl al, 2


mov byte ptr cs: [bmp_rgb.rgbRed], al


mov byte ptr cs: [bmp_rgb.rgbRserved], 0


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


mov cx, size bmp_rgb


mov ah, 40h


mov bx, word ptr cs: [handle]


push ds


push cs


pop ds


mov dx, offset bmp_rgb


int 21h


pop ds


pop cx


loop SAVE_P


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


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


push es


push ds


push cs


pop ds


mov dx, 0a000h


mov es, dx


mov bx, word ptr cs: [handle]


mov dx, offset data


mov cx, 200


rows_b:


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


mov word ptr cs: [row], cx


push cx


mov cx, 320


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


push ax


mov ax, 320


sub ax, cx


mov word ptr cs: [col], ax


pop ax


push cx


mov cx, 1


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


push dx


push ax


push bx


mov ax, 320


mov bx, word ptr cs: [row]


mul bx


add ax, word ptr cs: [col]


mov si, ax


pop bx


pop ax


pop dx


mov al, es: [si]


mov byte ptr cs: [data], al


mov ah, 40h


int 21h


pop cx


add si, 2


loop cols_b


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


pop cx


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


loop rows_b


pop ds


pop es


call close_file


ret


mode_13h endp


;–


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


mode_text proc


call create_file


push es


push ds


push cs


pop ds


mov dx, 0b800h


mov es, dx


xor si, si


mov bx, word ptr cs: [handle]


mov dx, offset data


mov cx, 25


rows:


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


push cx


mov cx, 80


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


push cx


mov cx, 1


mov al, es: [si]


mov byte ptr cs: [data], al


mov ah, 40h


int 21h


pop cx


add si, 2


loop cols


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


; запис 10,13


mov cx, 1


mov byte ptr cs: [data], 10


mov ah, 40h


int 21h


mov byte ptr cs: [data], 13


mov ah, 40h


int 21h


pop cx


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


loop rows


pop ds


pop es


call close_file


ret


mode_text endp


;–


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


pusha


pushf


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


cmp byte ptr cs: [ready_to_write], 1


jne exit_28


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


mov byte ptr cs: [ready_to_write], 0


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


mov ah, 0fh


int 10h


; в al – режим


cmp al, 3


jne case_2


call mode_text; text_mode_3


jmp exit_28


case_2:


cmp al, 13h


jne case_3


call mode_13h; 320x200x256_13h


jmp exit_28


case_3:


; вихiд


exit_28:


popf


popa


jmp dword ptr cs: [old_int28_treater]


;–


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


mov byte ptr cs: [ready_to_write], 1


iret


rezident_end:


;–


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


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


inital:


push cs


pop ds


mov dx, offset greeting


mov ah, 9h


int 21h


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


xor ax, ax


mov ds, ax


cli


mov ax, offset int5_treater


mov word ptr ds: [5h*4], ax


push cs


pop ax


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


sti


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


mov ax, word ptr ds: [28h*4]


mov word ptr cs: [old_int28_treater], ax


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


mov word ptr cs: [old_int28_treater+2], ax


cli


mov ax, offset int28_treater


mov word ptr ds: [28h*4], ax


push cs


pop ax


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


sti


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


mov dx, offset rezident_end


shr dx, 4


add dx, 16


mov ah, 31h


xor al, al


int 21h


end start



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


BITMAPFILEHEADER struc


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


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


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


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


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


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


BITMAPFILEHEADER ends


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


BITMAPINFOHEADER struc


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


; //BITMAPINFOHEADER


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


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


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


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


biCompression dd 0; // тип сжатия


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


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


; // пиксел/м


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


; // пиксел/м


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


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


BITMAPINFOHEADER ends


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


RGBQUAD struc


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


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


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


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


RGBQUAD ends

Сохранить в соц. сетях:
Обсуждение:
comments powered by Disqus

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

Слов:1761
Символов:16618
Размер:32.46 Кб.