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

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

18.07.2011, 14:30. Показов 1974. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru