Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Как прочитать заголовок BMP


Автор: BCworm 13.1.2010, 09:39
Привет всем.

Пожалуйста помогите. Мне необходимо взять BMP файл и прочитать информацию содержащуюся в заголовке т.е в bmpheader. В сети нашел много исходников на С но большинство с форумов  содержат много ошибок.

Автор: chaos 13.1.2010, 09:45
BCworm, http://ru.wikipedia.org/wiki/BMP

Автор: BCworm 13.1.2010, 09:56
Ну это везеде есть и на разных языках а вот как в билдере это прочитать? т.е как считать заголовок и подставить значения в переменные?

Автор: 586 13.1.2010, 11:49
Код
#include <stdio.h>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    BITMAPFILEHEADER bfh;
    BITMAPINFOHEADER bih;

    FILE *f = fopen("C:\\test.bmp", "rb");
    if(!f)
    {
        ShowMessage("Cannot open file.");
        return;
    }

    if(fread(&bfh, 1, sizeof(bfh), f) == sizeof(bfh) &&
        fread(&bih, 1, sizeof(bih), f) == sizeof(bih))
    {
        // обработка структур и чтение других данных из .bmp файла
    }
    else
    {
        ShowMessage("Error. Invalid file.");
    }
    fclose(f);
}

Автор: artsb 13.1.2010, 13:50
Прикрепляю пример.
Правда, вот такая штука:
Код

 BITMAPFILEHEADER bfh;
 // ...
 fs = new TFileStream(OpenDialog1->FileName, fmOpenRead | fmShareDenyWrite);

 if(fs->Read(&bfh, sizeof(BITMAPFILEHEADER))) {
  Memo1->Lines->Add("BitmapSize: " + IntToStr(bfh.bfSize));
  Memo1->Lines->Add("Offset: " + IntToStr(bfh.bfOffBits));
 }

не покатила... (получается полная ерунда) Сделал чтение поэлементно.

И кстати, вот это:
Код

sizeof(BITMAPFILEHEADER)

возвращает 16  smile 
По идее же 14 байт размер структуры...

Добавлено через 4 минуты и 58 секунд
586, вот это:
Код

    BITMAPFILEHEADER bfh;
    FILE *f = fopen("C:\\111.bmp", "rb");
    if(!f)
    {
        ShowMessage("Cannot open file.");
        return;
    }
    if(fread(&bfh, 1, sizeof(bfh), f) == sizeof(bfh))
    {
     Memo1->Lines->Add(bfh.bfSize);
     Memo1->Lines->Add(bfh.bfOffBits);
    }
    else
    {
        ShowMessage("Error. Invalid file.");
    }
    fclose(f);

тоже ерунду заносит в Мемо.

Автор: smoke_man 13.1.2010, 14:45
Можно просто объявить структуры без выравнивания:
Код

#pragma pack(push, 1)
typedef struct tagBitmapFileHeader 
{
    unsigned short bfType;
    unsigned int bfSize;
    unsigned short bfReserved1;
    unsigned short bfReserved2;
    unsigned int bfOffBits;
} BitmapFileHeader;
#pragma pack(pop)


Тогда  sizeof будет давать 14, а не 16.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)