C++ 在c+中读取.bmp文件+;
我正在尝试加载一个bmp文件,以便在opengl中重用它。 我通过谷歌找到了一些关于如何加载bmp文件的代码。 我把这段代码放在我的项目中的类位图中。 该类还远未完成,但文件头的读取已经出错。读取INFOHEADER和FILEHEADER的字节后,我的结构中没有正确的值。 一些想法C++ 在c+中读取.bmp文件+;,c++,bmp,C++,Bmp,我正在尝试加载一个bmp文件,以便在opengl中重用它。 我通过谷歌找到了一些关于如何加载bmp文件的代码。 我把这段代码放在我的项目中的类位图中。 该类还远未完成,但文件头的读取已经出错。读取INFOHEADER和FILEHEADER的字节后,我的结构中没有正确的值。 一些想法 // // Bitmap.h // #ifndef LaserMaze_Bitmap_h #define LaserMaze_Bitmap_h typedef struct
//
// Bitmap.h
//
#ifndef LaserMaze_Bitmap_h
#define LaserMaze_Bitmap_h
typedef struct /**** BMP file header structure ****/
{
unsigned short bfType; /* Magic number for file */
unsigned int bfSize; /* Size of file */
unsigned short bfReserved1; /* Reserved */
unsigned short bfReserved2; /* ... */
unsigned int bfOffBits; /* Offset to bitmap data */
} BITMAPFILEHEADER;
# define BF_TYPE 0x4D42 /* "MB" */
typedef struct /**** BMP file info structure ****/
{
unsigned int biSize; /* Size of info header */
int biWidth; /* Width of image */
int biHeight; /* Height of image */
unsigned short biPlanes; /* Number of color planes */
unsigned short biBitCount; /* Number of bits per pixel */
unsigned int biCompression; /* Type of compression to use */
unsigned int biSizeImage; /* Size of image data */
int biXPelsPerMeter; /* X pixels per meter */
int biYPelsPerMeter; /* Y pixels per meter */
unsigned int biClrUsed; /* Number of colors used */
unsigned int biClrImportant; /* Number of important colors */
} BITMAPINFOHEADER;
/*
* Constants for the biCompression field...
*/
# define BI_RGB 0 /* No compression - straight BGR data */
# define BI_RLE8 1 /* 8-bit run-length compression */
# define BI_RLE4 2 /* 4-bit run-length compression */
# define BI_BITFIELDS 3 /* RGB bitmap with RGB masks */
typedef struct /**** Colormap entry structure ****/
{
unsigned char rgbBlue; /* Blue value */
unsigned char rgbGreen; /* Green value */
unsigned char rgbRed; /* Red value */
unsigned char rgbReserved; /* Reserved */
} RGBQUAD;
class Bitmap {
public:
Bitmap(const char* filename);
~Bitmap();
RGBQUAD* pixels;
BITMAPFILEHEADER fh;
BITMAPINFOHEADER ih;
private:
};
#endif
人民党
// Bitmap.cpp
//
#include <iostream>
#include <stdio.h>
#include "Bitmap.h"
Bitmap::Bitmap(const char* filename) {
FILE* file;
file = fopen(filename, "rb");
std::cout << sizeof(BITMAPFILEHEADER) << std::endl;
if(file != NULL) { // file opened
BITMAPFILEHEADER h;
size_t x = fread(&h, sizeof(BITMAPFILEHEADER), 1, file); //reading the FILEHEADER
std::cout << x;
fread(&this->ih, sizeof(BITMAPINFOHEADER), 1, file);
fclose(file);
}
}
//Bitmap.cpp
//
#包括
#包括
#包括“Bitmap.h”
位图::位图(常量字符*文件名){
文件*文件;
file=fopen(文件名为“rb”);
std::cout头需要2字节对齐
#pragma pack(2) // Add this
typedef struct
{
unsigned short bfType;
unsigned int bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned int bfOffBits;
} BITMAPFILEHEADER;
#pragma pack() // and this
BitMapInfo头::
您需要先阅读biSize
才能知道信息头有多大,不能依赖sizeof()
查看此文件,了解文件格式如何让Windows操作系统使用LoadImage
为您加载它
HBITMAP hbm = LoadImage( NULL, path, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
使用GetObject()
查找更多信息,如大小等,以及GetDIBits()
如果您想获取单个位。是的。您没有指定操作系统,因此我假设是Windows。如果不是这样,请忽略。工作正常,谢谢:)也许您可以解释为什么需要这样做?如果没有pragma,短字段将填充为4字节。BITMAPFILEHEADER的大小(不带pragma)是20,但在文件中它是以14字节的顺序写入的。因此发生了两件事:(1)读取的结构混乱(2)您读取的内容太多,因此读取BitMapInfo Header开始的时间太晚了6个字节。我是否还必须更改BitMapInfo Header的数据包?定义中还有一个短字符您不需要更改,因为这两个短字符是连续的,并且内存是对齐的