Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.07.2015, 13:05   #1
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию FASM. Вывод картинки в окно DOS

Привет всем! Помогите разобраться с таким вопросом..
Пытаюсь вывести 24-разрядный BMP-рисунок в окно программы.

Приложение под реальный DOS. Код пишу на FASM'е, но споткнулся о формат BMP-файла, в доках которого говорится, что каждый пиксель описывается тремя байтами(RGB).

Я создал в фотожопе рисунок 3х3 пикселя, каждые пиксели залил по-вертикали цветами B-G-R, и открыв получившийся BMP в HEX-редакторе увидел такую картину:
Код:
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000000   42 4D 5C 00 00 00 00 00  00 00 36 00 00 00 28 00   BM\.......6...(.
00000010   00 00 03 00 00 00 03 00  00 00 01 00 18 00 00 00   ................
00000020   00 00 26 00 00 00 12 0B  00 00 12 0B 00 00 00 00   ..&.............
00000030   00 00 00 00 00 00 FF 00  00 00 FF 00 00 00 FF 00   ......я...я...я.
00000040   00 00 FF 00 00 00 FF 00  00 00 FF 00 00 00 FF 00   ..я...я...я...я.
00000050   00 00 FF 00 00 00 FF 00  00 00 00 00               ..я...я.....
Первые 35h байт занимает заголовок, а сам рисунок начинается в адреса 36h. Размер файла лежит в слове по адресу 02h (у меня 5Сh = 92 байта). В свойствах файла так-же 92 байта. Теперь вопрос..

Если размер файла 92, а заголовок занимает 54 байта, то выходит что полезной инфы в нём 92-54=38 байт. Рисунок у меня 3х3=9 точки, каждая из которых описывается 3-мя байтами, получается 27 байт. От куда ещё 11 байт?

Вот эта картинка, начиная с адреса 36h (без заголовка), ..только полезная инфа:
Код:
FF0000   00FF00   0000FF     00 00 00 
FF0000   00FF00   0000FF     00 00 00 
FF0000   00FF00   0000FF     00 00 00 00 00
Цвета RGB определились, а болото нулей в хвостах строк - непонятно что!
Подскажите, где я туплю..
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 31.07.2015, 15:07   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Цвета RGB определились, а болото нулей в хвостах строк - непонятно что!
Цитата:
Pixel storage
The bits representing the bitmap pixels are packed in rows. The size of each row is rounded up to a multiple of 4 bytes (a 32-bit DWORD) by padding.
For images with height > 1, multiple padded rows are stored consecutively, forming a Pixel Array.
10 паддингов
p51x вне форума Ответить с цитированием
Старый 31.07.2015, 16:28   #3
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

p51x, спасибо большое!
..и точно - это оказывается выравнивание. Если длинна строки не кратна 4 (выравнивание по-параграфу), то хвост забивается нулями от 1 до 3-х.

Сделал картинку 4х4 пикселя и никах нулей в конце:
Код:
  R       G       B        R
FF0000  00FF00  0000FF  FF0000 
FF0000  00FF00  0000FF  FF0000 
FF0000  00FF00  0000FF  FF0000
FF0000  00FF00  0000FF  FF0000  0000
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 03.08.2015, 15:12   #4
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

..подскажите, что не так в коде?
Вроде что-то выводит, но ни как не нужную картинку.
Размер картинки пока фиксированный - 64х64 пикселей. Вес - 2000h байт:
Код:
use16
org 100h
jmp start

fname    db  '1.bmp',0        ; картинка
width    dw  ?                ; её ширина
heigh    dw  ?                ;    ..и высота.
buff     dw  2000h dup(0)     ; буфер для хранения картинки
wcoun    db  0                ; счётчик столбцов
hcoun    db  0                ; счётчик строк

start:
   mov   al,12h
   int   10h                  ; ставим EGA 640x480x16

;--- читаем картинку в буфер --------------------------//
   mov   ax,3d00h             ; открыть файл!
   mov   dx,fname
   int   21h
   push  ax                   ; сохраняем хэндл файла

   mov   bx,ax                ; отправляем его в BX (для чтения)
   mov   ah,3Fh               ; читать файл!
   mov   dx,buff              ; куда..,
   mov   cx,2000h             ;   и сколько
   int   21h                  ; файл в буфере!

   pop   ax                   ; закрыть файл!
   mov   bx,ax
   mov   ah,3Eh
   int   21h

;--- сохраняем инфу о картинке в переменных -----------//
   mov   ax,word[buff+12h]    ; ширина
   mov   [width],ax
   mov   ax,word[buff+16h]    ; высота
   mov   [heigh],ax

;--- выводим её на экран ------------------------------//
   xor   bx,bx                ; страница(0)
   mov   dx,70                ; начальная позиция строки
   mov   cx,10                ;    ..и столбца.
   mov   si,36h               ; пропускаем заголовок в BMP
next:
   call  bitmap               ; зовём (fn) конвертирования 
   mov   ah,0Ch               ; функция вывода точки на экран
   int   10h
   inc   cx                   ; следующая точка в строке
   inc   byte[wcoun]          ; увеличим счётчик столбцов
   cmp   [wcoun],64           ; все столбцы вывели? (ширина картинки)
   jnz   next                 ; если нет - мотаем цикл.

   dec   dx                   ; одну строку вывели! перемещаемся выше
   mov   cx,10                ; сброс позиции столбца
   mov   [wcoun],0            ;    ..и счётчика столбцов 
   inc   byte[hcoun]          ; увеличим счётчик строк
   cmp   [hcoun],64           ; все строки вывели? (высота картинки)
   jnz   next                 ; если нет - мотаем цикл.

exit:
   xor   ax,ax
   int   16h
   mov   ax,4C00h             ; на выход!
   int   21h

;--- главная процедура ------------------------------------------//
; конвертирует - 24-разрядный BMP в 4-битную палитру.
; результат сохраняется в регистре al.
bitmap:
   xor   al,al                ; здесь будет результат  
   mov   ah,byte[buff+si]     ; берём цвет(B). читаем сколько синего
   shr   ah,7                 ; сдвигаем вправо на 7 разрядов
   and   ah,0001b             ; бит(0) маски отвечает за синий цвет
   or    al,ah                ; если имеется, то выставляем в маске синий

   inc   si                   ; берём цвет(G) (в BMP цвета идут BGR)
   mov   ah,byte[buff+si]     ; тоже/самое, только со сдвигом на 1 левее
   shr   ah,6                 ; сдвигаем вправо на 6 разрядов
   and   ah,0010b             ; бит(1) маски - зелёный цвет
   or    al,ah                ; выставляем зеленый

   inc   si                   ; берём цвет(R). читаем кол-во красного
   mov   ah,byte[buff+si]     ; всё/тоже,
   shr   ah,5                 ;   ..только со-сдвигом вправо на 5
   and   ah,0100b             ; бит(2) маски - красный
   or    al,ah                ; имеется? выставляем красный
   inc   si
   or    al,1000b             ; бит(3) маски - интенсивность.
ret
Нашедшего выход - затаптывают первым..

Последний раз редактировалось R71MT; 03.08.2015 в 18:17.
R71MT вне форума Ответить с цитированием
Старый 04.08.2015, 10:01   #5
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Почему размер картинки 2000h, если при 24 битном цвете он должен быть 3000h+заголовок?
И еще, учитывается ли то, что картинка в файле хранится в перевернутом виде? то есть в начале файла располагается нижняя строка.

Где сама картинка?
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 04.08.2015, 11:19   #6
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

..да, реверс учитывал, поэтому вывожу со-строки 70 и потом строку уменьшаю. В итоге получается, что картинка выводится снизу-вверх. Сама картинка в скрепке..
Вложения
Тип файла: zip 1.zip (4.1 Кб, 24 просмотров)
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 04.08.2015, 11:39   #7
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

..спасибо! Всё получилось..
Оказывается рисунок мой 8-битный BMP был (а не 24, как расчитывалось). Перекодировал его и всё встало в норму. Остальное там - дело техники, отшлифовать код и разобраться с интенсивностью..
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DOS на FASM. Программа быстро вылетает. Stilet Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 8 01.11.2016 18:44
Эллипс в DOS (masm, tasm, fasm) Mikl___ Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 14 13.12.2014 09:06
Закрывается окно DOS zlo_999 Общие вопросы C/C++ 10 16.03.2011 01:30
Окно в C для MS-DOS Fixxxer Общие вопросы C/C++ 1 01.08.2009 16:34
Копирование картинки из DOS DJ_SAN Паскаль, Turbo Pascal, PascalABC.NET 8 17.03.2009 03:36