c ++类的私有成员

时间:2012-11-27 16:38:24

标签: arrays class visual-c++ bitmap

我有一个问题,关于在opengl中渲染位图文件(手动): 如何从unsigned char指针获取数据以便在glDrawPixels函数中使用它们? (unsigned char * bitmap_Image)

class bitmap
{
private:
    unsigned long BPP;
    unsigned long width;
    unsigned long height;
    unsigned long size;
    unsigned char *bitmap_Image; // how use this member??
    unsigned int bps;

public:
    bitmap();
    ~bitmap();

    bool Load(const char *filename);
    #pragma pack(push,1)

     typedef struct 
     {
     WORD bfType;
     DWORD bfSize;
     DWORD bfReserved;
     DWORD bfOffBits;
     }BITMAPFILEHEADER;

     //BITMAPINFOHEADER
     typedef struct 
     {
     DWORD biSize;
     LONG biWidth;
     LONG biHeight;
     WORD biPlanes;
     WORD biBitCount;
     DWORD biCompression;
     DWORD biSizeImage;
     LONG biXPelsPerMeter;
     LONG biYPelsPerMeter;
     DWORD biClrUsed;
     DWORD biClrImportant;
     }BITMAPINFOHEADER;

     #pragma pack(pop)

     BITMAPFILEHEADER FileHeader;
     BITMAPINFOHEADER InfoHeader;
};

2 个答案:

答案 0 :(得分:0)

编辑:

再次阅读问题后,你必须声明一个公共成员,它返回内部指针bitmap_Image。

...
public:
   const unsigned char* GetImageData() const { return bitmap_Image; }
   int GetWidth() const { return width; }
   int GetHeight() const { return heigth; }
   int GetBPP() const { return BPP; }
...

没有其他(标准和安全)的方式来围绕这个领域的私密性。

假设BPP是BitsPerPixel并且它是24或32,您可以调用

 bitmap* YourBmp = ... // construct and load

 const unsigned char* Ptr = YourBmp->GetImageData();
 int W = YourBmp->GetWidth();
 int H = YourBmp->GetHeight();
 int Fmt  = (YourBmp->GetBPP() == 24) ? GL_BGR : GL_BGRA; // or maybe GL_RGB or GL_RGBA
 int Type = GL_UNSIGNED_BYTE;
 glDrawPixels(W, H, Fmt, Type, Ptr);

如果您的图像使用调色板(8位或更少),则会出现问题 - 您必须将其转换为RGB(A)。如果图像的单行大小不能被4整除,则会出现另一个问题,您可能会在bitmap_Image字段中获得无效数组。

glRasterPosglWindowPos可帮助您设置要渲染图像的位置。

如果您使用没有固定功能的GL2.0 +(虽然不太可能),那么您应该创建4顶点数组并使用简单的片段着色器渲染四边形。

答案 1 :(得分:0)

您基本上需要将位图二进制blob加载到一个字节(又名。unsigned char)数组中,然后将其传递给glDrawPixels()函数:

unsigned char[] myBitmap;
...
glDrawPixels( ..., &myBitmap, ... );