CreateDibBitmap为什么总是失败?

来源:互联网 发布:360浏览器 上淘宝崩溃 编辑:程序博客网 时间:2024/04/27 13:47

 函数原型:HBITMAP CreateDIBitmap(HDC hdc,CONST BITMAPINFONEADER *lpbmih,DWORD fdwlnit,CONST VOID *lpblnit,CONST BITMAPINFO *lpbmi,UINT fuUsage);

    参数:

    hdc:设备环境句柄。

    lpbmih:指向位图信息头结构的指针,它可以是下列操作系统位图信息头之一:

    Windows NT 3.51和早期:BITMAPINFOHEADER;Windows NT 4.0和Windows 95:BITMAPV4HEADER;

    Windows NT 5.0和Windows 98:BITMAPV5HEADER。

    如果fdwlnit是CBM_INIT,那么函数使用位图信息头结构来获取位图所需的宽度、高度以及其他信息。

    注意高度若是正数,那么表示是自底向上DIB,而负数表示为自顶向下DIB,这种情况与CreateDIBitmap函数兼容。

    Fdwlnit:位标识集。它指定系统如何对位图的位进行初始化。

    下面是定义的位标志常量:

    CBM_INIT:如果设置了该标志,那么系统将使用lpblnit和lpbmi两个参数指向的数据来对位图中的位进行初始化。如果没有该标志,那么表示上述两个参数指向的数据无效。如果fdwlnit为0,那么系统不会对位图的位进行初始化。

    lpblnit:该指针指向包含初始的位图数据的字节类型数组。数据格式与参数lpbmi指向的BITMAPINFO结构中的成员biBitCount有关。

    lpbmi:指向BITMAPINFO结构的旨针。该结构描述了参数lpbmi指向的数组的维数和颜色格式。

    fuUsage:表示BITMAPINFO结构的成员bmiColors是否初始化过,并且如果是,那么bmiColors是否包含明确的红、绿、蓝(RGB)值或调色板索引。参数fuUsage必须取下列值中的一个,这些值的含义为:

    DIB_PAL_COLORS:表示提供一个颜色表,并且该表由该位图要选入的设备环境的逻辑调色板的16位索引值数组组成。

    DIB_RGB_COLORS:表示提供一个颜色表,并且表中包含了原义的RGB值。

    返回值:如果函数执行成功,返回值则是创建的位图的句柄;如果函数执行失败,那么返回值为NULL,若想获取更多错误信息,请调用GetLastError函数。

    备注:用于fdwlnit参数的CBM_CREATDIB标志不再被支持。当不再需要该位图时,可调用DeleteObject函数删除它。

    ICM:参数fuUsage用来指定参数lpbmi指向的BITMAPINFO结构中的成员bmiColors是否包含颜色信息。如果bmiColors不包含颜色信息,那么不能进行位图的颜色管理。BITMAPINFO中的bmiColors成员必须包含BITMAPV4HEADER或BITMAPV5HEADER,以便能够进行颜色管理。在创建完位图之后,产生的位图的内容颜色不匹配。

    速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:不支持;头文件:wingdi.h;库文件:gdi32.lib。

 例程如下: 

BITMAPFILEHEADER stBmpFileHeader;

BITMAPINFOHEADER stBmpInfoHeader;

char pBuffer=(char*)pCPackFile->LoadPackFile(lBufSize,szFileName);

//LoadPackFile是我自己写的压缩文件类的成员函数,从压缩包内读取一个bmp文件,返回指向该bmp文件的缓冲

//你也可以从磁盘直接读取一个bmp文件,并将文件内容保存在pbuffer里,原理都是一样的

assert(pBuffer!=NULL)

 char* filebuffer=pBuffer;///保存读取bmp文件的文件指针,待以后删除

 memcpy(&stBmpFileHeader, pBuffer, sizeof(BITMAPFILEHEADER));
 pBuffer += sizeof(BITMAPFILEHEADER);//读取bmp文件头

 memcpy(&stBmpInfoHeader, pBuffer, sizeof(BITMAPINFOHEADER));
 pBuffer += sizeof(BITMAPINFOHEADER);//读取bmp信息头

char pIndexBmpInfo=filebuffer+sizeof(BITMAPFILEHEADER); //指向BITMAPINFOHEADER

char pIndexBmpData=filebuffer+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);

nWidth=stBmpInfoHeader.biWidth;
 nHeight=stBmpInfoHeader.biHeight;
 nByte=stBmpInfoHeader.biSizeImage;

 szBuffer=new UCHAR[nByte];//以上4行更新类成员

HBITMAP hBitmap=CreateDibBitmap(hdc,(BITMAPINFOHEADER*)stBmpInfoHeader,CBM_INIT, pIndexBmpData,(BITMAPINFOHEADER*)pIndexBmpInfo,DIB_RGB_COLORS);

这段代码出问题在哪里?为什么得不到位图句柄?请高手来解答,谢谢了


 

原创粉丝点击