![]() |
Модераторы: 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.
Все на самом деле именно так просто и есть. Сделай простой проектик и вставь туда то, что я тебе дал. Должно работать! -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
||||
|
|||||
AndyY |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
cardinal
пробовал конечно. работает, но не всегда ![]() ![]() у меня в vc все работает. у человека глючит builder при врубленном выравнивании структур - вот и копаем, глюк кода или компилера. почитай внимательно тред. |
|||
|
||||
cardinal |
|
||||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 2 Всего: 99 |
А что именно?
А это что? Просвети плиз. -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
||||
|
|||||
AndyY |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
cardinal
вспомнил. bitmapinfoheader лежит за bitmafileheader - это правда. неправда то, что за bitmapinfoheader сразу лежит диб даже при отсутствии паллитры. впрочем, hunter видно и сам разобрался с проблемой, а мне вопрос чтения дибов неинтересен - будет надо - вопросов не возникнет. |
|||
|
||||
cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 2 Всего: 99 |
Я такого не говорил. Вот структура bmp: http://www.fortunecity.com/skyscraper/wind...4/bmpffrmt.html -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
Sined |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 78 Регистрация: 19.5.2004 Репутация: 1 Всего: 0 |
Ya,Ya глюк кмопилера меняй старший-младший байт(в каждом считанном слове) местами. Если самзаголовок делал под MSVC, то такое наверняка поможет.
Это сообщение отредактировал(а) Sined - 3.6.2004, 12:58 |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
код еще не пробывал ( приду домой -- проверю ) но сразу вопрос:
bfType -- WORD, из за выравнивания он приводится к DWORD соответсвенно все следующие за ним значения плывут. даже при таком присвоении: psf = *((BMPFILEHEADER*)gbuf); два байта уйдут не по адресу ![]() я прав? -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
cardinal |
|
||||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 2 Всего: 99 |
я выше уже спрашивал, что такое выравнивание, но никто нчиего не объяснил ![]() А вообще что это такое
программируешь ты или твой компилятор? Конечно след. значения плывут если ты меняшь структуру struct. Я в шоке ![]() -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
||||
|
|||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
программирую то я
![]() выравнивание -- дополнение нулями полей стрктур до определенного размера -- 1, 2, 4, 8 байт т.е. структура {char a, WORD b} в памяти выглядит так( с выравниванием по 1): a - один байт b - два байта идут последовательно а с выравниванием 2: a - два байта b - два байта как смог -- так объяснил ![]() -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 2 Всего: 99 |
Аааа, вспомнил
![]()
-------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
дык это не есть правильное решение т.к. нужно править или заголовок от MS или писать свой
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 2 Всего: 99 |
И это будет правильней? Хотелось бы что-нибудь от других услышать по этому поводу, а вообще мне кажется что ты _hunter из мухи слона делаешь. Правильное или неправильное решение - работает ведь, что еще надо? -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
AndyY |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
к слову о выравнивании. вот что пишет ms:
то есть pragma pack(4) влияет только на поля структуры более 4 байт. соответственно, все должно собираться и с заголовком от ms |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
кто ж спорит
![]() только такой код:
ровняется по DWORD' y ![]() ( почем -- не знаю ) -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 2 Всего: 99 |
Еще раз даю тебе кусок работающей проги.
У тебя это не работает или ты такой вариант не хочешь потому, что он "неправильный"? Если "неправильный" то объясни почему. -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
да я так и делаю ( просто других путей пока не вижу ), но считаю его неправильным ( скорее некрасивым
![]() Почему? Т.к. нужно писать свои структуры вместо существующих ( Не плодите сущностей сверх меры ). Это что-то типа INT да BOOL получается ![]() -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 2 Всего: 99 |
Вот этого я не понял... ![]() -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
тот код, что ты предлагаеш нужно записать куда-то ( в файл желательно
![]() так примерно ![]() Это сообщение отредактировал(а) _hunter - 5.6.2004, 17:27 -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 2 Всего: 99 |
а где она есть?
-------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
приплыли
![]() wingdi.h typedef struct tagBITMAPFILEHEADER { -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 2 Всего: 99 |
Ну я просто спросил потому, что лень искать было ![]() Вообще я взял структуру bmp или из MSDN или из инета. Когда я делал процедуру для одной встроенной системы в принтере, то никаким wingdi.h не пользовался потому, что моя процедура вообще не в windows выполнялась, а прямо в принтере. Зачем мне wingdi.h? Тебе что-то надо еще в wingdi.h кроме структуры BITMAPFILEHEADER? Если нет, то зачем она вообще нужна, тем более что с ней возникают сплошные проблемы. Я сделал просто файл bmpstruct.h и включаю его в те проекты, в которых работаю с bmp файлами. Помоему мы дошли до того, что просто надо найти ответ на вопрос "Что лучше и правильней - использовать wingdi.h или свой собственный header файл, в котором ничего ненужного нет?" ![]() -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
"приплыли" -- это к тому, что выше я уже приводил и эту структуру и то, что она стандартная
![]() свой собственный header файл -- как я уже писал "не плодите сущностей без меры" ![]() ![]() -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |