Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> чтение BITMAPFILEHEADER 
:(
    Опции темы
_hunter
  Дата 31.5.2004, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 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));

и в результате бред получаю sad.gif

Заранее благодарю за ответ.



--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
AndyY
Дата 31.5.2004, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.5.2004
Где: СПб

Репутация: 2
Всего: 4



примерно так и читать.
только ifstream на мой взгляд - наиболее кривой способ.
file mapping куда красивей.

потом нужно не забыть прыгнуть на bfOffBits


--------------------
PM MAIL WWW   Вверх
_hunter
Дата 31.5.2004, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



примерно так и читаю smile.gif
но как было написанно -- получаю бред: второй Reserved не ноль и размер за два гига sad.gif

P.S.
когда описываю структуру вручную и ставлю выравнивание в байт -- все работает.

P.P.S.
а как из мапа читать?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
AndyY
Дата 31.5.2004, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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 - никогда нельзя сказать, как именно реализована функция.


--------------------
PM MAIL WWW   Вверх
_hunter
Дата 31.5.2004, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



буду пробовать через мапы

Type точно BM а потом -- бред: bfSize - 0


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
AndyY
Дата 31.5.2004, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.5.2004
Где: СПб

Репутация: 2
Всего: 4



только что обратил внимание - у тебя декларирован FileHeader, а читаешь ты Header.
может это и есть бага?


--------------------
PM MAIL WWW   Вверх
_hunter
Дата 31.5.2004, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



сделал с мапами -- результат аналогичный sad.gif
( причем полностью аналогичный -- значения полей равны что для варианта с ifstream, что для CreateFile / ReadFile, что для CreateFileMapping / MapViewOfFile )
так что собака, похоже, зарыта в другом месте smile.gif
Добавлено @ 15:48
AndyY
это я куски из разных мест вырезал -- ошибся sad.gif
на самом деле читаю FileHeader
( да и такой: BITMAPFILEHEADER *pbmif = (BITMAPFILEHEADER*)ptr; вариант не проходил sad.gif( )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
AndyY
Дата 31.5.2004, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.5.2004
Где: СПб

Репутация: 2
Всего: 4



а в файле-то что записано?
там должно быть:
WORD bfType;
это 'BM', 2 байта
DWORD bfSize;
размер, 4 байта
WORD bfReserved1;
WORD bfReserved2;
еще 4 0
DWORD bfOffBits;
и 4 байта - смещение.

посмотри в любом hex редакторе.
может это не битмап?smile.gif. помнится был флейм про то что если bfOffBits > 0x80000000 то переполнение стека в iexplore и можно свой код запустить.


--------------------
PM MAIL WWW   Вверх
_hunter
Дата 31.5.2004, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



да битмап это, битмап -- сам создал smile.gif
и структура у него -- правильная ( проверял smile.gif )
проблема именно при чтении ( похоже WORD bfType; всю малину портит )



--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
AndyY
Дата 1.6.2004, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.5.2004
Где: СПб

Репутация: 2
Всего: 4



может какая-то проблема с компилятором просто?
или WORD переопределен как DWORD?
используется MSVC?

потому что код очевиден и структура должна размещаться в памяти именно так как описана.


--------------------
PM MAIL WWW   Вверх
_hunter
Дата 1.6.2004, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



компилятор -- C++ Builder 6

вот кусок из заголовка:
Код
#include <pshpack2.h>
typedef struct tagBITMAPFILEHEADER {
       WORD    bfType;
       DWORD   bfSize;
       WORD    bfReserved1;
       WORD    bfReserved2;
       DWORD   bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
#include <poppack.h>



--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
AndyY
Дата 1.6.2004, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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);

значения - в студию!


--------------------
PM MAIL WWW   Вверх
cardinal
Дата 1.6.2004, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



что такое BYTE, BOOL, DWORD и WORD:
Код
typedef unsigned long       DWORD;
typedef int                 BOOL;
typedef unsigned char       BYTE;
typedef unsigned short      WORD;

загрузка файла в буфер:
Код

                   BYTE gbuf["размез буфера"];
CFile f;

f.Open("название файла", CFile::modeRead);
f.Read(gbuf, f.GetLength());
f.Close();

структуры BMPFILEHEADER и BMPINFOHEADER:
Код
typedef struct tagBMPFILEHEADER { // bmfh
   WORD    bfType;
   DWORD   bfSize;
   WORD    bfReserved1;
   WORD    bfReserved2;
   DWORD   bfOffBits;
} BMPFILEHEADER;

typedef struct tagBMPINFOHEADER{ // bmih
   DWORD  biSize;
   int    biWidth;
   int    biHeight;
   WORD   biPlanes;
   WORD   biBitCount;
   DWORD  biCompression;
   DWORD  biSizeImage;
   int    biXPelsPerMeter;
   int    biYPelsPerMeter;
   DWORD  biClrUsed;
   DWORD  biClrImportant;
} BMPINFOHEADER;

читаешь из gbuf в структуры:
Код
BMPFILEHEADER psf;
BMPINFOHEADER psi;

psf = *((BMPFILEHEADER*)gbuf);
psi = *((BMPINFOHEADER*)(gbuf+sizeof(psf)));


Это сообщение отредактировал(а) cardinal - 1.6.2004, 20:06


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
AndyY
Дата 1.6.2004, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.5.2004
Где: СПб

Репутация: 2
Всего: 4



cardinal
если бы все было так просто... я подозреваю глюк компилера.

si = *((BMPINFOHEADER*)(gbuf+sizeof(psf)));
это - неверно, нужно учитывать bfOffBits;


--------------------
PM MAIL WWW   Вверх
cardinal
Дата 1.6.2004, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



Цитата
si = *((BMPINFOHEADER*)(gbuf+sizeof(psf)));
это - неверно, нужно учитывать bfOffBits;

Ты мой вариант попробовал или просто так сказал, что неверно. Я тебе дал кусок работающей проги. Я компилировал в Microsoft Visual C++ 6.0.
Цитата
если бы все было так просто...

Все на самом деле именно так просто и есть.

Сделай простой проектик и вставь туда то, что я тебе дал. Должно работать!


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0815 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.