【问题标题】:How do I get an error code from the CreateDIBitmap() function?如何从 CreateDIBitmap() 函数中获取错误代码?
【发布时间】:2013-05-01 12:23:59
【问题描述】:

我使用 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); 

【问题讨论】:

  • 好吧,文档确实说如果调用失败,它会返回 NULL。你能告诉我们你是如何调用 CreateDIBitmap 的吗?
  • @CaptainObvlious 我做了,它返回 0。
  • 只是想知道,但是您尝试过使用较小的图像吗? (你的 2200*2752 对我来说似乎很大)。我记得一旦图像开始变得太大,我就遇到了这个问题..
  • @JBL 好吧,令人沮丧的是,直到今天早上我对这段代码都没有任何问题。突然之间,这个函数决定不创建 HBITMAP。我无法想象当我在整个程序测试过程中使用这种精确设置创建了数十万个位图时,尺寸会突然变得太大。这就是为什么我真的希望从这个函数中得到一个错误代码,这样我就可以让它告诉我它不喜欢什么。
  • 我明白了,更令人沮丧的是 GetLastError 什么也没显示。通常它很简单。然后,我能想到的另一个问题是您的设备上下文是否为 NULL。 (GetDC 可以返回 NULL,你应该检查一下)。

标签: c++ image error-handling bitmap null


【解决方案1】:

我认为您的BITMAPFILEHEADER bfSize 可能太大了。 FileHeader 的大小为 14 字节,infoheader 的大小通常为 40 字节。这将是总共 54 个字节加上像素数据的大小以及所需的任何填充。

我认为你不打算这样做:bf-&gt;bfSize = 6054400 + 54 + sizeof(BITMAPINFO);

也许你想这样做:bf-&gt;bfSize = 6054400 + 14 + sizeof(BITMAPINFO);

【讨论】:

    猜你喜欢
    • 2017-04-21
    • 2013-10-17
    • 2018-07-28
    • 2018-11-16
    • 2020-09-18
    • 2018-01-31
    • 2023-03-22
    • 2015-08-02
    • 1970-01-01
    相关资源
    最近更新 更多