C++ 无法使用C+;读取位图文件的BITMAPFILEHEADER+;
我试图读取位图文件的FILEHEADER和INFOHEADER,但无法读取。我遇到C++ 无法使用C+;读取位图文件的BITMAPFILEHEADER+;,c++,bitmap,C++,Bitmap,我试图读取位图文件的FILEHEADER和INFOHEADER,但无法读取。我遇到分段错误 下面给出了我的代码 #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
分段错误
下面给出了我的代码
#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;
}
#包括
使用名称空间std;
typedef int LONG;
typedef无符号短字;
typedef无符号整数双字;
结构BITMAPFILEHEADER{
字型;
德沃德尺寸;
保留字1;
保留字2;
德沃德;
};
结构BitMapInfo标头{
德沃德·比西泽;
长双宽;
长双峰高度;
单词双平面;
单词双比特计数;
德沃德双压缩;
德沃德·比西泽迈格;
长双峰渗透计;
长双渗透计;
德沃德·比克尔鲁斯;
德沃德·比克勒;
};
内部主(空){
ifstream文件(“lena.bmp”);
char*bf=NULL;
int begin=file.tellg();
seekg(0,ios::end);
int end=file.tellg();
int长度=结束-开始;
文件读取(bf,长度);
BITMAPFILEHEADER*文件头=(BITMAPFILEHEADER*)(bf);
//BitMapInfo头*信息头=(BitMapInfo头*)(bf+sizeof(BITMAPFILEHEADER)-1);
cout bfSize分段错误可能是因为您忘记初始化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),因为文件指针位于文件的末尾,因此您实际上从未读取任何内容。如前一个答复中所述,您尝试使用空指针读取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);
ifstream文件(“lena.bmp”);
//在标题中阅读:
位图文件头;
read(reinterpret_cast(&header),sizeof(header));
//验证标头,获取位图数据的大小(以字节为单位)
size\u t bitmapSizeBytes=width*height*channels;//或者类似的东西。。。
//现在读取位图。使用矢量简化内存管理:
矢量位图;
bitmap.resize(位图大小字节);
read(重新解释转换(&bitmap[0]),bitmapSizeBytes);
包含出现在代码中的文件看起来非常草图。这包括所有的C和C++头文件。我确信这不是问题。我不认为是这样,但是它使代码在编译器之间完全不可移植,而且当我怀疑头被记录时,在位文件夹中,头的行为是PROB。能够在将来的任何更新中自由更改。好的,我会研究它。谢谢。但这不是现在的问题。我遇到分割错误。我无法找出我的错误。非常感谢。你太好了。它已删除了我的错误。但是你能帮我解决另一个问题吗。我每次都得到大小=0。你能帮我吗告诉我我做错了什么?是的,我注意到了同样的事情…我不熟悉这个结构,让我看看。非常感谢。我已经解决了,谢谢你。我编辑了答案,看看这是否解决了问题。我很抱歉,但是这些变量来自哪里,宽度*高度*通道。如果我听起来很愚蠢,我很抱歉,但我对所有这些都是新手ese.不,相反,我道歉。我编造了这些变量,因为我不太记得Windows.bmp文件的结构。这只是一个指导您的伪代码。图像通常是这样布置的,宽度乘以高度乘以颜色通道数。但我想说的是,您应该直接读取标题使用矢量,而不是原始字符*指针。