0 / 0 / 0
Регистрация: 25.10.2011
Сообщений: 21
1

Зеркальный вывод bmp файла 24 бита на точку.

21.04.2012, 18:32. Показов 3833. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Не могли бы кинуть какие-то примеры работы с bmp файлом 24 бита на точку, с монохромными вроде более менее понятно но как я понимаю переделать в 24 бита сложновато будет.большое всем спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.04.2012, 18:32
Ответы с готовыми решениями:

Чтение RGB значений из bmp 24 бита
Всем доброго времени суток. Вот такая проблема у меня: Есть 24-битный bmp рисунок(т.е. на каждый...

Вывод 24 битного BMP из файла
Подскажите, пожалуйста, как прочитать 24 битный BMP файл и осуществить его вывод в 13h графическом...

Ввод/Вывод BMP-файла в консольном приложении C++
Здравствуйте уважаемые. Нужно реализовать ввод/вывод BMP в двумерную матрицу структур RGB. через...

зеркальный вывод
SELECT comment FROM mytable WHERE id=1 выводит 'qwerty' как правильно составить запрос ,что бы...

13
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,784
21.04.2012, 18:39 2
Булька98, в дистрибутиве masm32 есть примеры
1
0 / 0 / 0
Регистрация: 25.10.2011
Сообщений: 21
21.04.2012, 18:56  [ТС] 3
IOAN, а где этот дистрибутив? мне вообще на ТАСМе надо но переделать можно
0
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,784
22.04.2012, 01:52 4
Булька98, здесь!
0
0 / 0 / 0
Регистрация: 25.10.2011
Сообщений: 21
22.04.2012, 18:41  [ТС] 5
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
.8086      ; разрешить привилегированные инструкции i286
.model     small                    ; выбор модели памяти 
.stack                              ;сегмент стека 
.data                               ;сегмент данных
name_file db '1.bmp',0                  ;задаём имя файла 0 необходим для функции 3dh
;тут всякие переменные для хранения размеров и прочие вспомогательные
x       dw       ?
x2      dw       ?              ;x/2
y   dw       ?
y2  dw       ?              ;y/2
cur_x   dw           320            ;текущие координаты. Пока что центр экрана
cur_y   dw       240 
handle  dw       ?              ;для файлового номера
_size   dw       ?              ;для размера файла
buffer  db 28 dup (?)               ;первый буффер. всё связанное с данными о файле
buffer1 db 0ffffh-1100 dup (0) 
 
 
 
.code                ;сегмент кода
 
; процедура вычисления размера файла, размера по вертикали и по горизонтали
read_size proc
    mov ax,3d00h                    ;3dh- функция для открытия файла 
    lea dx,name_file                ; в dx  начало name_file
    int 21h
    mov bx,ax                       ; в bx 16-битный номер файла
    lea dx,buffer                   ; dx  на начало буфер
    mov ah,3Fh                  ;читаем
    mov cx,26                   ;прочитаем 26 байт. Пока нам больше и не надо
    int 21h
    mov ax,word ptr [buffer+2]
    mov _size,ax            ;размер
    mov ax,word ptr [buffer+18]
    mov x,ax                    ; по горизонтали
    mov ax,word ptr [buffer+22]
    mov y,ax                    ;по вертикали
ret
read_size endp
 
; процедура открытия файла
;думаю тут комментировать нечего
open_file proc
    mov ax,3d00h ;загрузили функцию
    lea dx,name_file
    int 21h
    or handle,ax
        ret
open_file endp
 
; процедура чтения файла в буфер
read_x proc                     
    mov bx,handle                           ; в handle 16 битный номер файла
    lea dx,buffer1                          ; dx
    mov ah,3Fh
    mov cx, _size        
    int 21h
        ret
read_x endp
 
 
 
 
;собственно главная процедура - конвертирует 24-разрядный формат в палитру. Результат сохраняется в регистре al. Ниче сложного тут нет. В 24-разрядном изображении для каждого цвета (RGB) используется байт, в 16 цветном бит. Алгоритм основан на сдвигах.
 
convert proc near
    xor al,al
    mov ah,byte ptr [buffer1+si]             ;B
    ; читаем сколько у нас синего
    shr ah,7; сдвигаем вправо на 7 разрядов
    and ah,00000001b             ;первый бит цвета отвечает за синий остальные нам не нужны
    or al,ah                    ;выставляем синий
    inc si                      ;прибавляем счетчик (в BMP рисунке цвета располагаяся в порядке BGR                   ;поэтому сначала читаем синий потом зеленый и наконец красный)                  ;все тоже самое для зеленого, только со сдвигом на 1 разряд левее
    mov ah,byte ptr [buffer1+si]             ;G
    shr ah,6
    and ah,00000010b             ;второй бит - зеленый
    or al,ah             ;выставляем зеленый
    inc si                      ; и наконец красный. Все тоже самое что и выше только на разряд левее
    mov ah,byte ptr [buffer1+si]             ;R
    shr ah,5
    and ah,00000100b         ;третий бит - красный
    or al,ah             ;выставляем красный
    inc si
    or al,00001000b         ;четвертый бит яркости.              ;Вообще он будет выставляться процедурой bit_i но пока на вский случай включим его. Да будет свет!
    ret
convert endp
 
     
 
 
; все. Процедуры кончились начинается сам код.
.startup
 
mov ax,18
int 10h         ; устанавливаем EGA 640x480x16
 
;вычисляем размеры
call read_size
call open_file
call read_x
 
;вычисляем половины размеров по вертикали и горизонтали. Изображение выводится начиная с левого нижнего угла(именно так оно записано в BMP)
 
mov ax,x
shr ax,1
mov x2,ax           ;x2=x/2
 
mov ax,y
shr ax,1
mov y2,ax           ;y2=y/2
 
mov si,54           ;устанавливаем указатель на 54-й байт(само изображение начинается с 54-го байта.
            ; До этого всякая служебная информация)
            ; текущие координаты установлены на центр. установим их на левый нижний угол изображения
mov cx,cur_x
sub cx,x2
mov dx,cur_y
add dx,y2
 
;==============         =================
;цикл вывода изображения на экран
@l:
call convert            ;вначале конвертируем в палитру 
;call cnv
mov ah,0ch          ;функция вывода на экран точки.
            ; Очень медленная, но можно вместо нее использовать процедуру pixel которая приведена ниже.          ;Записывает прямо в видеобуфер. Получается намного быстрее
int 10h
            ;call pixel
inc cx
push bx
mov bx,320
add bx,x2
cmp cx,bx         ;дошли до конца линии?
pop bx
jb @l           ;если нет переходим к следующей точке
;===============         ==================
;все строчка кончилась двигаемся на точку вверх и все по новой
dec dx
sub cx,x
push bx
mov bx,240
sub bx,y2
cmp dx,bx           ;240-y2 смотрим не дошли еще до верха?
pop bx
ja @l            ; если не дошли продолжаем цикл
 
mov ah,0
int 16h              ;ждем пока кто нибудь нажмет на клавишу
mov ax,3            ;возвращаем текстовый режим
int 10h
mov ax,4c00h            ;ФСЕ. Валим отсюдова.
int 21h
end
Добавлено через 1 минуту
Здесь выводится просто bmp файл на экран , весь файл хранится в buffer1 я думал о том что можно его инвертированный запихнуть в buffer2, и уже потом сохранять, но там не хватает указателей( подскажите пожалуйста как можно зеркально отобразить
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
23.04.2012, 11:40 6
Булька98, откуда этот код??? Он мне до боли знаком, я его писал в 2003 году и сдавал как лабу по асму) Это одна из моих первых программ))) Даже комментарии точно до знака совпадают
0
Mikl___
23.04.2012, 13:38
  #7

Не по теме:

vital792, зато теперь есть повод почувствовать себя Абелем или Iszelion'ом :)

0
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
23.04.2012, 13:44 8
Я нарисовал картинку 24 цвета размером 641*480, запустил с программой под ДОСом, но вывелись только белые полоски на сером фоне. Почему?
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
23.04.2012, 14:00 9
programmisto, этот код не учитывает очень много ньюансов, это же была лаба за первый курс так что придираться там можно до бесконечности)


Не по теме:

Цитата Сообщение от Mikl___ Посмотреть сообщение
зато теперь есть повод почувствовать себя Абелем или Iszelion'ом
ага:D

0
Ушел с форума
Автор FAQ
16338 / 7658 / 1075
Регистрация: 11.11.2010
Сообщений: 13,692
23.04.2012, 14:08 10
programmisto, потому что нужно
1) научится читать заголовок BMP-файла,
2) для того чтобы выводить что-то больше чем моно-/16-/256-цветное под DOS'ом нужно разобраться с работой в VESA-режимах
0
0 / 0 / 0
Регистрация: 25.10.2011
Сообщений: 21
23.04.2012, 17:53  [ТС] 11
Цитата Сообщение от vital792 Посмотреть сообщение
Булька98, откуда этот код??? Он мне до боли знаком, я его писал в 2003 году и сдавал как лабу по асму) Это одна из моих первых программ))) Даже комментарии точно до знака совпадают
http://paukpv.pp.ru/ вот с вот этого сайта взял если ваш то извиняйте.
я попытался и вот этого буффера всё инвертировать в другой такой же но собственна ерунда получаеться. не могли бы подсказать пример как можно сделать? отрывок кода или просто в нужную сторону направить, в асме вообщем то не совсем чайник основные команды знаю.
0
4 / 4 / 0
Регистрация: 23.04.2012
Сообщений: 18
23.04.2012, 20:10 12
Пример
from websvn.kolibrios.org
0
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,784
24.04.2012, 07:59 13
Булька98, Дабы далеко неходить.
0
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
24.04.2012, 11:13 14
Под виндой тоже рисуются серые полоски вместо картинки. Нарисовал в Paint 640*480 24 битную картинку. И подключил её. Как исправить?
0
24.04.2012, 11:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2012, 11:13
Помогаю со студенческими работами здесь

зеркальный вывод слов
Преобразовать строку таким образом, чтобы все слова в ней были напечатаны наоборот (зеркально).

Вывод изображения на экран консоли после считывания из bmp файла
(Дополнение к вопросу ) Задача состоит в следующем: есть двумерный штрих-код (PDF417) ,...

Вывод бита PIC контроллер
Помогите с этим заданием: создайте программу, которая будет выводить бит на один из выводов...

Как перехватить координаты бита на картинке в момент обнаружения этого бита
есть картинка .Блокируем её в памяти.Пробегаемся по битам.Как перехватить координаты бита на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru