无法使用c++读取位图文件的BITMAPFILEHEADER

Cannot read BITMAPFILEHEADER of a bitmap file using C++

本文关键字:位图 文件 BITMAPFILEHEADER 读取 c++      更新时间:2023-10-16

我正在尝试读取位图文件的FILEHEADER和INFOHEADER,但我无法这样做。我得到了Segmentation Fault

我的代码如下。

#include <bits/stdc++.h>
using namespace std;
typedef int LONG;
typedef unsigned short WORD;
typedef unsigned int DWORD;
struct BITMAPFILEHEADER {
  WORD  bfType;
  DWORD bfSize;
  WORD  bfReserved1;
  WORD  bfReserved2;
  DWORD bfOffBits;
};
struct BITMAPINFOHEADER {
  DWORD biSize;
  LONG  biWidth;
  LONG  biHeight;
  WORD  biPlanes;
  WORD  biBitCount;
  DWORD biCompression;
  DWORD biSizeImage;
  LONG  biXPelsPerMeter;
  LONG  biYPelsPerMeter;
  DWORD biClrUsed;
  DWORD biClrImportant;
};
int main(void){
    ifstream file("lena.bmp");
    char* bf = NULL;
    int begin = file.tellg();
    file.seekg(0, ios::end);
    int end = file.tellg();
    int length = end-begin;
    file.read(bf, length);
    BITMAPFILEHEADER* file_header = (BITMAPFILEHEADER*)(bf);
    //BITMAPINFOHEADER* info_header = (BITMAPINFOHEADER*)(bf+sizeof(BITMAPFILEHEADER)-1);
    cout << file_header->bfSize << endl;
    //cout << info_header->biSize << endl;
    return 0;
}

分割错误可能是因为您忘记初始化bf;

int end = file.tellg();
int length = end-begin;
bf = new char[lenght+1]; //Add this
file.seekg(0, ios::beg); //And this too
file.read(bf, length);
[编辑]

第二个问题(size总是0)是因为文件指针位于文件的末尾,所以实际上您从未读取任何内容。

正如在之前的回复中提到的,您试图用空指针file.read。我看到你正试图将整个文件加载到内存中,然后做一些指针运算来处理数据。但是为什么不直接读BITMAPFILEHEADER呢?

ifstream file("lena.bmp");
// read in the header:
BITMAPFILEHEADER header;
file.read(reinterpret_cast<char *>(&header), sizeof(header));
// validate the header, get the size in bytes of the bitmap data
size_t bitmapSizeBytes = width * height * channels; // or something like that...
// Now read the bitmap. Use a vector to simplify memory management:
std::vector<unsigned char> bitmap;
bitmap.resize(bitmapSizeBytes);
file.read(reinterpret_cast<char *>(&bitmap[0]), bitmapSizeBytes);