auxDIBImageLoad详解

bool AUX_RGBImageRec::loadFile(const char* Filename)
{
        BITMAPINFO BMInfo;                                                              // need the current OpenGL device contexts in order to make use of windows DIB utilities  
        const HDC gldc = wglGetCurrentDC();                     // a handle for the current OpenGL Device Contexts
                                                                                                        // assume there are errors until file is loaded successfully into memory  
        NoErrors = false;                                                               // release old data since this object could be used to load multiple Textures  
        if(data != NULL) delete data;                                   // windows needs this info to determine what header info we are looking for  
        BMInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);  // Get windows to determine color bit depth in the file for us  
        BMInfo.bmiHeader.biBitCount = 0;                                // Get windows to open and load the BMP file and handle the messy decompression if the file is compressed  
                                                                                                        // assume perfect world and no errors in reading file, Ha Ha  
        HANDLE DIBHandle = LoadImage(0,Filename, IMAGE_BITMAP, 0, 0,LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_LOADFROMFILE);  // use windows to get header info of bitmap - assume no errors in header format

        GetDIBits(gldc, (HBITMAP)DIBHandle, 0,0, NULL, &BMInfo, DIB_RGB_COLORS);
        sizeX = BMInfo.bmiHeader.biWidth;
        sizeY = BMInfo.bmiHeader.biHeight;                              // change color depth to 24 bits (3 bytes (BGR) / pixel)  
        BMInfo.bmiHeader.biBitCount = 24;                               // don't want the data compressed  
        BMInfo.bmiHeader.biCompression = BI_RGB;  
        const DWORD BitmapLength = sizeX * sizeY * 3;   // 3 bytes (BGR) per pixel (24bp)  
                                                                                                        // allocate enough memory to hold the pixel data in client memory  
        data = new byte[BitmapLength];                                  // Get windows to do the dirty work of converting the BMP into the format needed by OpenGL  
                                                                                                        // if file is already 24 bit color then this is a waste of time but makes for short code  
                                                                                                        // Get the actual Texel data from the BMP object  
       
        if (GetDIBits(gldc, (HBITMAP)DIBHandle, 0, sizeY, data, &BMInfo, DIB_RGB_COLORS))
        {
                NoErrors = true;
                convertBGRtoRGB();                                                      // NOTE: BMP is in BGR format but OpenGL needs RGB unless you use GL_BGR_EXT
        }

        DeleteObject(DIBHandle);                                                // don't need the BMP Object anymore  
        return NoErrors;
}
auxDIBImageLoad(const char *FileName)函数调用了windows的系统函数LoadImage来看
    HANDLE WINAPI LoadImage(
      _In_opt_  HINSTANCE hinst,
      _In_      LPCTSTR lpszName,
          _In_      UINT uType,
      _In_      int cxDesired,
      _In_      int cyDesired,
      _In_      UINT fuLoad
    );
     这里主要看lpszName,这个文件指针如下解释,是可以读取一个模块中的图片信息,这也是在windows中可以读取解析3ds文件格式,或其他3D文件格式的关键了
      lpszName [in]
    Type: LPCTSTR
    The image to be loaded. If the hinst parameter is non-NULL and the fuLoad parameter omits LR_LOADFROMFILE, lpszName specifies the image resource in the hinst module. If the image resource is to be loaded by name from the module, the lpszName parameter is a pointer to a null-terminated string that contains the name of the image resource. If the image resource is to be loaded by ordinal from the module, use the MAKEINTRESOURCE macro to convert the image ordinal into a form that can be passed to the LoadImage function. For more information, see the Remarks section below.

    If the hinst parameter is NULL and the fuLoad parameter omits the LR_LOADFROMFILE value, the lpszName specifies the OEM image to load. The OEM image identifiers are defined in Winuser.h and have the following prefixes.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值