当SetDIBitsToDevice返回错误代码(0)时,如何找到错误原因

时间:2011-12-21 17:48:26

标签: c++ windows

后台:我在我的MFC应用程序和SetDIBitsToDevice中使用OpenCV2库来显示每个图像。我的问题是,下面的代码适用于90%的图像文件,但由于我不知道的原因,它不适用于某些旋转的图像。 Whole description of the issue is here

所以我需要找出函数返回0错误代码的原因,以及我从函数中得到的错误。

根据MSDN

  

如果设置了零扫描线(例如当dwHeight为0时)或者   函数失败,函数返回零。

因此,如果函数返回零,我如何找到错误的详细信息?

更新:我尝试使用GetLastError(),如下所示。但实际上,消息是“操作成功完成”,当然不是这样。我很感激任何提示或建议来解决这个问题。

BITMAPINFO* bmi = (BITMAPINFO* )buffer; 
FillBitmapInfo(bmi,width,height,Bpp(pDoc->m_cvImage),0);
int result = SetDIBitsToDevice(pDC->GetSafeHdc(), 100, 100, width,
    height, 0, 0, 0, height, pDoc->m_cvImage.data, bmi,
    DIB_RGB_COLORS);
if(result==0) {
    DWORD error = GetLastError();
    LPVOID lpMsgBuf;
    FormatMessage( 
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM | 
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        error,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
        (LPTSTR) &lpMsgBuf,
        0,
        NULL 
    );
    CString text;
    // Process any inserts in lpMsgBuf.
    text= (LPCTSTR)lpMsgBuf;
    // Free the buffer.
    LocalFree( lpMsgBuf );      
    int nResult = AfxMessageBox(text, MB_OK);

}

2 个答案:

答案 0 :(得分:2)

如果您在API失败时调用GetLastError,则会记录下来。由于文档未提及GetLastError,因此如果在返回值中编码的信息之外发生故障,则不会提供进一步的信息。

  

如果函数成功,则返回值为数字   扫描线设置。

     

如果设置零扫描线(例如当dwHeight为0时)或函数失败,则函数返回零。

     

如果驱动程序不支持传递给SetDIBitsToDevice的JPEG或PNG文件图像,则该函数将失败并返回GDI_ ERROR。如果确实发生了故障,应用程序必须依靠自己的JPEG或PNG支持将图像解压缩为位图,然后将位图传递给SetDIBitsToDevice。

我担心你在这里看起来很像你自己。

答案 1 :(得分:1)

大多数GDI函数不使用GetLastError()(有些函数,例如BitBlt()),并且GDI没有定义除0GDI_ERROR之外的其自己的错误代码。如果发生故障,通常无法确定实际错误是什么。你只需要用细齿梳来检查你的代码,找出逻辑错误。

由于旋转图像存在问题,我首先要先查看它们。它们可能没有您期望的相同尺寸,因此它们与您传递给SetDIBitsToDevice()的参数不匹配。