это быстро и бесплатно
Оформите заказ сейчас и получите скидку 100 руб.!
ID (номер) заказа
3356136
Ознакомительный фрагмент работы:
HYPERLINK \l "_СОДЕРЖАНИЕ" \o "СОДЕРЖАНИЕ"СОДЕРЖАНИЕ
Описание рабочего места . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Постановка задачи…………………………………………………….. 4
Описание сути разрабатываемого алгоритма………………………. 5
4. Описание формата изображения, которое будет преобразовываться . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . …… 8
5. Блок-схема с описанием алгоритма преобразования и описанием листинга программы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . 17
6. Листинг программы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
7. Скриншоты с результатом работы программы . . . . . . . . . . . . . . . . . 31
8. Примеры работы программ (начальное и конечное изображение). . 33
Список использованных источников . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Описание рабочего места
Рабочее место создания программы представляет собой среду DOS-BOX с установленной системой OS MS DOS, средой программирования на языке Ассемблер TASM, включающей компилятор TASM.EXE, линковщик TLINK.EXE и отладчик (Турбо-Дебаггер TD.EXE).
Текст программы набирается в обычном текстовом редакторе и запускается на компиляцию строкой:
tasm /zd /zi /l primer1.asm
Если есть ошибки – они выводятся на экран и в файл листинга primer1.lstКогда нет ошибок компиляции, можно переходить к этапу линковки (производства исполняемого файла с расширением .exe) командой:
tlink /x /v primer1
(предполагается, что исходный файл с текстом программы на ассемблере назывался primer1.asm).
Постановка задачи
Задание.
Написать программу, которая читает данные из файла с изображением, преобразовывает изображение по алгоритму в соответствии с вариантом, выводит последовательно оба изображения на экран и сохраняет результирующее изображение в файл.
Вариант 14
Нарисовать рисунок из одного файла поверх рисунка в другом файле
Описание сути разрабатываемого алгоритма
Алгоритм.
1. Вначале работаем с первым изображением (изображение в 245 цветов формата BMP размером не больше чем 320 на 200 точек, этот же формат у второго и третьего изображения). Считываем первое изображение из внешнего файла ztest.bmp .
2. Сохраняем заголовок и палитру первого изображения в памяти
3. Сохраняем длину и ширину первого изображения. Если ширина изображения (размер строки растра) не кратен 4, то он должен дополняться до кратности 4, вычисляем это число (которое надо будет прибавлять к размеру строки растра) и также сохраняем его в памяти.
4. Выводим первое изображение на экран
4. Считываем второе изображение из внешнего файла xtest.bmp. Сохраняем длину и ширину второго изображения в переменных памяти.
5. Выводим второе изображение на экран
6. Сравниваем длины и ширины первого и второго изображения. Если не совпадают, то выводим сообщение об ошибке и завершаем работу программы.
7. Теперь надо сформировать третье изображение result.bmp из двух изображений по алгоритму: нарисовать рисунок из одного файла поверх рисунка в другом файле. Для всех точек двух изображений (одинакового размера) : если точка 1-го изображения белая, то в третий файл изображения помещаем соответствующую точку из 2-го изображения. Если точка 1-го изображения не белого цвета, то в третий файл изображения помещаем эту точку из 1-го изображения.
8. Заголовок и палитру в третий файл изображение помещаем из певрого файла изображения.
9. Закрываем все файлы. Результирующее изображение сформировано в файле result.bmp
10. Выводим дополнительно третье результирующее изображение на экран.
11. Конец программы.
То есть программа позволяет работать с изображениями формата BMP с палитрой из 256 цветов и размер изображения не больше 320х200 точек. Особенную трудность вызвало дополнение от 1 до 3 пустых (нулевых) байтов и перерасчеты при выводе изображения в случае если размер строки растра не кратен 4. А также трудность была в том случае, когда размер изображения меньше чем 320 на 200 точек.
Программа разрабатывалась поэтапно и тестировалась в среде td.exe в пошаговом режиме. На это было затрачено много времени.
Рисунок 1. Отладка программы в Турбо-дебаггере (td.exe)
Рисунок 2. Отладка программы в Турбо-дебаггере (td.exe)
Описание формата изображения, которое будет преобразовываться
Формат изображений – BMP. Чтобы программа работала в MS DOS и не была чрезвычайно сложной выберем максимальное количество цветов – 256 и размер рисунка меньше или равно 320 на 200 точек.
Формат BMP описан в электронных источниках [1] и [2]
BMP (от англ. HYPERLINK "https://ru.wikipedia.org/wiki/%D0%91%D0%B8%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BA%D0%B0%D1%80%D1%82%D0%B0" \o "Битовая карта" Bitmap Picture) — формат хранения растровых изображений, разработанный компанией HYPERLINK "https://ru.wikipedia.org/wiki/Microsoft" \o "Microsoft" Microsoft. Файлы формата BMP могут иметь расширения .bmp, .dib и .rle.
С форматом BMP работает огромное количество программ, так как его поддержка интегрирована в операционные системы HYPERLINK "https://ru.wikipedia.org/wiki/Windows" \o "Windows" Windows и OS/2. Кроме того, данные этого формата включаются в двоичные файлы ресурсов RES и в PE-файлы.
В данном формате можно хранить только однослойные растры. На каждый пиксель в разных файлах может приходиться разное количество бит (глубина цвета). Microsoft предлагает битности 1, 2, 4, 8, 16, 24, 32, 48 и 64. В битностях 8 и ниже цвет указывается индексом из таблицы цветов (палитры), а при бо́льших — непосредственным значением. Цвет же в любом случае можно задать только в цветовой модели RGB (как при непосредственном указании в пикселе, так и в таблице цветов), но в битностях 16 и 32 можно получить HYPERLINK "https://ru.wikipedia.org/wiki/Grayscale" \o "Grayscale" Grayscale с глубиной до 16 и 32 бит, соответственно. Частичная прозрачность реализована HYPERLINK "https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D1%8C%D1%84%D0%B0-%D0%BA%D0%B0%D0%BD%D0%B0%D0%BB" \o "Английский язык" альфа-каналом различных битностей, но при этом прозрачность без градаций можно косвенно получить RLE-кодированием.В большинстве случаев пиксели хранятся в виде относительно простого двумерного массива. Для битностей 4 и 8 доступно RLE-кодирование, которое может уменьшить их размер. Формат BMP также поддерживает встраивание данных в форматах JPEG и PNG. Но последнее скорее больше предназначено не для компактного хранения, а для обхода ограничений архитектуры GDI, которая не предусматривает прямую работу с изображениями отличных от BMP форматов. В последних версиях формата BMP также появились возможности по управлению цветом. В частности, можно указывать конечные точки, производить гамма-коррекцию и встраивать цветовые профили ICC.
Структуры формата
Формат bmp (от слов BitMaP - битовая карта, или, говоря по-русски, битовый массив) представляет из себя несжатое (в основном) изображение, которое довольно легко читается и выводится в ОС Windows, в которой есть специальные функции API, которые в этом помогают.Для начала приведем графическое представление данных в bmp (картинка взята из MSDN).
В начале стоит заголовок файла (BITMAPFILEHEADER). Он описан следующим образом:
typedef struct tagBITMAPFILEHEADER { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } BITMAPFILEHEADER, *PBITMAPFILEHEADER;
bfType определяет тип файла. Здесь он должен быть BM. Если Вы откроете любой файл BMP в текстовом (а лучше в 16-ричном редакторе), то увидите, что первые два символа - это BM (от слова BitMap, как вы уже, наверное, догадались).bfSize - это размер самого файла в байтах. Строго говоря вы должны его высчитывать (что рекомендуется), но я ставил размер файла неправильно (правда, не нарочно :)) и никаких проблем не было (ACDSee читало без проблем, моя программа работала), но я вам не рекомендую писать его заведомо неправильно, вдруг появится добросовестная программа, которая сверит этот размер с настоящим и решит, что это не bmp, а что-нибудь другое. В идеале все программы для того, чтобы убедиться, что перед ними действительно bmp, а не подделка, должны, во-первых, проверить, что bfType содержит "BM" (без кавычек), а, во-вторых, что bfSize равен размеру файла.bfReserved1 и bfReserved2 зарезервированы и должны быть нулями.bfOffBits. Это один из самых важных полей в этой структуре. Он показывает, где начинается сам битовый массив относительно начала файла (или, как написано в MSDN, "от начала структуры BITMAPFILEHEADER"), который и описывает картинку. То есть, чтобы гарантированно попадать на начало массива вы должны писать:
SetFilePointer (hFile, bfh.bfOffBits, NULL, FILE_BEGIN);
ИсходникЗдесь и далее будем считать, что переменная bfh объявлена как BITMAPFILEHEADER bfh;
biSize - это размер самой структуры. Ее нужно инициализировать следующим образом: bih.biSize = sizeof (BITMAPINFOHEADER);Снова здесь и дальше будем считать, что bih объявлена следующим образом: BITMAPINFOHEADER bih;biWidth и biHeight задают соответственно ширину и высоту картинки в пикселях.biPlanes задает количество плоскостей. Пока оно всегда устанавливается в 1.biBitCount - Количество бит на один пиксель. Подробнее про это поговорим ниже.biCompression обозначает тип сжатия. Не удивляйтесь и не пугайтесь, что в bmp и вдруг сжатие. Я лично не видел не одной сжатой bmp (но я не говорю, что таких не существует). Если сжатия нет, то этот флаг надо устанавливать в BI_RGB. В этой статье мы говорим про несжатый формат, поэтому другие флаги я даже не буду перечислять. Похоже, что эта же структура используется и в файлах JPEG и PNG, потому что, начиная с Windows 98 тут появились варианты BI_JPEG, которая показывает, что эта картинка - JPEG и BI_PNG, что это PNG (про формат Jpeg я ничего не знаю, я только сделал эти выводы исходя из того, что написано в MSDN).biSizeImage обозначает размер картинки в байтах. Если изображение несжато (то есть предыдущее поле установлено в BI_RGB), то здесь должен быть записан ноль. biXPelsPerMeter и biYPelsPerMeter обозначают соответственно горизонтальное и вертикальное разрешение (в пикселях на метр) конечного устройства, на которое будет выводиться битовый массив (растр). Приложение может использовать это значение для того, чтобы выбирать из группы ресурсов наиболее подходящий битовый массив для нужного устройства. Дело в том, что формат bmp - это по сути аппаратно-независимый растр, то есть когда внешний вид того, что получается не зависит от того, на что этот растр проецируется (если можно так выразится). Например, картинка будет выглядеть одинаково вне зависимости от того, рисуется она на экране монитора или печатается на принтере. Но вот разрешение у устройств разное, и именно для того, чтобы выбрать наиболее подходящую картинку из имеющихся и используют эти параметры.biClrUsed определяет количество используемых цветов из таблицы. Если это значение равно нулю, то в растре используется максимально возможное количество цветов, которые разрешены значением biBitCount. Это актуально только для сжатых картинок. Если biClrUsed не нуль и biBitCount меньше 16, то biClrUsed определяет текущее число цветов графического движка или доступного драйвера устройства. Если biBitCount больше или равно 16, то biClrUsed определяет размер таблицы цветов, используемой для оптимизации текущей системной палитры.biClrImportant - это количество важных цветов. Определяет число цветов, которые необходимы для того, чтобы изобразить рисунок. Если это значение равно 0 (как это обычно и бывает), то все цвета считаются важными.
Виды формата BMP
Все разновидности формата bmp условно можно разделить на два типа: палитровые и беспалитровые. То есть используется в данном с формате палитра или нет. Заметьте, что палитра может быть даже в беспалитровых форматах, только там она не используется. В беспалитровых bmp цвет высчитывается прямо из тех битов, которые идут в файле, начиная с некоторого места. А в палитровых каждый байт описывает один или несколько пикселей, причем значения байта (или битов) - это индекс цвета в палитре. Для начала приведу таблицу, которая сравнивает возможные варианты. Вид картинки (палитровая или беспалитровая) зависит от того, сколько бит отдается на один пиксель, то есть от значения biBitCount структуры BITMAPINFOHEADER.
biBitCountПалитровый или беспалитровый формат Максимально возможное количество цветов Примечания
1 Палитровый2 Двуцветная, заметьте, не обязательно черно-белая, палитровая картинка. Если бит растра (что это такое чуть ниже) сброшен (равен 0), то это значит, что на этом месте должен быть первый цвет из палитры, а если установлен (равен 1), то второй.
4 Палитровый16 Каждый байт описывает 2 пикселя. Вот пример из HYPERLINK "http://msdn.microsoft.com/" MSDN.Если первый байт в картинке 0x1F, то он соответствует двум пикселям, цвет первого - второй цвет из палитры (потому что отсчет идет от нуля), а второй пиксель - 16-й цвет палитры.
8 Палитровый256 Один из самых распространенных вариантов. Но в то же время и самых простых. Палитра занимает один килобайт (но на это лучше не рассчитывать). Один байт - это один цвет. Причем его значение - это номер цвета в палитре.
16 Беспалитровый2^16 или 2^15 Это самый запутанный вариант. Начнем с того, что он беспалитровый, то есть каждые два байта (одно слово WORD) в растре однозначно определяют один пиксель. Но вот что получается: битов-то 16, а компонентов цветов - 3 (Красный, Зеленый, Синий). А 16 никак на 3 делиться не хочет. Поэтому здесь есть два варианта. Первый - использовать не 16, а 15 битов, тогда на каждую компоненту цвета выходит по 5 бит. Таким образом мы можем использовать максимум 2^15 = 32768 цветов и получается тройка R-G-B = 5-5-5. Но тогда за зря теряется целый бит из 16. Но так уж случилось, что наши глаза среди всех цветов лучше воспринимают зеленый цвет, поэтому и решили этот один бит отдавать на зеленую компоненту, то есть тогда получается тройка R-G-B = 5-6-5, и теперь мы может использовать 2^16 = 65536 цветов. Но что самое неприятное, что используют оба варианта. В MSDN предлагают для того, чтобы различать сколько же цветов используется, заполнять этим значением поле biClrUsed из структуры BITMAPINFOHEADER. Чтобы выделить каждую компоненту надо использовать следующие маски. Для формата 5-5-5: 0x001F для синей компоненты, 0x03E0 для зеленой и 0x7C00 для красной. Для формата 5-6-5: 0x001F - синяя, 0x07E0 - зеленая и 0xF800 красная компоненты соответственно.
24 Беспалитровый2^24 А это самый простой формат. Здесь 3 байта определяют 3 компоненты цвета. То есть по компоненте на байт. Просто читаем по структуре RGBTRIPLE и используем его поля rgbtBlue, rgbtGreen, rgbtRed. Они идут именно в таком порядке.
32 Беспалитровый2^32 Здесь 4 байта определяют 3 компоненты. Но, правда, один байт не используется. Его можно отдать, например, для альфа-канала (прозрачности). Читать растр в данном случае удобно структурами RGBQUAD, которая описана так:
Для нашего формата 256 цветов нам надо будет вначале считать 54 байтов заголовка изображения. Причем по смещению 18 находится ширина изображения и по смещению 22 находится длина изображения. Эти данные сохраним в переменные памяти. Затем 256 байтов палитры и остальные данные – это массив данных точек (по 4 байта на каждую точку растра в палитре и по одному байту – индексу смещения в таблице палитры в массиве данных изображения). Пример:
Рисунок 3. Формат первого изображения ztest.bmp подробно и наглядно.
Итак, мы видим, что по смещению 18 (0х12) находится ширина изображения – число 0140 (в 16-ричном формате), что дает в десятичном счислении число 320 и по смещению 22 (0х16) число С8 = 200. Т.е. изображение имеет размеры 320 на 200 точек.
Для других тестовых рисунков (например размеров рисунков 20 на 20) в этих смещениях заголовков рисунков стоят другие числа.
Блок-схема с описанием алгоритма преобразования
и описанием листинга программы
Блок-схема.
Затем линии из изображения 1 копируются в результирующее изображение 3 (result.bmp)
Листинг программы состоит из главной процедуры (точка входа start) и вспомогательных процедур:
OpenFile – открытие файла изображения
ReadHeader – считывание заголовка изображения
ReadPalette – считывание палитры изображения
CopyPal - копирование палитры для вывода на экран
CopyBitmap – копирование изображения (массива точек) на экран
CloseFile – закрытие файла изображения
Листинг программыЛистинг исходного кода программы:
IDEAL
MODEL small
STACK 100h
DATASEG
;================================
filename db 'ztest.bmp',0,0,0
filename1 db 'ztest.bmp',0,0
filename2 db 'xtest.bmp',0,0
fileresult db 'result.bmp',0,0
filehandle dw ?
filehandle1 dw ?
filehandle2 dw ?
filehandle3 dw ?
Header db 54 dup (0)
Palette db 256*4 dup (0)
ScrLine db 324 dup (0)
ScrLine2 db 324 dup (0)
ScrLineResult db 324 dup (0)
dx1 dw 0
dy1 dw 0
dx2 dw 0
dy2 dw 0
dop0 dw 0
BmpData dw 0
;; BmpData db 320*200 dup (0)
ErrorMsg1 db 'Error', 13, 10,'$'
ErrorMsg2 db 'Razmers of bmp-files not equal or > 320x200 pixels', 13, 10,'$'
;================================
CODESEG
;================================
proc OpenFile ; Open file
mov ah, 3Dh
xor al, al
mov dx, offset filename
int 21h
jc openerror mov [filehandle], ax
ret openerror:
mov dx, offset ErrorMsg1
mov ah, 9h
int 21h
retendp OpenFile; ***
proc CloseFile mov ah, 3Eh
xor al, al
mov bx, [filehandle]
int 21h
endp CloseFile; ***
proc ReadHeader ; Read BMP file header, 54 bytes
mov ah,3fh
mov bx, [filehandle]
mov cx,54
mov dx,offset Header
int 21h
ret endp ReadHeader;; ***
proc ReadPalette ; Read BMP file color palette, 256 colors * 4 bytes (400h)
mov ah,3fh
mov cx,400h
mov dx,offset Palette
int 21h
retendp ReadPalette; ***
proc CopyPal ; Copy the colors palette to the video memory
; The number of the first color should be sent to port 3C8h
; The palette is sent to port 3C9h
mov si,offset Palette
mov cx,256
mov dx,3C8h
mov al,0
; Copy starting color to port 3C8h
out dx,al ; Copy palette itself to port 3C9h
inc dx PalLoop:
; Note: Colors in a BMP file are saved as BGR values rather than RGB.
mov al,[si+2] ; Get red value.
shr al,2 ; Max. is 255, but video palette maximal
; value is 63. Therefore dividing by 4. out dx,al ; Send it.
mov al,[si+1] ; Get green value.
shr al,2
out dx,al ; Send it.
mov al,[si] ; Get blue value.
shr al,2
out dx,al ; Send it.
add si,4 ; Point to next color.
; (There is a null chr. after every color.)
loop PalLoop retendp CopyPal;; ***
; proc CopyDataBmp; mov ah,3fh
; mov cx,320*200
; mov dx,offset BmpData; int 21h
; endp CopyDataBmp; ***
proc CopyBitmap ; BMP graphics are saved upside-down.
; Read the graphic line by line (200 lines in VGA format),
; displaying the lines from bottom to top.
mov ax, 0A000h
mov es, ax
mov cx,[dy1] ; макс = 200
PrintBMPLoop:
push cx ; di = cx*320, point to the correct screen line
mov di,cx shl cx,6
shl di,8
add di,cx ; Read one line
mov ah,3fh
;; mov cx,[dx1] ;; max 320
mov dx,[dx1] ;; 320
mov cx,[dop0]
cmp cx,0
je z51
z50:
inc dx loop z50
z51:
add cx,dx mov dx,offset ScrLine int 21h
; Copy one line into video memory
cld
; Clear direction flag, for movsb mov cx,[dx1] ;; 320
mov si,offset ScrLine rep movsb
pop cx loop PrintBMPLoop retendp CopyBitmap; Написать программу, которая читает данные из файла с изображением, преобразовывает изображение по ; алгоритму в соответствии с вариантом, выводит последовательно оба изображения на экран и сохраняет ; результирующее изображение в файл.
; Вариант 14
; Нарисовать рисунок из одного файла поверх рисунка в другом файле
; исходные файлы - ztest.bmp xtest.bmp . Результат в файле result.bmp;
; Размер рисунков должен быть одинаков и не больше чем 200 на 320 точек
; 256 цветов. biBitCount = 8
;================================
; Begin of Programm;================================
start:
mov ax, @data
mov ds, ax
;================================
; Graphic mode
; mov ax, 13h
mov ah,0
mov al,13h
int 10h
; Process BMP file
;; First bmp-file
call OpenFile call ReadHeader; save dlina and shirina 1 risunok in memory
push si push ax
push bx mov si,offset Header
mov ax,[si+18]
mov [dx1],ax
mov ax,[si+22]
mov [dy1],ax
xor ax,ax;; если размер строки растра не кратен 4, то она дополняется от 1 до 3 пустыми (нулевыми)
;; байтами, чтобы длина строки оказалась кратна параграфу.
mov ax,[dx1] ;; 320
mov bh,0
mov bl,4
div bl ;; частное помещается в AL, остаток от деления - в AH
mov al,ah ;; нас интересует остаток от деления
mov ah,0
mov [dop0],ax ;; сколько доп.пробелов в конце каждой строки растра
pop bx pop ax
pop si call ReadPalette call CopyPal call CopyBitmap call CloseFile ; Wait for key press
mov ah,1
int 21h
mov ax, @data
mov ds, ax
mov al,[filename]
mov al,120 ;; bukva x - xtest.bmp
mov [filename],al
;; mov byte ptr ds:[dx],120 ; 'x'
;; Second bmp-file
call OpenFile call ReadHeader call ReadPalette call CopyPal call CopyBitmap call CloseFile; save dlina and shirina 2 risunok in memory
mov si,offset Header
mov ax,[si+18]
mov [dx2],ax
mov ax,[si+22]
mov [dy2],ax
xor ax,ax ; Wait for key press
mov ah,1
int 21h
;; проверяем чтобы размеры рисунков совпадали
mov ax,[dx1]
mov bx,[dx2]
cmp ax,bx jne vixod1
mov ax,[dy1]
mov bx,[dy2]
cmp ax,bx jne vixod1
mov ax,[dx1] ; dlina mov bx,[dy1] ; shirina cmp ax,320
jg vixod1
cmp bx,200
jg vixod1
xor ax,ax xor bx,bx jmp next1
vixod1:
; Back to text mode
mov ah, 0
mov al, 2
int 10h
;; print message: "Razmers not equal..."
mov dx, offset ErrorMsg2
mov ah, 9h
int 21h
; Wait for key press
mov ah,1
int 21h
;; exit from programm mov ax, 4c00h
int 21h
next1:
;; Сравниваем в цикле по всем точках данные первого и второго изображения
; Open file 1 and 2 and create file 3
mov cx,0
mov al,1
mov ah, 3CH ;; создать файл через описатель
;; xor al, al
mov dx, offset fileresult int 21h
mov [filehandle3], ax
xor ax,ax mov ah, 3Dh
xor al, al
mov dx, offset filename1
int 21h
mov [filehandle1], ax
xor ax,ax mov ah, 3Dh
xor al, al
mov dx, offset filename2
int 21h
mov [filehandle2], ax
xor ax,ax
mov bx, [filehandle1]
mov [filehandle], bx call ReadHeader mov bx, [filehandle2]
mov [filehandle], bx call ReadHeader mov bx, [filehandle1]
mov [filehandle], bx call ReadPalette mov bx, [filehandle2]
mov [filehandle], bx call ReadPalette;; save to 3 file bmp Header and Palette
mov bx, [filehandle3]
mov ah,40h ;; писать в файл через описатель
mov cx,54
mov dx,offset Header
int 21h
mov bx, [filehandle3]
mov ah,40h ;; писать в файл через описатель
mov cx,256*4
mov dx,offset Palette
int 21h
;; цикл проверки всех точек первого и второго изображения
nop nop mov ax, ds mov es, ax
mov cx,[dy1] ;; 200
BMPLoop2:
push cx ; di = cx*320, point to the correct screen line
; Read one line from 1 file
mov bx, [filehandle1]
mov ah,3fh
mov dx,[dx1] ;; 320
mov cx,[dop0]
cmp cx,0
je z1
z0:
inc dx loop z0
z1:
add cx,dx mov dx,offset ScrLine int 21h
; Read one line from 2 file
mov bx, [filehandle2]
mov ah,3fh
mov dx,[dx1] ;; 320
mov cx,[dop0]
cmp cx,0
je z21
z20:
inc dx loop z20
z21:
add cx,dx mov dx,offset ScrLine2
int 21h
mov cx,[dx1] ;; 320
mov di,offset ScrLine mov si,offset ScrLine2
stroka1:
mov al,byte ptr es:di mov bl,byte ptr ds:si CMP AL,0ffh ; если точка 1-го изображения белая
je dd1
mov byte ptr es:di,al
jmp dd2
dd1:
mov byte ptr es:di,bl
dd2:
inc di inc si loop stroka1
;; ** -- **
push cx mov cx,[dop0]
cmp cx,0
je z41
z40:
mov byte ptr es:di,0
inc di inc si loop z40
z41:
pop cx ; ** -- **
; Copy one line into рисунок result.bmp
; Write one line to 3 file
mov bx, [filehandle3]
mov ah,40h ;; писать в файл через описатель
mov dx,[dx1] ;; 320
mov cx,[dop0]
cmp cx,0
je z31
z30:
inc dx loop z30
z31:
add cx,dx mov dx,offset ScrLine int 21h
pop cx dec cx cmp cx,0
jz @obhodjmp BMPLoop2
@obhod:
;; loop BMPLoop2
;; close file xor ax,ax mov bx, [filehandle1]
mov [filehandle], bx call CloseFile mov bx, [filehandle2]
mov [filehandle], bx call CloseFile mov bx, [filehandle3]
mov [filehandle], bx call CloseFile;; Вывод изображения 3-го результирующего рисунка
;; 3 bmp-file mov si,offset filename
mov [si],'r'
mov [si+1],'e'
mov [si+2],'s'
mov [si+3],'u'
mov [si+4],'l'
mov [si+5],'t'
mov [si+6],'.'
mov [si+7],'b'
mov [si+8],'m'
mov [si+9],'p'
; Graphic mode
; mov ax, 13h
mov ah,0
mov al,13h
int 10h
call OpenFile call ReadHeader call ReadPalette call CopyPal call CopyBitmap call CloseFile ; Wait for key press
mov ah,1
int 21h
; Back to text mode
mov ah, 0
mov al, 2
int 10h
;================================
exit:
mov ax, 4c00h
int 21h
END start
Скриншоты с результатом работы программы
Рисунок 4. Результирующее изображение result.bmp (320 x 200).
Рисунок 5. Результирующее изображение result.bmp (22 x 22).
Рисунок 6. Результирующее изображение result.bmp (320 x 200) в окне программы bmp1.exe DOS-BOX.
Примеры работы программ
(начальное и конечное изображение).
Рисунок 7. Три изображения: ztest.bmp + xtest.bmp = изображение result.bmp (22 x 22) .
Рисунок 8. Три изображения: ztest.bmp + xtest.bmp = изображение result.bmp (320 x 200) .
Список литературы.
Электронный источник - https://ru.wikipedia.org/wiki/BMP#Таблица_цветов
Электронный источник (Описание формата BMP) - https://jenyay.net/Programming/Bmp
Скэнлон, Л. Персональные ЭВМ IBM PC и XT. Программирование на языке ассемблера / Л. Скэнлон. - М.: Радио и связь, 1998. - 336 c.
Финогенов, К. Г. Использование языка Ассемблера. Учебное пособие / К.Г. Финогенов. - М.: Горячая линия - Телеком, 2004. - 440 c.
Финогенов, К. Г. Основы языка Ассемблера / К.Г. Финогенов. - М.: Радио и связь, 2000. - 288 c.
Сделайте индивидуальный заказ на нашем сервисе. Там эксперты помогают с учебой без посредников
Разместите задание – сайт бесплатно отправит его исполнителя, и они предложат цены.
Цены ниже, чем в агентствах и у конкурентов
Вы работаете с экспертами напрямую. Поэтому стоимость работ приятно вас удивит
Бесплатные доработки и консультации
Исполнитель внесет нужные правки в работу по вашему требованию без доплат. Корректировки в максимально короткие сроки
Гарантируем возврат
Если работа вас не устроит – мы вернем 100% суммы заказа
Техподдержка 7 дней в неделю
Наши менеджеры всегда на связи и оперативно решат любую проблему
Строгий отбор экспертов
К работе допускаются только проверенные специалисты с высшим образованием. Проверяем диплом на оценки «хорошо» и «отлично»
Работы выполняют эксперты в своём деле. Они ценят свою репутацию, поэтому результат выполненной работы гарантирован
Ежедневно эксперты готовы работать над 1000 заданиями. Контролируйте процесс написания работы в режиме онлайн
Выполнить 2 контрольные работы по Информационные технологии и сети в нефтегазовой отрасли. М-07765
Контрольная, Информационные технологии
Срок сдачи к 12 дек.
Архитектура и организация конфигурации памяти вычислительной системы
Лабораторная, Архитектура средств вычислительной техники
Срок сдачи к 12 дек.
Организации профилактики травматизма в спортивных секциях в общеобразовательной школе
Курсовая, профилактики травматизма, медицина
Срок сдачи к 5 дек.
краткая характеристика сбербанка анализ тарифов РКО
Отчет по практике, дистанционное банковское обслуживание
Срок сдачи к 5 дек.
Исследование методов получения случайных чисел с заданным законом распределения
Лабораторная, Моделирование, математика
Срок сдачи к 10 дек.
Проектирование заготовок, получаемых литьем в песчано-глинистые формы
Лабораторная, основы технологии машиностроения
Срок сдачи к 14 дек.
Вам необходимо выбрать модель медиастратегии
Другое, Медиапланирование, реклама, маркетинг
Срок сдачи к 7 дек.
Ответить на задания
Решение задач, Цифровизация процессов управления, информатика, программирование
Срок сдачи к 20 дек.
Написать реферат по Информационные технологии и сети в нефтегазовой отрасли. М-07764
Реферат, Информационные технологии
Срок сдачи к 11 дек.
Написать реферат по Информационные технологии и сети в нефтегазовой отрасли. М-07764
Реферат, Геология
Срок сдачи к 11 дек.
Разработка веб-информационной системы для автоматизации складских операций компании Hoff
Диплом, Логистические системы, логистика, информатика, программирование, теория автоматического управления
Срок сдачи к 1 мар.
Нужно решить задание по информатике и математическому анализу (скрин...
Решение задач, Информатика
Срок сдачи к 5 дек.
Заполните форму и узнайте цену на индивидуальную работу!