【发布时间】:2019-12-21 16:52:24
【问题描述】:
我正在构建基于对话框的 MFC 应用程序。
当我单击按钮时,我可以从文件资源管理器中选择图像,并且该图像也被加载到cv::imread()。并且还显示在优化校准中。
我可以使用以下代码在优化校准中加载并显示图像。
void CMFCApplication3Dlg::OnBnClickedButton1()
{
cv::Mat src = cv::imread("D:/source/repos/Testing_Photos/Large/cavalls.png");
Display(src);
}
但不是下面的代码。
void CMFCApplication3Dlg::OnBnClickedButton1()
{
TCHAR szFilter[] = _T("PNG (*.png)|*.png|JPEG (*.jpg)|*.jpg|Bitmap (*.bmp)|*.bmp||");
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, AfxGetMainWnd());
if (dlg.DoModal() == IDC_BUTTON1)
{
CString cstrImgPath = dlg.GetPathName();
CT2CA pszConvertedAnsiString(cstrImgPath);
std::string strStd(pszConvertedAnsiString);
cv::Mat src = cv::imread(strStd);
Display(src);
}
}
以下是“显示”功能。
void CMFCApplication3Dlg::Display(cv::Mat& mat) {
CStatic * PictureB = (CStatic *)GetDlgItem(IDC_STATIC);
CWnd* cwn = (CWnd *)GetDlgItem(IDC_STATIC);
CDC* wcdc = cwn->GetDC();
HDC whdc = wcdc->GetSafeHdc();
RECT rec;
cwn->GetClientRect(&rec);
cv::Size matSize;
matSize = cv::Size(rec.right, rec.bottom);
BITMAPINFO bitmapinfo;
bitmapinfo.bmiHeader.biBitCount = 24;
bitmapinfo.bmiHeader.biWidth = mat.cols;
bitmapinfo.bmiHeader.biHeight = -mat.rows;
bitmapinfo.bmiHeader.biPlanes = 1;
bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmapinfo.bmiHeader.biCompression = BI_RGB;
bitmapinfo.bmiHeader.biClrImportant = 0;
bitmapinfo.bmiHeader.biClrUsed = 0;
bitmapinfo.bmiHeader.biSizeImage = 0;
bitmapinfo.bmiHeader.biXPelsPerMeter = 0;
bitmapinfo.bmiHeader.biYPelsPerMeter = 0;
StretchDIBits(
whdc,
0, 0,
matSize.width, matSize.height,
0, 0,
mat.cols, mat.rows,
mat.data,
&bitmapinfo,
DIB_RGB_COLORS,
SRCCOPY
);
}
我对 MFC 很陌生,我真的不知道我哪里错了。 请帮我! 谢谢。
【问题讨论】:
-
为了调试它,您必须验证每个子步骤。 1)
cv::Mat src是否正确加载、添加检测或在调试器中查看其成员。 2)BITMAPINFO是否被正确初始化? 3)StretchDIBits的设置是否正确?您可以在 MSDN 或 SO 上找到有关如何通过StrechDIBits使用该结构的示例。 4) 检查StretchDIBits的返回值,可能还有GetLastError(如果API 实际使用)。 5) 任何其他 GDI 绘图调用是否适用于这些窗口值,例如您可以设置背景颜色吗?您可能需要 WM_PAINT 消息? -
作为一般规则,应始终进行渲染以响应收到
WM_PAINT消息。但是由于您已经拥有CStatic控件,因此您不需要渲染任何内容。只需构建您的图像,然后致电CStatic::SetBitmap。渲染随后由控件处理。