C++ 在c+中读取.bmp文件+;

C++ 在c+中读取.bmp文件+;,c++,bmp,C++,Bmp,我正在尝试加载一个bmp文件,以便在opengl中重用它。 我通过谷歌找到了一些关于如何加载bmp文件的代码。 我把这段代码放在我的项目中的类位图中。 该类还远未完成,但文件头的读取已经出错。读取INFOHEADER和FILEHEADER的字节后,我的结构中没有正确的值。 一些想法 // // Bitmap.h // #ifndef LaserMaze_Bitmap_h #define LaserMaze_Bitmap_h typedef struct

我正在尝试加载一个bmp文件,以便在opengl中重用它。 我通过谷歌找到了一些关于如何加载bmp文件的代码。 我把这段代码放在我的项目中的类位图中。 该类还远未完成,但文件头的读取已经出错。读取INFOHEADER和FILEHEADER的字节后,我的结构中没有正确的值。 一些想法

//
//  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的数据包?定义中还有一个短字符您不需要更改,因为这两个短字符是连续的,并且内存是对齐的