我使用CreateDIBitmap在我的程序中创建一个位图,它一直工作到今天。我不知道为什么,但突然间它吐出的HBITMAP是NULL,我正在尝试调试它。我尝试使用HRESULT(不能)和GetLastError(没有显示错误)。
有没有办法从这个函数中获取错误代码?
编辑:根据要求,这是我的完整位图设置和函数调用:
//////////////////////////////////////////////////////////////////////////
////////// Setup Bitmap ////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//// FILEHEADER ////
BITMAPFILEHEADER* bf = new BITMAPFILEHEADER;
bf->bfType = 0x4d42;
bf->bfSize = 6054400 + 54 + sizeof(BITMAPINFO);
bf->bfOffBits = 54;
//// INFOHEADER ////
BITMAPINFOHEADER* bih = new BITMAPINFOHEADER;
bih->biSize = 40;
bih->biWidth = 2752;
if(mFlipVertical)
{
bih->biHeight = -2200;
}
else
{
bih->biHeight = 2200;
}
bih->biPlanes = 1;
bih->biBitCount = 32;
bih->biCompression = 0;
//bi->biSizeImage = 6054400; //not required
bih->biXPelsPerMeter = 2835;
bih->biYPelsPerMeter = 2835;
bih->biClrUsed = 0;
bih->biClrImportant = 0;
//// INFO ////
BITMAPINFO* pbmi = (BITMAPINFO*)alloca( sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256);
pbmi->bmiHeader.biSize = sizeof (pbmi->bmiHeader);
pbmi->bmiHeader.biWidth = 2752;
if(mFlipVertical)
{
pbmi->bmiHeader.biHeight = -2200;
}
else
{
pbmi->bmiHeader.biHeight = 2200;
}
pbmi->bmiHeader.biPlanes = 1;
if(mMonoCam)
{
pbmi->bmiHeader.biBitCount = 8;
}
else
{
pbmi->bmiHeader.biBitCount = 24;
}
pbmi->bmiHeader.biCompression = BI_RGB;
pbmi->bmiHeader.biSizeImage = 0;
pbmi->bmiHeader.biXPelsPerMeter = 14173;
pbmi->bmiHeader.biYPelsPerMeter = 14173;
pbmi->bmiHeader.biClrUsed = 0;
pbmi->bmiHeader.biClrImportant = 0;
//create grayscale color palette if using mono camera
if(mMonoCam)
{
for(int i=0; i<256; i++)
{
pbmi->bmiColors[i].rgbRed = BYTE(i);
pbmi->bmiColors[i].rgbGreen = BYTE(i);
pbmi->bmiColors[i].rgbBlue = BYTE(i);
pbmi->bmiColors[i].rgbReserved = BYTE(0);
}
}
//// GET IMAGE DATA ////
VmbUchar_t* imageData = NULL;
BridgedGetImage(pFrame, &imageData);
////// CREATE HBITMAP FROM IMAGE DATA //////
HDC hdc = ::GetDC(NULL);
HBITMAP hbit = CreateDIBitmap(hdc, bih, CBM_INIT, imageData, pbmi, DIB_RGB_COLORS);
//let other thread know image is ready
SetEvent(img_ready_handle);
//clean up//
DeleteObject(bf);
DeleteObject(bih);
DeleteObject(hdc);
答案 0 :(得分:0)
我认为您的BITMAPFILEHEADER
bfSize
太大了。 FileHeader
的大小为14个字节,infoheader的大小通常为40个字节。这将是总共54个字节加上像素数据的大小以及所需的任何填充。
我认为您不打算这样做:bf->bfSize = 6054400 + 54 + sizeof(BITMAPINFO);
也许你想这样做:bf->bfSize = 6054400 + 14 + sizeof(BITMAPINFO);