Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
mefodiy

Проблема при бинарном чтении BMP файла

18.07.2011, 14:30. Показов 1995. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблема возникла при бинарном чтении BMP файла а точнее структуры BITMAPFILEHEADER и BITMAPINFOHEADER в начале файла.
При считывании структуры файла C: emp.bmp в переменную и просмотре значений в окне Debug некоторые значения оказываются ошибочными (?), в то время как другие находятся в норме. Например, значение bmfHeader.bfType соответствует норме (='BM'), bmfHeader.bfSize = 17154 также соответствует действительности (размер файла 17154 байта), а значение bmiHeader.biWidth = - 1853436525 !!! (ширина картинки 76 пикс.) а значение bmiHeader.biHeight = - 879786803 !!! (высота 75 пикс.) и т.д. Значения biWidth и biHeight находятся в переменных типа Long , т.е. 4 байта. Очевидно, значения представлены в некой, отличной от обычной, форме.
Visual Basic
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
Option Explicit
Dim FileName$
'задаём типы BITMAPFILEHEADER и BITMAPINFOHEADER _
    в сначале структуры файла bmp:
Private Type BITMAPFILEHEADER   '14 bytes 
    bfType As String * 2  ' - должно быть 'BM' (ASCII: 66 & 77)
    bfSize As Long
    bfReserved1 As Integer
    bfReserved2 As Integer
    bfOffBits As Long
End Type
Private Type BITMAPINFOHEADER '40 bytes
   biSize As Long
   biWidth As Long 
   biHeight As Long
   biPlanes As Integer
   biBitCount As Integer
   biCompression As Long
   biSizeImage As Long
   biXPelsPerMeter As Long
   biYPelsPerMeter As Long
   biClrUsed As Long
   biClrImportant As Long
End Type
'в эти переменные будем считывать данные:
Dim bmfHeader As BITMAPFILEHEADER
Dim bmiHeader As BITMAPINFOHEADER
 
Private Sub Form_Load()
FileName = 'C:  emp.bmp'
'            читаем содержимое файла и записываем в переменные:
Open FileName For Random As #1
  Get #1, , bmfHeader 'читаем BITMAPFILEHEADER (14 байт)
  Get #1, 15, bmiHeader 'BITMAPINFOHEADER (40 байт)
 
'просмотр содержимого переменных в окне Debug:
Debug.Print 'BMF - 14 bytes................'
Debug.Print bmfHeader.bfType
Debug.Print bmfHeader.bfSize
Debug.Print bmfHeader.bfReserved1
Debug.Print bmfHeader.bfReserved2
Debug.Print bmfHeader.bfOffBits
Debug.Print 'BMI - 40 bytes...................'
Debug.Print bmiHeader.biSize
Debug.Print bmiHeader.biWidth
Debug.Print bmiHeader.biHeight
Debug.Print bmiHeader.biPlanes
Debug.Print bmiHeader.biBitCount
Debug.Print bmiHeader.biCompression
Debug.Print bmiHeader.biSizeImage
Debug.Print bmiHeader.biXPelsPerMeter
Debug.Print bmiHeader.biYPelsPerMeter
Debug.Print bmiHeader.biClrUsed
Debug.Print bmiHeader.biClrImportant
 
Close #1
End Sub
Каким же образом можно прочитать данные и представить их в доступной для понимания форме. То есть, как с помощью кода ПОКАЗАТЬ ПОЛЬЗОВАТЕЛЮ длину файла, ширину, разрешение, и остальные данные, находящиеся в структуре BITMAPFILEHEADER и BITMAPINFOHEADER?
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.07.2011, 14:30
Ответы с готовыми решениями:

Ошибка при бинарном чтении файла
Всех приветствую! Написал код для чтения строки из файла, но выдаёт ошибку, понятия не имею почему. Проект нормально компилируется. Но при...

Ошибка при бинарном чтении массива структур из файла
Здравствуйте! Написал программу, которая бинарно записывает и считывает массив структур в файл, но никак не могу понять, почему после...

Проблема при чтении текстового файла программой
Добрая ночь, ув. форумчане! Помогите пожалуйста решить проблему возникшую при чтении текстового файла программой. Вначале все было ок....

5
3 / 3 / 0
Регистрация: 02.01.2011
Сообщений: 149
19.07.2011, 01:05
Возможна твоя картинка сохранина с каким-то сжатием, а возможно длина и ширина даны не в пиксилях, а в твипах, или т.п.
Если эта картинка сделана с помощью MS Paint - то там есть сжатие, я лично создавал пример картинки, путем рендеринга примитивной сцены в 3д максе и сохранения ее в ВМР.
0
mefodiy
19.07.2011, 01:15
Дело в том, что, насколько я знаю, сжатие применяется в RGBQUAD-RGB-массиве, следующем за этими структурами. А тип сжатия определяется в структуре BITMAPINFOHEADER.biBitCount , которая не сжимается и является одинаковой для всех файлов bmp....
Comanche
19.07.2011, 13:08
Хорошие спецы по работе с графикой сидят на соотв. форуме сайта XtremeVbTalk.Com. Не раз меня там выручали. Правда, придётся конечно писАть свой пост по-английски.
4 / 4 / 2
Регистрация: 06.03.2011
Сообщений: 151
19.07.2011, 16:53
Всё дело в некорректном открытии файла!
'Open FileName For Random As #1' предполагает чтение записей фиксированой длины.
Поскольку явно длина не указана, то по умолчанию принимается 64.
'Get #1, 15, bmiHeader' читает начиная со смещения 14 * 64 + 1 = 897 то есть пятнадцатую запись длиной 64 байта.
Поменяй 'Random' на 'Binary' и всё встанет на свои места.
Желаю успехов!
0
4 / 4 / 2
Регистрация: 06.03.2011
Сообщений: 151
19.07.2011, 18:34
В предыдущем объяснении следует заменить 64 на 128, а 897 на 1793.
Вот теперь всё действительно на своих местах.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.07.2011, 18:34
Помогаю со студенческими работами здесь

Проблема с кодировкой при чтении текста из файла
в файле все норм отображает , но при считывание проблема с кодировкой , может кто знает как это подправить? private void...

При чтении dll библиотеки в обычном(не бинарном) виде, чтение прерывается на NULL
Задача такая: открыть dll файл(не мой) в обычном текстовом виде(каким его могут открыть обычные блокноты), найти нужную последовательность...

"Нарушение прав доступа при чтении по адресу" при чтении структур из бинарного файла
Пытаюсь разобраться со структурами в бинарных файлах. Допустим, есть массив структур. Записываю его в бинарный файл (закомментированный...

Проблема при чтении XML
Установил версию 10.3 и обрел проблему при парсинге XML, в котором несколько уровней узлов. Проблема - наличие вывода аттрибутов узла...

Проблема при чтении изображения
Здраствуйте, имею одну проблемку при чтении из BMP-изображения в вектор — начиная с конкретного индекса (i = 10 825) массив просто...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru