|
2 / 2 / 1
Регистрация: 24.03.2015
Сообщений: 13
|
||||||
Некорректный вывод BMP - VESA20.06.2015, 21:22. Показов 2587. Ответов 14
Метки нет (Все метки)
Здравствуйте!
Есть проблема. Пытаюсь вывести BMP картинку(24bpp) в режиме VESA(1024x768x24). Написал процедуру, все вроде как работает(я еще не реализовал обратный вывод байтов по этому картинка перевернутая): Но! Если размеры выводимой картинки больше 80px. - то получается непонятно что: Проверял в Bochs, QEMU и VMware, результат везде одинаков. Кто знает, подскажите пожалуйста как исправить ![]()
0
|
||||||
| 20.06.2015, 21:22 | |
|
Ответы с готовыми решениями:
14
Вывод точки на экран в VESA-режимах
Некорректный вывод в массив Assembler |
|
8 / 8 / 5
Регистрация: 28.03.2014
Сообщений: 137
|
||||||
| 20.06.2015, 22:02 | ||||||
Сообщение было отмечено Taatshi как решение
Решение
Я писал свою ос (уже написал, сейчас пишу другую) и вот так я выводил bmp 24 bit.
mem - адрес загруженного изображения. Добавлено через 2 минуты надо получать параметры изображения, а не выводить с заданными параметрами Добавлено через 2 минуты И еще 24 бита на пиксель это плохо. будет медленно выводится. я тоже мучался (окна очень медленно выводились, курсор) просто изменил на 32 ok.
0
|
||||||
|
2 / 2 / 1
Регистрация: 24.03.2015
Сообщений: 13
|
|||
| 20.06.2015, 23:28 [ТС] | |||
|
Спасибо за быстрый ответ!
По поводу замечаний согласен: За код спасибо, но кажется он мне мало поможет: не могу понять, где у вас находится адрес LFB, что делает процедура get_color_bmp_rbg, для чего нужны draw_bmp.xi и draw_bmp.yi, что должна делать процедура save_pixel... В общем завал...
0
|
|||
|
8 / 8 / 5
Регистрация: 28.03.2014
Сообщений: 137
|
||||||
| 21.06.2015, 21:17 | ||||||
Сообщение было отмечено Taatshi как решение
Решение
xi - размер по x
yi - размер по y get_color_bmp_rbg - получает цвет (edi - адрес пикселя в изображении bmp) выдаёт цвет в формате gbr(вроде) в регистре edx. это для функции вывода пикселя на экран. save_pixel = draw_pixel Добавлено через 4 минуты а вот код save_pixel
но можно REDRAW_ADDRESS заменить на адрес LFB. Добавлено через 39 секунд это код из оболочки
0
|
||||||
|
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 26
|
|
| 01.01.2016, 21:29 | |
|
Я конечно не вовремя, но всё же.
Кажется, вы не учли, что в формате bmp24 есть выравнивание по 4 байтам в каждой строке изображения. Пример: Ширина картинки у вас 25 пикселей. Каждый пиксель у вас кодируется 3 байтами. 25 * 3 = 75 байт 75 не делится нацело на 4. И формат будет добавлять в конце строки несколько байт (в данном случае 3), чтобы добиться выравнивания. Эти байты учитывать и выводить не нужно. Когда у вас ширина 80 пикселей, то лишних байтов нет - 80*3 = 240. 240 делится нацело на 4. Кстати, при использовании bmp 32 бита, а не 24 такой проблемы не будет, так как каждый пиксель кодируется 4 байтами.
1
|
|
| 04.01.2016, 22:39 | |
|
0
|
|
|
8 / 8 / 5
Регистрация: 28.03.2014
Сообщений: 137
|
|
| 05.01.2016, 00:52 | |
|
Прошлая была почти полностью на асме, а эта на СИ. Но архитектура похожая.
0
|
|
|
2 / 2 / 1
Регистрация: 24.03.2015
Сообщений: 13
|
|
| 06.01.2016, 17:28 [ТС] | |
|
Спасибо за ответ Nola, но кажется это не то.
Только что проверил при размерах BMP 79х79 - все нормально отображается!
0
|
|
|
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 26
|
|
| 07.01.2016, 00:58 | |
|
А при ширине 78 или 77?
При 79 у нас получается 3 байта выравнивания, то есть один целый лишний пиксель. И скорее всего вы его просто не выводите, т.к. размер картинки меньше, либо с самого края у вас должна быть полосочка. А вот при 78 будет два байта выравнивания, а значит программа считает их и 1 байт со следующего пикселя и начнётся сдвиг картинки и полоски цвета. С 77 похожая ситуация.
2
|
|
|
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
|
|
| 07.01.2016, 01:50 | |
|
Pycik, Nola прав: в bmp количество пикселей строке всегда кратно 4м ("лишние" просто не должны отображаться). Ну и сама картинка в файле зеркально отражена снизу вверх. Т. е. в видеопамять выводи задом наперед (последняя строка из фала должна быть самой верхней в видеопамяти).
1
|
|
|
2 / 2 / 1
Регистрация: 24.03.2015
Сообщений: 13
|
||
| 10.01.2016, 22:18 [ТС] | ||
|
Огромное спасибо Nola, shmkv!
Создал BMP размером 3x3x24bit: https://www.cyberforum.ru/atta... 1452453465 и открыл в hex-редакторе: https://www.cyberforum.ru/atta... 1452453465 сразу все понятно ![]() Разноцветные прямоугольники это составляющие RGB, а жирные чёрные - байты для выравнивания. Я это не учёл и вот почему у меня всё "плыло". Кстати Nola, вот здесь вы ошиблись: ![]() Правда теперь интересует вопрос: как будет более правильно, читать файл сначала а выводить начиная со старших адресов в видеопамяти или наоборот, читать файл с конца а выводить с начала видеопамяти?
0
|
||
|
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
|
||
| 10.01.2016, 22:44 | ||
|
Ну а так логичнее читать файл сначала и последовательно (рисовать соответственно снизу).
0
|
||
|
2 / 2 / 1
Регистрация: 24.03.2015
Сообщений: 13
|
||
| 10.01.2016, 23:09 [ТС] | ||
|
0
|
||
|
Ушел с форума
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
|
|
| 11.01.2016, 03:20 | |
|
Pycik,
вот здесь посмотри FAQ для раздела Assembler, MASM, TASM
1
|
|
|
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
|
||
| 11.01.2016, 03:44 | ||
|
Добавлено через 6 минут bytes_per_pixel = vesa_mode_bits_per_pixel / 8; bytes_per_line = pith * bytes_per_pixel; pith после установки видеорежима равен screen_width (если специально не менять).
0
|
||
| 11.01.2016, 03:44 | |
|
Помогаю со студенческими работами здесь
15
Некорректный вывод числа на экран Некорректный вывод строки из резидента
Некорректный вывод отрицательного результата вычисления (C+Assembler) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|