| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > чтение BITMAPFILEHEADER |
| Автор: _hunter 31.5.2004, 11:41 |
| как его правильно читать? я делаю так: BITMAPFILEHEADER FileHeader; std::ifstream DataFile; DataFile.open("data.bmp", std::ios::in | std::ios::binary); DataFile.seekg(0); DataFile.read((char*)(&Header), sizeof(Header)); и в результате бред получаю Заранее благодарю за ответ. |
| Автор: AndyY 31.5.2004, 12:36 |
| примерно так и читать. только ifstream на мой взгляд - наиболее кривой способ. file mapping куда красивей. потом нужно не забыть прыгнуть на bfOffBits |
| Автор: _hunter 31.5.2004, 14:10 |
| примерно так и читаю но как было написанно -- получаю бред: второй Reserved не ноль и размер за два гига P.S. когда описываю структуру вручную и ставлю выравнивание в байт -- все работает. P.P.S. а как из мапа читать? |
| Автор: AndyY 31.5.2004, 14:43 |
| HANDLE hfile = ::CreateFile( ... ) HANDLE hmap = ::CreateFileMapping( hfile, ... ) void *ptr = ::MapViewOfFile( hmap, ... ) BITMAPFILEHEADER *pbmif = (BITMAPFILEHEADER*)ptr; дальше работаем как с памятью. выравнивание не должно сказываться - оно влияет на хвост структуры. bfType точно BM? если нет - я прошел бы отладчиком по stl и нашел бы как реально читается файл. за что не люблю stl - никогда нельзя сказать, как именно реализована функция. |
| Автор: _hunter 31.5.2004, 15:27 |
| буду пробовать через мапы Type точно BM а потом -- бред: bfSize - 0 |
| Автор: AndyY 31.5.2004, 15:43 |
| только что обратил внимание - у тебя декларирован FileHeader, а читаешь ты Header. может это и есть бага? |
| Автор: _hunter 31.5.2004, 15:45 |
| сделал с мапами -- результат аналогичный ( причем полностью аналогичный -- значения полей равны что для варианта с ifstream, что для CreateFile / ReadFile, что для CreateFileMapping / MapViewOfFile ) так что собака, похоже, зарыта в другом месте Добавлено @ 15:48 AndyY это я куски из разных мест вырезал -- ошибся на самом деле читаю FileHeader ( да и такой: BITMAPFILEHEADER *pbmif = (BITMAPFILEHEADER*)ptr; вариант не проходил |
| Автор: AndyY 31.5.2004, 15:57 |
| а в файле-то что записано? там должно быть: WORD bfType; это 'BM', 2 байта DWORD bfSize; размер, 4 байта WORD bfReserved1; WORD bfReserved2; еще 4 0 DWORD bfOffBits; и 4 байта - смещение. посмотри в любом hex редакторе. может это не битмап? |
| Автор: _hunter 31.5.2004, 16:14 |
| да битмап это, битмап -- сам создал и структура у него -- правильная ( проверял проблема именно при чтении ( похоже WORD bfType; всю малину портит ) |
| Автор: AndyY 1.6.2004, 10:33 |
| может какая-то проблема с компилятором просто? или WORD переопределен как DWORD? используется MSVC? потому что код очевиден и структура должна размещаться в памяти именно так как описана. |
| Автор: _hunter 1.6.2004, 16:22 | ||
| компилятор -- C++ Builder 6 вот кусок из заголовка:
|
| Автор: AndyY 1.6.2004, 19:51 |
| тест на вшивость компилятора: 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 1.6.2004, 20:04 | ||||||||
что такое BYTE, BOOL, DWORD и WORD:
загрузка файла в буфер:
структуры BMPFILEHEADER и BMPINFOHEADER:
читаешь из gbuf в структуры:
|
| Автор: AndyY 1.6.2004, 20:48 |
| cardinal если бы все было так просто... я подозреваю глюк компилера. si = *((BMPINFOHEADER*)(gbuf+sizeof(psf))); это - неверно, нужно учитывать bfOffBits; |
| Автор: cardinal 1.6.2004, 22:20 | ||||
Ты мой вариант попробовал или просто так сказал, что неверно. Я тебе дал кусок работающей проги. Я компилировал в Microsoft Visual C++ 6.0.
Все на самом деле именно так просто и есть. Сделай простой проектик и вставь туда то, что я тебе дал. Должно работать! |
| Автор: AndyY 2.6.2004, 00:10 |
| cardinal пробовал конечно. работает, но не всегда у меня в vc все работает. у человека глючит builder при врубленном выравнивании структур - вот и копаем, глюк кода или компилера. почитай внимательно тред. |
| Автор: cardinal 2.6.2004, 13:38 | ||||
А что именно?
А это что? Просвети плиз. |
| Автор: AndyY 2.6.2004, 14:57 |
| cardinal вспомнил. bitmapinfoheader лежит за bitmafileheader - это правда. неправда то, что за bitmapinfoheader сразу лежит диб даже при отсутствии паллитры. впрочем, hunter видно и сам разобрался с проблемой, а мне вопрос чтения дибов неинтересен - будет надо - вопросов не возникнет. |
| Автор: cardinal 2.6.2004, 15:22 | ||
Я такого не говорил. Вот структура bmp: http://www.fortunecity.com/skyscraper/windows/364/bmpffrmt.html |
| Автор: Sined 3.6.2004, 12:57 |
| Ya,Ya глюк кмопилера меняй старший-младший байт(в каждом считанном слове) местами. Если самзаголовок делал под MSVC, то такое наверняка поможет. |
| Автор: _hunter 3.6.2004, 16:02 |
| код еще не пробывал ( приду домой -- проверю ) но сразу вопрос: bfType -- WORD, из за выравнивания он приводится к DWORD соответсвенно все следующие за ним значения плывут. даже при таком присвоении: psf = *((BMPFILEHEADER*)gbuf); два байта уйдут не по адресу я прав? |
| Автор: cardinal 3.6.2004, 16:43 | ||||
я выше уже спрашивал, что такое выравнивание, но никто нчиего не объяснил А вообще что это такое
программируешь ты или твой компилятор? Конечно след. значения плывут если ты меняшь структуру struct. Я в шоке |
| Автор: _hunter 3.6.2004, 16:58 |
| программирую то я выравнивание -- дополнение нулями полей стрктур до определенного размера -- 1, 2, 4, 8 байт т.е. структура {char a, WORD b} в памяти выглядит так( с выравниванием по 1): a - один байт b - два байта идут последовательно а с выравниванием 2: a - два байта b - два байта как смог -- так объяснил |
| Автор: cardinal 3.6.2004, 19:10 | ||
Аааа, вспомнил
|
| Автор: _hunter 4.6.2004, 17:30 |
| дык это не есть правильное решение т.к. нужно править или заголовок от MS или писать свой |
| Автор: cardinal 4.6.2004, 17:41 | ||
И это будет правильней? Хотелось бы что-нибудь от других услышать по этому поводу, а вообще мне кажется что ты _hunter из мухи слона делаешь. Правильное или неправильное решение - работает ведь, что еще надо? |
| Автор: AndyY 4.6.2004, 19:44 | ||
к слову о выравнивании. вот что пишет ms:
то есть pragma pack(4) влияет только на поля структуры более 4 байт. соответственно, все должно собираться и с заголовком от ms |
| Автор: _hunter 4.6.2004, 19:55 | ||
| кто ж спорит только такой код:
ровняется по DWORD' y ( почем -- не знаю ) |
| Автор: cardinal 5.6.2004, 02:04 | ||
Еще раз даю тебе кусок работающей проги.
У тебя это не работает или ты такой вариант не хочешь потому, что он "неправильный"? Если "неправильный" то объясни почему. |
| Автор: _hunter 5.6.2004, 14:05 |
| да я так и делаю ( просто других путей пока не вижу ), но считаю его неправильным ( скорее некрасивым Почему? Т.к. нужно писать свои структуры вместо существующих ( Не плодите сущностей сверх меры ). Это что-то типа INT да BOOL получается |
| Автор: cardinal 5.6.2004, 17:19 | ||
Вот этого я не понял... |
| Автор: _hunter 5.6.2004, 17:27 |
| тот код, что ты предлагаеш нужно записать куда-то ( в файл желательно так примерно |
| Автор: cardinal 5.6.2004, 17:33 |
| а где она есть? |
| Автор: _hunter 5.6.2004, 17:48 |
| приплыли wingdi.h typedef struct tagBITMAPFILEHEADER { |
| Автор: cardinal 5.6.2004, 18:42 | ||
Ну я просто спросил потому, что лень искать было Вообще я взял структуру bmp или из MSDN или из инета. Когда я делал процедуру для одной встроенной системы в принтере, то никаким wingdi.h не пользовался потому, что моя процедура вообще не в windows выполнялась, а прямо в принтере. Зачем мне wingdi.h? Тебе что-то надо еще в wingdi.h кроме структуры BITMAPFILEHEADER? Если нет, то зачем она вообще нужна, тем более что с ней возникают сплошные проблемы. Я сделал просто файл bmpstruct.h и включаю его в те проекты, в которых работаю с bmp файлами. Помоему мы дошли до того, что просто надо найти ответ на вопрос "Что лучше и правильней - использовать wingdi.h или свой собственный header файл, в котором ничего ненужного нет?" |
| Автор: _hunter 5.6.2004, 22:36 |
| "приплыли" -- это к тому, что выше я уже приводил и эту структуру и то, что она стандартная свой собственный header файл -- как я уже писал "не плодите сущностей без меры" |