Помощь в написании студенческих работ
Антистрессовый сервис

Зеркальное отображение изображения, хранящегося в файле BMP

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

Необходимо проанализировать считанный заголовок. Первое слово заголовка BMP файла всегда содержит символы «BM», представленные кодом 4D42h. По данной информации можно осуществить проверку формата файла и организовать выход, если формат не ВМР. Программа сравнивает атрибут структуры заголовка с кодом 4D42. В случае не совпадения выполнение программы должно прерваться. Так же необходим сравнить… Читать ещё >

Зеркальное отображение изображения, хранящегося в файле BMP (реферат, курсовая, диплом, контрольная)

Московский Энергетический Институт

(Технический Университет)

Курсовая работа

По дисциплине

" Системное Программное Обеспечение"

Зеркальное отображение изображения, хранящегося в файле BMP

Выполнил студент

Махов Роман

Москва, 2010

1. Анализ задания

2. Проектирование пользовательского интерфейса

2.1 Общие требования

2.2 Особенности программной реализации

3. Разработка алгоритма

3.1 Считывание информации из файла, анализ заголовка

3.2 Установка видеорежима и анализ его параметров

3.3 Разработка процедуры вывода изображения на экран

3.4 Схема алгоритма

4. Разработка второстепенных процедур и макрокоманд

5. Тестирование и отладка

Заключение

Приложение А. Перечень переменных, используемых в программе

Приложение Б. Листинг программы

1. АНАЛИЗ ЗАДАНИЯ Техническое задание:

Зеркальное отображение изображения, хранящегося в файле BMP (24 бит на точку). Данные остаются в старом файле или записываются в новый файл.

Необходимо реализовать выбор и открытие файлов. Также нужно проанализировать и реализовать программно случаи ввода некорректного входного файла (отсутствие файла, неверные тип, глубина цвета).

2. ПРОЕКТИРОВАНИЕ ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА

2.1 Общие требования Для верной работы программы необходимо указать точный пусть к входному и выходному файлам и их имена. Поэтому, после запуска программы надо реализовать ввод пользователем этих данных с клавиатуры. По завершению своего выполнения программа должна оповестить об этом пользователя.

Данные требования будут реализованы с помощью запросов на ввод данных с клавиатуры и сообщений о завершении работы.

2.2 Особенности программной реализации Методы вывода сообщений.

Для удобного пользовательского интерфейса, каждое выведенное на экран или введенное пользователем сообщение будет начинаться с новой строки.

Программно это реализуется переводом каретки на новую строку после ввода — вывода очередного сообщения. Дл я этого нам необходимо использовать функцию вывода на экран языка программирования assembler 09H для прерывания INT 21.

Пример реализации вывода на экран и перехода на новую строку.

mov ah, 09h

lea dx, message

int 21h

mov ah, 09h

lea dx, next_string

int 21h

Где message — ASCII-строка с выводимым сообщением, next_string — ASCII-строка с символами конца строки и переводом каретки.

Методы вывода сообщений Необходимо выбрать функцию, с помощью которой будет осуществлен ввод данных, их отображение на экране и сохранение введенных данных. Удовлетворяющая этим условиям функция — 0AH для прерывания INT 21.

Реализация команды:

mov ah, 0ah

lea dx, input_message

int 21h

Первый бит input_message должен содержать значение максимального количества вводимых символов. Второй бит формируется из подсчета вводимых символов. За вторым битом находится непосредственно вводимое сообщение.

Методы открытия, закрытия файла

В нашем случаем, нам необходима такая функция открытия файла, которая, которая осуществляется при наличии ASCII-строки с адресом файла, введенного пользователем с клавиатуры. Целесообразно предусмотреть возможность фиксации этой функцией ошибки, связанной с отсутствием запрашиваемого файла. Также она должна возвращать файловый номер, в случае успешного открытия, для дальнейшей работы с файлом.

Нам подходит 3DH срабатывающая по прерыванию INT 21. Для ее корректной работы требует ASCIIZ-строки с адресом и именем файла в формате:

<�Название диска>:<�названия папок>…<�имя файла>.bmp,

Об возникновении ошибки, данная функция оповещает флагом CF.

Если флаг СF = 0, то возвращает файловый номер.

Пример реализации данной функции:

mov ax, 3d02h

lea dx, pathname

int 21h

Где в регистре ax указывается номер функции и режим чтения — записи, а в регистре dx ASCIIZ-строку с адресом файла.

Закрытие файлов происходит перед окончанием программы и для этого применяется функция 3EH работающая по прерыванию INT21:

mov ah, 3eh

mov bx, file_handle

int 21h

В регистре bx указывается файловый номер ожидающего закрытия файла.

Методы создания выходного файла.

По техническому заданию обработанные данные входного файла должны быть помещены в созданный программой выходной файл. Для этого надо подобрать функцию языка программирования, которая создает файл по указанному пути и обеспечивает возможность редактировать этот файл. Функция удовлетворяющая этим условиям — 3СH работающая по прерыванию INT21.

Пример реализации функции:

mov ah, 3ch

mov cx, 0

lea dx, path_out_name

int 21h

Где 3ch — номер функции, в сx указывается атрибуты для файла (в данном случаем чтение, запись), path_out_name — ASCIIZ-строка с адресом файла.

3. РАЗРАБОТКА АЛГОРИТМА Разработаем алгоритм, который будет удовлетворять требованиям технического задания и разработанного пользовательского интерфейса.

3.1 Считывание информации из файла, анализ заголовка программа интерфейс изображение После осуществления доступа к входному файлу, необходимо считать информацию о его содержании. Так как, в начале каждого ВМР файла находится его заголовок, размер которого 54 байта, удобно разработать с программе структуру соответствующую этому заголовку. В первую необходимо считать заголовок из входного файла для дальнейшего анализа и формирования заголовка выходного файла. Для решения этой задачи удобно воспользоваться функцией языка assembler 3FH, выполняемая по прерыванию INT 21H. Перед выполнением считывания функция требует определения числа считываемых байтов информации, значение файлового номера, определяющего текущую позицию, с которой происходит считывание, а также буферную строку, куда помещается считанная информация. Для удобства будем использовать макрос чтения из файла, так как далее будет необходимо повторять чтение, но с другими параметрами.

Реализация чтения заголовка из файла:

Макрос чтения из файла

read_bmp macro par1, par2,par3

mov ah, 3Fh

mov bx, par1 ;идентификатор файла

mov cx, par2 ;количество читаемых/записываемых байт

lea dx, par3 ;путь к буферу чтения/записи

int 21h

endm

Чтение заголовка входного файла.

read_bmp bmphandle, 54, header

Необходимо проанализировать считанный заголовок. Первое слово заголовка BMP файла всегда содержит символы «BM», представленные кодом 4D42h. По данной информации можно осуществить проверку формата файла и организовать выход, если формат не ВМР. Программа сравнивает атрибут структуры заголовка с кодом 4D42. В случае не совпадения выполнение программы должно прерваться. Так же необходим сравнить глубину цветов с указанной в ТЗ (24-бита на пиксел). Для этого необходимо сравнить атрибут BitCount структуры заголовка со значением заданной глубины цвета. В случае не совпадения выполнение программы должно прерваться Так, как наша задача состоит в обработке и реконструкции изображения, то проверенный заголовок необходимо записать в выходной файл. Данную задачу легко реализовать с помощью с помощью функции языка программирования 40H, работающей по прерыванию INT21. Перед выполнением записи функция требует определения числа записываемых байтов информации, значение файлового номера выходного файла, а также буферную строку, из которой берем данные. Запись в файл, так же как и чтение удобно реализовать макросом:

макрос записи в файл

write_bmp macro par1, par2,par3

mov ax, 4000h

mov bx, par1 ;запись всегда в выходной файл

mov cx, par2 ;кол-во записываемых байт

lea dx, par3 ;из буфера

int 21h

endm

запись заголовка файла

write_bmp bmp_out_handle, 54, header ;запись заголовка файла

3.2 Разработка основной процедуры В соответствии с поставленным задание, необходимо сформировать в выходном файле зеркальное отображение входного файла. Для решения этой задачи будет использоваться процедура в которой определяются все параметры непосредственно изображения, необходимые для построчного преобразования пикселов. Понадобятся такие параметры как, размер данных изображения, количество строк и количество байтов одной строки.

На основании полученных данных будет построена процедура, осуществляющая построчное, попикселное изменение данных, записываемях в выходной bmp файл.

4. РАЗРАБОТКА ВТОРОСТЕПЕННЫХ ПРОЦЕДУР И МАКРОКОМАНД Название процедур, выполняющих второстепенные функции в программе, а также их характеристики описаны в таблице 1.

Таблица 1 Второстепенные процедуры

Название процедуры

Ее назначение

zero

Необходим для определения количества нулей дописываемых в конце строк данных изображения при использовании глубины цвета равной 24бита на пиксел.

exit

Данная процедура производит закрытие входного и выходного файлов, выводит сообщение о завершении работы программы и завершает ее.

5. ТЕСТИРОВАНИЕ И ОТЛАДКА Данный программный продукт можно тестировать по нескольким направлениям:

а) На попытку открыть файл очень большого размера .

Реализуем программу таким образом, что в данном случае, программа завершится и выдаст сообщение о неправильном действии .

Случай открытия не ВМР файла, открытия ВМР файла с глубиной цвета отличной от 24 бит на пиксел, указания неверного или несуществующего имени файла был оговорен выше.

ЗАКЛЮЧЕНИЕ

Исходя из вышеприведенного описания, разработанная программа для выполнения требует:

а) Наличие на диске 24-разрядный .BMP файла При описании процесса разработки были выполнены все требования технического задания. Однако данный программный продукт может быть усовершенствован в следующих направлениях:

а) Внедрение более совершенного диалога пользователя с программой для предоставления более широкого диапазона возможных действий в случаях невыполнения условий работоспособности и большей наглядности проводящейся работы.

б) Разработка более совершенных алгоритмов вывода графического изображения на экран компьютера.

1. Абель П., Язык ассемблера для IBM PC и программирования — М.: Высшая школа, 1992. — 447 с.

2. Финогенов К. Г., Самоучитель по системным функциям MS-DOS. — М.: Горячая линия — Телеком, 2001. — 382 с.

3. Соколенко П., Программирование SVGA-графики для IBM PC.

ПРИЛОЖЕНИЕ А. Перечень переменных, используемых в программе Полный перечень всех переменных с описанием приведен в таблице 2.

Таблица 2 Переменные объявленные в программе

Идентификатор

Смысл

bmphandle

Индикатор входного файла

bmp_out_handle

Индикатор выходного файла

realwidth_bmp

Ширина изображения

len

Размер данных изображения

mid_px

Средний пиксел

str_c

Количество строк

wdth_b

Длинна строки в байтах

mid_b

Средний байт

nol

Количество нулей добавляемых в конце стоки

offbits

Количество бит в пикселе

ПРИЛОЖЕНИЕ Б Листинг программы

.model small

.stack 100h

.data

;————————————————————————————————————— mess_in db 'Please, input the adress of source bmp file:','$'

mess_out db 'Please, input the adress of out bmp file:','$'

mess_done db 'done.','$'

err_no_file_m db 'There is no such file!','$'

err_type_m db 'Incorrect type of the file','$'

err_bitcount_m db 'Incorrect value of bitcount','$'

err_width_m db 'The width of your bmp file must be less than 10 919 px','$'

prop db 10,13,'$'

;———————————————————————————————————;

bmphandle dw ?

bmp_out_handle dw ?

realwidth_bmp dw ?

;———————————————————————————————————;

str_list label byte ;список параметров для облости ввода

max_len db 127

act_len db ?

pathname db 30 dup (' ')

str_list_out label byte

max_len_out db 127

act_len_out db ?

path_out_name db 30 dup (' ')

;———————————————————————————————————;

title_bmp struc ;структура .bmp файла

type_bmp dw? ;Сигнатура «BM»

sizefh dd? ;Размер файла

reserved dd? ;Зарезервировано

offsetbits dw 2 dup (?) ;Смещение изображения от начала файла

sizeih dd? ;Длинна заголовка

width_bmp dw? ;Ширина изображения

width_bmph dw ?

height_bmp dd? ;Высота изображения

planes dw? ;Число проскостей

bitcount dw? ;Глубина цвета, бит на точку

compression dd? ;Тип компрессии

size_image dd? ;Размер изображения, байт

xpels dd 2 dup (?) ;Горизонтальное разрешение точки на метр

colorsused dd? ;Число используемых цветов

colorsimportant dd? ;Число основных цветов

title_bmp ends

header title_bmp <>

;———————————————————————————————————;

buff db 32 768 dup (?) ;размер буфера

len dw? ;размер данных изображения

mid_px dw? ;средний пиксел

str_c dw? ;кол-во строк

wdth_b dw? ;длинна строки в байтах

mid_b dw? ;средний байт

nol dw ?

offbits dw? ;кол во байт на пиксел

;———————————————————————————————————;

.code

;———————————————————————————————————;

;макрос чтения из файла

read_bmp macro par1, par2,par3

mov ah, 3Fh

mov bx, par1 ;идентификатор файла

mov cx, par2 ;количество читаемых/записываемых байт

lea dx, par3 ;путь к буферу чтения/записи

int 21h

endm

;———————————————————————————————————;

;макрос записи в файл

write_bmp macro par1, par2,par3

mov ax, 4000h

mov bx, par1 ;индакатор выходного файла

mov cx, par2 ;кол-во записываемых байт

lea dx, par3 ;из буфера

int 21h

endm

;———————————————————————————————————;

begin:

mov ax,@data ;установка регистра ds на начало

mov ds, ax ;сегмента данных

mov ah, 09h

lea dx, mess_in ;Please, input the adress of bmp file

int 21h

mov ah, 09h

lea dx, prop; Переводим каретку на след. строку

int 21h

mov ah, 0ah

lea dx, max_len ;input adress of source bmp

int 21h

xor bx, bx

mov bl,[max_len+1]

mov [pathname+bx], 0

mov ah, 09h

lea dx, prop; Переводим каретку на след. строку

int 21h

mov ah, 09h

lea dx, mess_out ;Please, input the adress of out bmp file

int 21h

mov ah, 09h

lea dx, prop; Переводим каретку на след. строку

int 21h

mov ah, 0ah

lea dx, max_len_out ;input adress of out bmp

int 21h

xor bx, bx

mov bl,[max_len_out+1]

mov [path_out_name+bx], 0

mov ax, 3d02h ;открытие исходного файла

lea dx, pathname

int 21h

jnc file_rdy

call err_no_file

file_rdy:mov bmphandle, ax

read_bmp bmphandle, 54, header ;чтение заголовка файла

cmp header. type_bmp, 4d42h ;проверка типа 4d42 = 'bm'

je check_wdth

call err_type

;———————————————————————————————————- check_wdth:

cmp header. width_bmph, 0 ;проверка ширины

je next_check

call err_width

next_check:

cmp header. width_bmp, 10 919

JBE exit_file

call err_width

;———————————————————————————————————- exit_file: ;создание выходного файла

mov ah, 3ch

mov cx, 0

lea dx, path_out_name

int 21h

mov bmp_out_handle, ax

write_bmp bmp_out_handle, 54, header ;запись заголовка файла

;———————————————————————————————————;

cmp_bit:

cmp header. bitcount, 24 ;проверка глубины

jne cmp_err

mov [offbits], 3

jmp cmp_off

cmp_err:

call err_bitcount

cmp_off:

mov ax,[header.offsetbits]

cmp ax, 54

je cmp_ax

sub ax, 54

mov di, ax

read_bmp bmphandle, di, buff

write_bmp bmp_out_handle, di, buff

cmp_ax: call main

;———————————————————————————————————- zero proc near ;процедура, которая вычисляет кол-во нулей, дописанных в конце строки.

xor dx, dx

mov ax,[realwidth_bmp]

mov bx, 4

div bx

mov [nol], dx

ret

zero endp

;———————————————————————————————————;

mirror proc near ;процедура, которая реализует перестановку байт в памяти, начиная с адреса buff.

mir_buff:

mov di,[wdth_b]

sub di,[offbits]

push cx

mov cx,[mid_px]

mir_str:

push cx

mov cx,[offbits]

mini_str:

mov dh,[bx]

mov dl,[bx+di]

mov [bx], dl

mov [bx+di], dh

inc bx

loop mini_str

pop cx

sub di,[offbits]

sub di,[offbits]

loop mir_str

add bx,[mid_b]

cmp [nol], 0

je pop_cx

add bx,[nol]

pop_cx: pop cx

loop mir_buff

write_bmp bmp_out_handle,[len], buff ;запись в файл

ret

mirror endp

;———————————————————————————————————- main proc near ;основная процедура: инициализация переменных, вызов других процедур

mov ax,[header.width_bmp]

mov [realwidth_bmp], ax

mov bx,[offbits]

mul bx

mov [wdth_b], ax

;———————————————————————————————————- call zero

;———————————————————————————————————- cmp realwidth_bmp, 10 919 ;проверка ширины

jbe widthl

call err_width

;———————————————————————————————————;

widthl: ;задание значение переменным

mov cx,[wdth_b]

add cx,[nol]

xor dx, dx

mov ax, 32 768

div cx

mov [str_c], ax

mov ax, cx

mul [str_c]

mov [len], ax

xor dx, dx

mov ax, [realwidth_bmp]

mov bx, 2

div bx

mov [mid_px], ax

push dx

xor dx, dx

mov bx,[offbits]

mul bx

mov [mid_b], ax

pop dx

cmp dx, 0

je je_mid_dx

mov cx,[offbits]

add [mid_b], cx

je_mid_dx:

mov cx, 1

push cx

rd: ;считывание из файла

read_bmp bmphandle,[len], buff

jc exit

cmp ax, cx ;если оставшаяся часть файла меньше [len]

je je_ax_cx

pop cx

mov cx, 0

push cx

mov [len], ax

xor dx, dx

div [wdth_b]

cmp ax, 0

je exit

mov [str_c], ax

je_ax_cx:

lea bx, buff

mov cx,[str_c]

call mirror

pop cx

cmp cx, 0

je exit

push cx

jmp rd

ret

main endp

;———————————————————————————————————;

err_no_file proc near

mov ah, 09h

lea dx, err_no_file_m ;There is no such file!

int 21h

call exit

err_no_file endp

;———————————————————————————————————;

err_type proc near

mov ah, 09h

lea dx, err_type_m ;Incorrect type of the file

int 21h

call exit

err_type endp

;———————————————————————————————————;

err_bitcount proc near

mov ah, 09h

lea dx, err_bitcount_m ;Incorrect value of bitcount

int 21h

call exit

err_bitcount endp

;———————————————————————————————————;

err_width proc near

mov ah, 09h

lea dx, err_width_m ;The width of your bmp file must be less than 10 919 px

int 21h

call exit

err_width endp

;———————————————————————————————————;

exit proc near ;процедура, которая завершает работу программы,

;и выводит соответствующее сообщение

mov ah, 3eh

mov bx, bmphandle

int 21h

mov ah, 3eh

mov bx, bmp_out_handle

int 21h

mov ah, 09h

lea dx, prop; пропускаем строку

int 21h

mov ah, 09h

lea dx, mess_done ;done.

int 21h

mov ax, 4c00h ;завершение программы

int 21h

exit endp

;———————————————————————————————————;

End

Показать весь текст
Заполнить форму текущей работой