无法使用c++读取位图文件的BITMAPFILEHEADER
Cannot read BITMAPFILEHEADER of a bitmap file using C++
我正在尝试读取位图文件的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);
相关文章:
- 安卓工作室 |CPP 文件错误错误: 位图库中对"AndroidBitmap_unlockPixels"的未定义引用
- 将Qt qml文件转换为位图图像
- 如何从资源文件(.rc 文件)加载位图?
- MFC:重写附属 DLL 中 RC 文件中的位图路径
- 如何生成位图头数据,然后使用 C++ 写入文件
- JPEG编码位图(BMP)图像从文件使用libjpeg / C++
- 从位图图像文件读取像素数据值
- 分析位图文件时,如何替换WORD和DWORD数据类型
- C++:将整数的文本文件转换为BMP格式的位图图像文件
- C++ 如何创建位图文件
- 我正在尝试读取位图文件
- 如何从位图文件创建纹理
- Win32 C++:使用开放文件名并显示位图文件
- 保存位图文件
- 无法使用c++读取位图文件的BITMAPFILEHEADER
- 当位图文件的行大小不是 4 的倍数时,我们应该如何处理它?
- 加载位图文件(.bmp)
- 写入正确的位图文件结果
- 如何从位图文件创建.sub (vobsubsubtitle sub/idx)文件
- 如何在c++中分析位图文件