-1

私はopenglで(手動で)レンダービットマップファイルについて問題を抱えています:glDrawPixels関数でそれらを使用するためにunsigned charポインターからデータを取得する方法は?(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;
};
4

2 に答える 2

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) に変換する必要があります。画像の 1 行のサイズが 4 で割り切れない場合、別の問題がありますbitmap_Image。フィールドに無効な配列が含まれる可能性があります。

glRasterPosまたはglWindowPos、画像をレンダリングする位置を設定するのに役立ちます。

固定関数なしで GL2.0+ を使用している場合 (可能性は低いですが)、4 頂点配列を作成し、単純なフラグメント シェーダーでクワッドをレンダリングする必要があります。

于 2012-11-27T16:46:06.473 に答える
0

基本的に、ビットマップ バイナリ blob をバイト (別名unsigned char) 配列にロードしてから、それをglDrawPixels()関数に渡す必要があります。

unsigned char[] myBitmap;
...
glDrawPixels( ..., &myBitmap, ... );
于 2012-11-27T16:46:13.580 に答える