后台:我在我的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);
}
答案 0 :(得分:2)
如果您在API失败时调用GetLastError,则会记录下来。由于文档未提及GetLastError,因此如果在返回值中编码的信息之外发生故障,则不会提供进一步的信息。
如果函数成功,则返回值为数字 扫描线设置。
如果设置零扫描线(例如当dwHeight为0时)或函数失败,则函数返回零。
如果驱动程序不支持传递给SetDIBitsToDevice的JPEG或PNG文件图像,则该函数将失败并返回GDI_ ERROR。如果确实发生了故障,应用程序必须依靠自己的JPEG或PNG支持将图像解压缩为位图,然后将位图传递给SetDIBitsToDevice。
我担心你在这里看起来很像你自己。
答案 1 :(得分:1)
大多数GDI函数不使用GetLastError()
(有些函数,例如BitBlt()
),并且GDI没有定义除0
和GDI_ERROR
之外的其自己的错误代码。如果发生故障,通常无法确定实际错误是什么。你只需要用细齿梳来检查你的代码,找出逻辑错误。
由于旋转图像存在问题,我首先要先查看它们。它们可能没有您期望的相同尺寸,因此它们与您传递给SetDIBitsToDevice()
的参数不匹配。