![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
как его правильно читать?
я делаю так: BITMAPFILEHEADER FileHeader; std::ifstream DataFile; DataFile.open("data.bmp", std::ios::in | std::ios::binary); DataFile.seekg(0); DataFile.read((char*)(&Header), sizeof(Header)); и в результате бред получаю ![]() Заранее благодарю за ответ. -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
AndyY |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
примерно так и читать.
только ifstream на мой взгляд - наиболее кривой способ. file mapping куда красивей. потом нужно не забыть прыгнуть на bfOffBits |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
примерно так и читаю
![]() но как было написанно -- получаю бред: второй Reserved не ноль и размер за два гига ![]() P.S. когда описываю структуру вручную и ставлю выравнивание в байт -- все работает. P.P.S. а как из мапа читать? -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
AndyY |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
HANDLE hfile = ::CreateFile( ... )
HANDLE hmap = ::CreateFileMapping( hfile, ... ) void *ptr = ::MapViewOfFile( hmap, ... ) BITMAPFILEHEADER *pbmif = (BITMAPFILEHEADER*)ptr; дальше работаем как с памятью. выравнивание не должно сказываться - оно влияет на хвост структуры. bfType точно BM? если нет - я прошел бы отладчиком по stl и нашел бы как реально читается файл. за что не люблю stl - никогда нельзя сказать, как именно реализована функция. |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
буду пробовать через мапы
Type точно BM а потом -- бред: bfSize - 0 -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
AndyY |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
только что обратил внимание - у тебя декларирован FileHeader, а читаешь ты Header.
может это и есть бага? |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
сделал с мапами -- результат аналогичный
![]() ( причем полностью аналогичный -- значения полей равны что для варианта с ifstream, что для CreateFile / ReadFile, что для CreateFileMapping / MapViewOfFile ) так что собака, похоже, зарыта в другом месте ![]() Добавлено @ 15:48 AndyY это я куски из разных мест вырезал -- ошибся ![]() на самом деле читаю FileHeader ( да и такой: BITMAPFILEHEADER *pbmif = (BITMAPFILEHEADER*)ptr; вариант не проходил ![]() -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
AndyY |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
а в файле-то что записано?
там должно быть: WORD bfType; это 'BM', 2 байта DWORD bfSize; размер, 4 байта WORD bfReserved1; WORD bfReserved2; еще 4 0 DWORD bfOffBits; и 4 байта - смещение. посмотри в любом hex редакторе. может это не битмап? ![]() |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
да битмап это, битмап -- сам создал
![]() и структура у него -- правильная ( проверял ![]() проблема именно при чтении ( похоже WORD bfType; всю малину портит ) -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
AndyY |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
может какая-то проблема с компилятором просто?
или WORD переопределен как DWORD? используется MSVC? потому что код очевиден и структура должна размещаться в памяти именно так как описана. |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
компилятор -- C++ Builder 6
вот кусок из заголовка:
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
AndyY |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
тест на вшивость компилятора:
int offset_fize = int(&(BITMAPFILEHEADER*)0)->bfSize); int offset1 = int(&(BITMAPFILEHEADER*)0)->bfReserved1); int offset2 = int(&(BITMAPFILEHEADER*)0)->bfReserved2); int offset_off = int(&(BITMAPFILEHEADER*)0)->bfOffBits); значения - в студию! |
|||
|
||||
cardinal |
|
||||||||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 2 Всего: 99 |
что такое BYTE, BOOL, DWORD и WORD:
загрузка файла в буфер:
структуры BMPFILEHEADER и BMPINFOHEADER:
читаешь из gbuf в структуры:
Это сообщение отредактировал(а) cardinal - 1.6.2004, 20:06 -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
||||||||
|
|||||||||
AndyY |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
cardinal
если бы все было так просто... я подозреваю глюк компилера. si = *((BMPINFOHEADER*)(gbuf+sizeof(psf))); это - неверно, нужно учитывать bfOffBits; |
|||
|
||||
cardinal |
|
||||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 2 Всего: 99 |
Ты мой вариант попробовал или просто так сказал, что неверно. Я тебе дал кусок работающей проги. Я компилировал в Microsoft Visual C++ 6.0.
Все на самом деле именно так просто и есть. Сделай простой проектик и вставь туда то, что я тебе дал. Должно работать! -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |