【发布时间】:2011-12-22 03:09:49
【问题描述】:
背景:我在我的 MFC 应用程序中使用 OpenCV2 库并使用 SetDIBitsToDevice 来显示每个图像。我的问题是以下代码适用于 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);
}
【问题讨论】:
-
@HansPassant 谢谢。有趣的是,当我使用 FormatMessage 将函数中的值转换为字符串消息时,我得到“操作成功完成”,这是不正确的。
-
一个常见的错误是调用其他一些获取错误代码重置的winapi函数。立即调用它并将返回值存储在局部变量中。
-
@HansPassant 我不认为我正在这样做。根据google搜索,我认为是Bitmap函数的无描述问题。