Зеркальное отображение изображения, хранящегося в файле 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