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

标签 c++ bitmap

<分区>

我正在尝试读取位图文件的 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);

[编辑]

第二个问题(大小始终为 0)的发生是因为文件指针位于文件末尾,所以您实际上没有读取任何内容。

关于c++ - 无法使用 C++ 读取位图文件的 BITMAPFILEHEADER,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23644633/

相关文章:

android - 位图 toString 并再次返回

c++ - Gcc 忽略 -Wno-unused-variable

c++ - 有没有可以处理方法调用依赖的设计模式?

c++ - 如何将多个数字插入 vector 的特定元素?

c++ - 当类用作映射值时,复制构造函数不起作用

c++ - Tokyo Cabinet 和可变大小的 C++ 对象

android - 位图图像内存不足

Android - 减小图像文件大小

java - ImageURL 未填充在 Android 中 imageView 内的图像中

java - 将拍摄的图片转换为位图